作为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
答案 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