繁体   English   中英

在Groovy中使用Clob列插入Oracle DB表时发生异常

[英]Exception while Inserting Oracle DB table with Clob column in Groovy

我正在尝试使用groovy将文件插入到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()

执行代码时,我得到以下输出。

服务更新规则

2016-12-28

2016年12月28日上午11:01:56 groovy.sql.Sql执行警告:执行失败:插入SCM_GROOVY_SCRIPTS(SCRIPT_NAME,SCRIPT_SOURCE,LAST_UPDATED)值(?,?,?),因为:ORA-01461:可以绑定长仅用于插入LONG列的值

捕获:java.sql.SQLException:ORA-01461:只能为插入到LONG列中而绑定LONG值

java.sql.SQLException:ORA-01461:只能为插入到LONG列而绑定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,则代码可以正常工作。

最后,我找到了一种插入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()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM