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

使用JDBC将Oracle单表常量与CLOB合并,oracle,jdbc,merge,clob,ora-01461,Oracle,Jdbc,Merge,Clob,Ora 01461,作为后续行动,我需要以下场景的帮助: 在Oracle中,给定一个简单的数据表: create table data ( id VARCHAR2(255), key VARCHAR2(255), value CLOB); 我正在使用以下合并命令: merge into data using ( select ? id, ? key, ? value from dua

作为后续行动,我需要以下场景的帮助:

在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”属性,如文档中所述,并得到了相同的结果

考虑到“值”是CLOB,有可能实现我想要的行为吗


编辑:客户端环境是Java

您在文章中没有特别提到,但从问题的标签判断,我假设您是从Java来做这件事的

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

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

现在,我已经从一个工作系统中删除了它,并且不得不做一些特别的调整,所以如果在你的情况下,这似乎不起作用,请告诉我,我会回去看看是否可以得到一个较小的工作示例

当然,这假设您使用的是Oracle公司的JDBC驱动程序(ojdbc14.jar或ojdbc5.jar),它们位于$Oracle_HOME/JDBC/lib中

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);
问候,,
德韦恩·金

Ahhh…创建一个临时CLOB。有趣。让我试用一下,我会告诉您它是否与我的“merge”语句配合得很好。使用此解决方案时,我遇到了一个错误:
ORA-22922:不存在LOB值
。我的案例描述如下:。如果你能帮忙,请告诉我。你能告诉我你是如何解决这个问题的吗?我在这里描述了一个非常类似的例子: