1

CLOB をテーブルから BLOB に変換して別のテーブルに変換しようとすると問題が発生します。基本的に、私は PLSQL 配列内でループしています。最初の呼び出しはDBMS_LOB.convertToBlob常にうまくいきますが、次の反復ではORA-22275: invalid LOB locator specified、ブロブをループ内またはループ外で初期化するかどうかに応じて、空のブロブが作成されるか、エラーが発生します。

だから、もしそうなら:

BEGIN
FOR i IN 1 .. rs.COUNT
LOOP
DBMS_LOB.createTemporary (v_blob, TRUE);
DBMS_LOB.convertToBlob (v_blob,
rs (i).v_clob,
DBMS_LOB.LOBMAXSIZE,
v_in,
v_out,
DBMS_LOB.DEFAULT_CSID,
v_lang,
v_warning);
[...]
DBMS_LOB.freeTemporary(v_blob);

最初のブロブは適切に変換されますが、他のブロブには空のブロブしか返されません。

私が行った場合:

BEGIN
DBMS_LOB.CREATETEMPORARY (v_blob, TRUE);
FOR i IN 1 .. rs.COUNT
LOOP
DBMS_LOB.convertToBlob(...);

最初のブロブもうまく変換しますがORA-22275: invalid LOB locator specified、最初の反復後にエラーが発生します。

どうすればこれを回避できますか? これについての良い説明が見つからないようです。ご協力いただきありがとうございます!

4

5 に答える 5

2

NULL価値の問題でしょう。であってはCLOBなりませんNULL。次のコードでは、3 回目のラウンドでエラーが発生します。

set serveroutput on
declare 
   TYPE rs_rec_type IS RECORD (
      v_clob clob
      );
  TYPE rs_rec_table_type IS TABLE OF rs_rec_type INDEX BY pls_integer;
  rs   rs_rec_table_type;
  v_blob    blob;
  v_in      integer := 1;
  v_out     integer := 1;
  v_lang    integer := 0;
  v_warning integer := 0;
BEGIN
  rs(1).v_clob := 'foo';
  rs(2).v_clob := 'bar';
  rs(3).v_clob := null;
  FOR i IN 1 .. rs.COUNT
  LOOP
      DBMS_LOB.createTemporary (v_blob, TRUE);
      dbms_output.put_line('i='||i);  
      DBMS_LOB.convertToBlob (v_blob,
                             rs (i).v_clob,
                             DBMS_LOB.LOBMAXSIZE,
                             v_in,
                             v_out,
                             DBMS_LOB.DEFAULT_CSID,
                             v_lang,
                             v_warning);
      dbms_output.put_line('done i='||i); 
      DBMS_LOB.freeTemporary(v_blob);     
  end loop;
end;

出力

Error report:
ORA-06502: PL/SQL: numeric or value error: invalid LOB locator specified: ORA-22275
ORA-06512: at "SYS.DBMS_LOB", line 991
ORA-06512: at line 20
06502. 00000 -  "PL/SQL: numeric or value error%s"
*Cause:    
*Action:
i=1
done i=1
i=2
done i=2
i=3
于 2013-05-28T20:21:55.013 に答える
0

ループ内で一時ブロブを使用すると、同様の問題が発生しました。毎回、in、out、lang、および warning パラメータを初期化することで解決しました。

ジェームズ。

于 2013-07-25T11:31:24.473 に答える