2

Oracle バージョン 10 を使用しています。varchar2 変数を使用する PL/SQL のストアド プロシージャがあります。コードは常に varchar2 変数を追加しています。varchar2 変数のサイズが 32767 を超えると、それ以上値を追加できなくなります。データ型を long または clob (より多くの文字に対応するため) に変更したいのですが、うまくいきません。ここのコードを変更して、clob または long と同じ追加機能を持たせるにはどうすればよいですか?

サンプル追加 x:= x || 'マイデータ';

4

1 に答える 1

2

longデータ型は非推奨です。可能であれば、列を に移行するlongclobことを真剣に検討する必要があります。

で作業している場合、次のように 32k の制限を超えclobて追加できます。varchar2

declare
  l_clob clob;
begin
  dbms_lob.createtemporary(l_clob, true);
  dbms_lob.open(l_clob, dbms_lob.lob_readwrite);
  dbms_lob.writeappend(l_clob, 4, '1234');
  for i in 1..10000 loop
    dbms_lob.writeappend(l_clob, 5, '.5678');
  end loop;
  dbms_output.put_line('CLOB length: ' || length(l_clob));
  dbms_lob.close(l_clob);
  dbms_lob.freetemporary(l_clob);    end;
/

CLOB length: 50004

longconcatenate operator を使用して a に追加できますが、||既に見たように、最大​​ 32k までです。longそれを超える値を PL/SQL 内で処理する簡単な方法はありません。あなたは何かをすることができるかもしれませんがdbms_sql、テーブルの列をclob.


clob を呼び出し元に戻したい場合、それが一時的な clob である場合は、呼び出し元によって定義され、作成後に渡される必要があります。

create or replace procedure proc1 as
  l_clob clob;
begin
  dbms_lob.createtemporary(l_clob, true);

  proc2(l_clob);
  dbms_output.put_line('proc1 CLOB length: ' || length(l_clob));

  dbms_lob.freetemporary(l_clob);
end;
/

create or replace procedure proc2(p_clob in out clob) as
begin
  dbms_lob.open(p_clob, dbms_lob.lob_readwrite);
  dbms_lob.writeappend(p_clob, 5, '12345');
  for i in 1..9999 loop
    dbms_lob.writeappend(p_clob, 5, '.56789');
  end loop;
  dbms_output.put_line('proc2 CLOB length: ' || length(p_clob));
  dbms_lob.close(p_clob);
end;
/

exec procs;

proc2 CLOB length: 50000
proc1 CLOB length: 50000

そうしないと、呼び出し元に関する限り、オブジェクトは存在しません。

が存在する場合clob-たとえば、テーブルから選択されているため、呼び出しは必要ありませんcreatetemporary-それをoutパラメーターに割り当てることができますが、あなたが説明したことには当てはまらないと思います.

于 2013-06-28T07:40:13.743 に答える