我正在使用oracle verion 10. 存在使用varchar2變量的PL/SQL過程。 代碼不斷追加varchar2變量。 當varchar2變量大小超過32767時,它不能附加任何更多的值。 現在我想改變數據類型爲long或clob(爲了容納更多的字符),它不起作用。 如何修改此處的代碼以使用clob或long具有相同的附加功能?在oracle中用更大的數據類型替換varchar2 SP
樣本追加 x:= x || 'MYDATA';
我正在使用oracle verion 10. 存在使用varchar2變量的PL/SQL過程。 代碼不斷追加varchar2變量。 當varchar2變量大小超過32767時,它不能附加任何更多的值。 現在我想改變數據類型爲long或clob(爲了容納更多的字符),它不起作用。 如何修改此處的代碼以使用clob或long具有相同的附加功能?在oracle中用更大的數據類型替換varchar2 SP
樣本追加 x:= x || 'MYDATA';
不推薦使用long
數據類型;如果你能,你應該認真考慮migrating your long
column to a clob
。
如果您有clob
進行工作,你可以追加過去的32K 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
,但正如你已經看到的,只有高達32k。沒有簡單的方法來處理高於PL/SQL內的long
值。您可能可以使用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
參數,但我不認爲這是對你的情況」已經描述過。
感謝@亞歷山大,很有幫助,我只是想知道如何從這個clob返回值。 – user215005
@ user215005 - 返回到哪裏,以及如何?你是否試圖從proc中插入/更新'long'列,或者將值傳遞給將執行插入/更新的客戶端? –
這是一個從另一個SP調出的SP,帶有一個出參數。因此,clob var的值需要返回到被調用的SP – user215005
'long'已被棄用很長時間(無雙關語意)時間,並且有限制。堅持'clob'。 –
@AlexPoole,我通過將數據類型更改爲clob進行測試,但沒有奏效。 – user215005
我的意思是你應該尋找'clob'解決方案,而不應該考慮'長'。我並不是說你可以像'varchar2'那樣連接。您可能需要['dbms_lob.writeappend()'](http://docs.oracle.com/cd/B19306_01/appdev.102/b14258/d_lob.htm#i999705),但目前我無法發佈更多比只有鏈接的答案... –