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 経由でクエリを呼び出しています。

「値」文字列が大きい場合、上記のクエリを実行すると、次の 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 を作成し、その一時 CLOB を setCLOB() メソッド呼び出しで使用する必要があります。

今、私はこれを動作中のシステムから切り取りましたが、その場しのぎの調整をいくつか行う必要がありました。そのため、これがあなたの状況でうまくいかないようであれば、私に知らせてください。より小さな実例を取得します。

これはもちろん、$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);

よろしく、 ドウェイン・キング

于 2008-11-04T03:44:45.603 に答える