0

作为这个问题的后续行动,我需要以下情况的帮助:

在 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);

我正在通过 Java 应用程序中的 JDBC 调用查询。

当 "value" 字符串很大时,上面的查询会导致以下 Oracle 错误:

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

我什至设置了此处记录的“SetBigStringTryClob”属性,结果相同。

鉴于“价值”是 CLOB,是否有可能实现我想要的行为?

编辑:客户端环境是 Java

4

1 回答 1

2

你没有在你的帖子中特别提到,但从问题的标签来看,我假设你是从 Java 做的。

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

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

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

这当然假设您使用的是 Oracle Corp. 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);

问候, 道恩·金

于 2008-11-04T03:44:45.603 回答