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データ型を使用すると、コードが機能します。
'Clob'はプレーンバイトではなく文字データ型です。 –