2016-12-28 5 views
0

groovyを使用してoracle dbテーブルにファイルを挿入しようとしています。私は次のコードを使用しています:GroovyにClob列を含むOracle DBテーブルを挿入中の例外

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日

2016年12月28日に実行groovy.sql.Sql 11時01分56秒AM WARNING:実行に失敗しました:INSERT INTO SCM_GROOVY_SCRIPTS (SCRIPT_NAMEを、 SCRIPT_SOURCE、LAST_UPDATED)VALUES(、)ため??? ORA-01461:LONG列にのみ挿入するためのLONG値を結合することができる

キャッチ:ます。java.sql.SQLException:ORA-01461は:結合することができますLONG値のみORA-01461:LONG列

ます。java.sql.SQLExceptionへの挿入のためのみ のためLONG値をバインドすることができ、私のようにCLOB引数を渡す場合は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) 

に挿入file.bytesの代わりにnullを指定すると、エラーなしですべての行が挿入されます。私のテーブルの構造は次のとおりです。

さらに、CLOBの代わりにBLOBデータ型を使用すると、コードが機能します。

+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() 
関連する問題