4

私のストアド関数は、次を使用して一時的なLOBインスタンスを作成します。Dbms_Lob.CreateTemporary(BUFFER, TRUE, Dbms_Lob.SESSION);ここBUFFERで、はローカルCLOB変数です。その後、関数はBUFFERいくつかのデータを入力して返します。

Dbms_Lob.CreateTemporary私の場合の期間パラメータはですが、オラクルのドキュメントDbms_Lob.SESSIONによると:

dbms_lob.createtemporary()に渡されるdurationパラメーターはヒントです。新しい一時LOBの期間は、PL/SQLのロケータ変数の期間と同じです。たとえば、前のプログラムブロックでは、プログラム変数aは常駐フレームの期間を持っています。したがって、ブロックの終わりに、関数の終わりにaのメモリが解放されます。

そのBUFFER CLOBため、機能ブロックを離れた後、Oracleによって破棄される可能性があります。場合によっては、BUFFERが32Kを超えると、Java(JDBC)側からこの方法で返された値を読み取ることができないことがわかります。

関数から一時的なCLOBインスタンスを返す他の方法はありますか?

4

2 に答える 2

4

コメントであなたは言った:

clob.getSubString(0, clob.length())スロー:java.sql.SQLException: Invalid argument(s) in call at oracle.sql.CLOB.getSubString(CLOB.java:236)whileclob.length() は私のclobの実際の長さを返します

のドキュメントには次のようにgetSubString記載されています。

pos-抽出される部分文字列の最初の文字。最初の文字は位置1にあります。

CLOBを生成して返す単純な関数を使用すると、JDBC(ojdbc5または)を介して、またはojdbc6を使用しても問題なく取得できます。しかし、私が取得したを使用して割り当てようとするとgetCLOB()getString()Oracle.sql.CLOBgetCLOBString

String x = getSubString(0, clob.length());

その後、Invalid argument(s) in callエラーも発生します。これを次のように変更するだけです。

String x = getSubString(1, clob.length());

動作します。したがって、関数内の一時的な割り当てやCLOBサイズとは何の関係もないようです。小さいCLOBで問題が発生しなかった理由がわかりません。おそらく、小さいCLOBの場合、ロジックがこれにヒットしなかったのでしょうか。

その間、あなたはこれを回避したclob.getCharacterStream().read()ので、これは今は少し無関係かもしれません。

于 2013-01-30T13:01:23.047 に答える
3

ランダムに生成されたデータを使用して、clobを返す関数を作成しました。長さは200k文字です。

create function f_clob
return clob is
   l_clob      CLOB := EMPTY_CLOB;
   l_len       BINARY_INTEGER;
   l_content   VARCHAR2(32000);
BEGIN
   dbms_lob.createtemporary(l_clob, TRUE);
   dbms_lob.open(l_clob, dbms_lob.lob_readwrite);
   --
   for i in 1..100
   loop
      l_content := dbms_random.string('A', 2000);
      l_len := length(l_content);
      dbms_lob.writeappend(l_clob, l_len, l_content);
   end loop;
   dbms_lob.close(l_clob);
   --
   return l_clob;
end f_clob;

次に、関数を呼び出します。

select to_char(substr(f_clob, 1, 200)) clob_chunk
from  (
   select 1
   from dual
   union
   select 2
   from dual)

その結果、私は常にデータを取得します。なぜあなたの関数はデータを返さないのだろうか。

于 2013-01-30T11:34:02.357 に答える