Oracle单表常量使用JDBC与CLOB合并

时间:2008-11-03 20:34:02

标签: oracle jdbc merge clob ora-01461

作为this question的后续行动,我需要以下方案的帮助:

在Oracle中,给出一个简单的数据表:

create table data (
    id       VARCHAR2(255),
    key      VARCHAR2(255),
    value    CLOB);

我正在使用以下合并命令:

merge into data
using (
    select
        ? id,
        ? key,
        ? value
    from
        dual
) val on (
    data.id=val.id
    and data.key=val.key
)
when matched then 
    update set data.value = val.value 
when not matched then 
    insert (id, key, value) values (val.id, val.key, val.value);

我通过JDBC从Java应用程序调用查询。

当“value”字符串很大时,上述查询会导致以下Oracle错误:

ORA-01461: cannot bind a LONG value for insert into a long column

我甚至将“SetBigStringTryClob”属性设置为文档here,结果相同。

如果“value”是CLOB,是否有可能实现我想要的行为?

编辑:客户端环境是Java

1 个答案:

答案 0 :(得分:2)

你的帖子中没有具体提到,但从问题的标签判断,我假设你是用Java做的。

我刚刚完成的项目中已经成功使用了这样的代码。此应用程序使用Unicode,因此如果您的问题域仅限于标准ASCII字符集,则可能会有更简单的解决方案。

您目前正在使用OracleStatement.setCLOB()方法吗?这是一个非常尴尬的事情,但我们无法以任何其他方式绕过它。您必须实际创建一个临时CLOB,然后在setCLOB()方法调用中使用该临时CLOB。

现在,我已经从一个正常工作的系统中删除了这个,并且必须进行一些临时调整,所以如果这似乎不适用于你的情况,请告诉我,我会回去看看如果我能得到一个较小的工作实例。

这当然假设您正在使用$ ORACLE_HOME / jdbc / lib中的Oracle Corp. JDBC驱动程序(ojdbc14.jar或ojdbc5.jar)

CLOB tempClob = CLOB.createTemporary(conn, true, CLOB.DURATION_SESSION);


// Open the temporary CLOB in readwrite mode to enable writing
tempClob.open(CLOB.MODE_READWRITE);

// Get the output stream to write
Writer tempClobWriter = tempClob.getCharacterOutputStream();

// Write the data into the temporary CLOB
tempClobWriter.write(stringData);

// Flush and close the stream
tempClobWriter.flush();
tempClobWriter.close();

// Close the temporary CLOB
tempClob.close();

myStatement.setCLOB(column.order, tempClob);

此致 Dwayne King