2013-06-27 63 views
1

我正在使用oracle verion 10. 存在使用varchar2變量的PL/SQL過程。 代碼不斷追加varchar2變量。 當varchar2變量大小超過32767時,它不能附加任何更多的值。 現在我想改變數據類型爲long或clob(爲了容納更多的字符),它不起作用。 如何修改此處的代碼以使用clob或long具有相同的附加功能?在oracle中用更大的數據類型替換varchar2 SP

樣本追加 x:= x || 'MYDATA';

+1

'long'已被棄用很長時間(無雙關語意)時間,並且有限制。堅持'clob'。 –

+0

@AlexPoole,我通過將數據類型更改爲clob進行測試,但沒有奏效。 – user215005

+0

我的意思是你應該尋找'clob'解決方案,而不應該考慮'長'。我並不是說你可以像'varchar2'那樣連接。您可能需要['dbms_lob.writeappend()'](http://docs.oracle.com/cd/B19306_01/appdev.102/b14258/d_lob.htm#i999705),但目前我無法發佈更多比只有鏈接的答案... –

回答

1

不推薦使用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參數,但我不認爲這是對你的情況」已經描述過。

+0

感謝@亞歷山大,很有幫助,我只是想知道如何從這個clob返回值。 – user215005

+0

@ user215005 - 返回到哪裏,以及如何?你是否試圖從proc中插入/更新'long'列,或者將值傳遞給將執行插入/更新的客戶端? –

+0

這是一個從另一個SP調出的SP,帶有一個出參數。因此,clob var的值需要返回到被調用的SP – user215005

相關問題