long
データ型は非推奨です。可能であれば、列を に移行するlong
clob
ことを真剣に検討する必要があります。
で作業している場合、次のように 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
long
concatenate 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
パラメーターに割り当てることができますが、あなたが説明したことには当てはまらないと思います.