2016-12-28 3 views
0

Я пытаюсь вставить файл в таблицу oracle db с помощью groovy. Я использую следующий код:Исключение при установке таблицы Oracle DB с столбцом Clob в Groovy

import groovy.io.FileType 
import groovy.sql.Sql 
import oracle.jdbc.OracleDriver 

import java.sql.Date 

final def PROJECT_DIR = "/appdata/project/pmp" 
final def SCRIPT_DIR = "/scm/src/main/scripts" 

// To be able to use driver... 
new OracleDriver(); 

sql = Sql.newInstance("jdbc:oracle:thin:@localhost:1521:XE", "PMP", "pmp") 

sql.execute("delete from SCM_GROOVY_SCRIPTS") 

def dir = new File(PROJECT_DIR + SCRIPT_DIR); 
dir.eachFileRecurse(FileType.FILES) { file -> 
    String scriptName = file.name.substring(0, file.name.indexOf('.')) 
    def timestamp = new Date(System.currentTimeMillis()) 

    println scriptName 
    println timestamp 

    List<Object> params = new ArrayList<>() 
    params.add(scriptName) 
    params.add(file.bytes) 
    params.add(timestamp) 

    sql.execute("INSERT INTO SCM_GROOVY_SCRIPTS (SCRIPT_NAME, SCRIPT_SOURCE, LAST_UPDATED) VALUES (?, ?, ?)", params) 
} 

sql.close() 

Я получаю следующий вывод при выполнении кода.

ServiceUpdateRule

2016-12-28

28 декабря 2016 11:01:56 AM groovy.sql.Sql выполнить ВНИМАНИЕ: Не удалось выполнить: INSERT INTO SCM_GROOVY_SCRIPTS (SCRIPT_NAME, SCRIPT_SOURCE, LAST_UPDATED) зНАЧЕНИЕ (,,), потому что:??? ORA-01461: может связать LONG значения только для вставки в длинную колонну

Caught: java.sql.SQLException: ОР-01461: может связать LONG только для вставки в длинную колонну

java.sql.SQLException: ОР-01461: может связать LONG значения только для вставки в длинную колонну

at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:113) 
    at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:331) 
    at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:288) 
    at oracle.jdbc.driver.T4C8Oall.receive(T4C8Oall.java:754) 
    at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:219) 
    at oracle.jdbc.driver.T4CPreparedStatement.executeForRows(T4CPreparedStatement.java:972) 
    at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1192) 
    at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3415) 
    at oracle.jdbc.driver.OraclePreparedStatement.execute(OraclePreparedStatement.java:3521) 
    at InsertUpdate$_run_closure1.doCall(InsertUpdate.groovy:35) 
    at InsertUpdate.run(InsertUpdate.groovy:23) 

Если я передать аргумент как Clob null вместо file.bytes, он вставляет все строки без какой-либо ошибки. Структура моей таблицы такова:

CREATE TABLE SCM_GROOVY_SCRIPTS (
     SCRIPT_NAME VARCHAR2(255) NOT NULL, 
     SCRIPT_SOURCE CLOB, 
     LAST_UPDATED DATE DEFAULT SYSDATE , 
     PRIMARY KEY (SCRIPT_NAME) 
); 

Кроме того, код работает, если я использую тип данных BLOB вместо CLOB.

+1

«Clob» - это тип символьных данных, а не простые байты. –

ответ

0

Наконец, я нашел способ вставить тип данных CLOB.

Решение состоит в использовании классов java.sql.Clob и oracle.sql.CLOB.

import groovy.io.FileType 
import groovy.sql.Sql 
import oracle.jdbc.OracleDriver 
import oracle.sql.CLOB 

import java.sql.Clob 
import java.sql.Date 

final def PROJECT_DIR = "/appdata/project/pmp" 
final def SCRIPT_DIR = "/scm/src/main/scripts" 

// To be able to use driver... 
new OracleDriver(); 

Sql sql = Sql.newInstance("jdbc:oracle:thin:@localhost:1521:XE", "PMP", "pmp") 

sql.execute("delete from SCM_GROOVY_SCRIPTS") 

def dir = new File(PROJECT_DIR + SCRIPT_DIR); 
dir.eachFileRecurse(FileType.FILES) { file -> 
    String scriptName = file.name.substring(0, file.name.indexOf('.')) 
    def timestamp = new Date(System.currentTimeMillis()) 

    println scriptName 
    println timestamp 

    Clob clob = CLOB.createTemporary(sql.getConnection(), false, CLOB.DURATION_SESSION); 
    clob.setString(1, file.getText("UTF-8")) 

    List<Object> params = new ArrayList<>() 
    params.add(scriptName) 
    params.add(clob) 
    params.add(timestamp) 

    sql.execute("INSERT INTO SCM_GROOVY_SCRIPTS (SCRIPT_NAME, SCRIPT_SOURCE, LAST_UPDATED) VALUES (?, ?, ?)", params) 
} 

sql.close()