2013-05-28 50 views
1

內試圖CLOB從表格轉換成團塊到另一個表時,我有一個問題。 基本上我一個循環數組PLSQL裏面,到DBMS_LOB.convertToBlob第一個電話總是效果很好,但接下來的迭代可以創建一個空的BLOB或給我一個錯誤ORA-22275: invalid LOB locator specified,這取決於我是否初始化內部或外循環我一滴。不能使用PLSQL ConvertToBlob循環

所以,如果我做的:

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); 

這將第一BLOB很好,但只返回了其他的空斑點。

如果我做的:

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

它也將第一BLOB很好,但我第一次迭代後得到ORA-22275: invalid LOB locator specified錯誤。

我怎麼能避免這種情況?我似乎無法爲此找到很好的解釋。謝謝你的幫助!

回答

2

必須是NULL值問題。 CLOB一定不能是NULL。下面的代碼給了我第三輪的錯誤。

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 
0

我在一個循環中使用臨時的斑點時,經歷了類似的問題。 我通過了,郎和警告參數每次初始化中解決它。

詹姆斯。

0

這爲我工作:

declare 
    cursor note is 
    select id, rtf_clob 
     from rtf_data 
    where rtf_clob is not null 
    for update of rtf_blob; 
    l_blob  blob; 
    l_amt   integer := dbms_lob.lobmaxsize; 
    l_dest_offset integer := 1; 
    l_src_offset integer := 1; 
    l_csid  integer := dbms_lob.default_csid; 
    l_ctx   integer := dbms_lob.default_lang_ctx; 
    l_warn  integer; 

begin 
    for note_rec in note loop 
    l_blob  := null; 
    l_amt   := dbms_lob.lobmaxsize; 
    l_dest_offset := 1; 
    l_src_offset := 1; 
    l_csid  := dbms_lob.default_csid; 
    l_ctx   := dbms_lob.default_lang_ctx; 
    l_warn  := null; 
    dbms_lob.createTemporary(l_blob, true); 
    dbms_lob.convertToBlob(l_blob, 
          note_rec.rtf_clob, 
          l_amt, 
          l_dest_offset, 
          l_src_offset, 
          l_csid, 
          l_ctx, 
          l_warn); 

    update rtf_data 
     set rtf_blob = l_blob 
    where note_rec.id = id; 

    dbms_lob.freeTemporary(l_blob); 
    end loop; 
end; 
/

沒有重新初始化循環內的變量,只有第一個記錄創建一個blob。