2015-10-05 63 views
0

我有一個BLOB列,我需要它在CLOB中的內容,以便我可以使用更多的字符串函數。不幸的是,我只有SELECT特權在桌子上,所以我不能改變它的結構。將BLOB轉換爲CLOB時出現數字或值錯誤

我使用DBMS_LOB包,它可以在相對較小的BLOBS下正常工作。例如,對於BLOB 30.000長度是可以的,但具有40.000長BLOB我得到

ORA-06502:PL/SQL:數字或值錯誤%s。

這讓我懷疑某處是否涉及VARCHAR2轉換,但我無法弄清楚,因爲我沒有VARCHAR2變量。

我最長的BLOB是63.000個字符長。

使用下面的這個方法,我設法將53行中的50個轉換。 (其餘3則大於30,000字符。)

任何幫助,將不勝感激。

在此先感謝。

SET serveroutput ON; 

DECLARE 
    sRuleName [column]%type; 
    bRuleBLOB BLOB; 
    cRuleBLOB CLOB; 

    v_file_size number := dbms_lob.lobmaxsize; 
    v_dest_offset number := 1; 
    v_src_offset number := 1; 
    v_blob_csid number := dbms_lob.default_csid; 
    v_lang_context number := dbms_lob.default_lang_ctx; 
    v_warning number; 

    CURSOR cRules IS 
    SELECT [column] 
    FROM [table] 
    WHERE [column] IN ('x','y','z') 
    ORDER BY [column]; 
BEGIN 
    dbms_output.enable(100000); 
    OPEN cRules; 
    LOOP 
    FETCH cRules INTO sRuleName; 
    EXIT WHEN cRules%NOTFOUND; 
    --dbms_output.put_line(sRuleName); 

    SELECT rule 
    INTO bRuleBLOB 
    FROM [table] 
    WHERE [column] = sRuleName; 

    dbms_lob.createtemporary(cRuleBLOB, true); 

    v_dest_offset := 1; 
    v_src_offset := 1; 

    dbms_lob.converttoclob(cRuleBLOB, bRuleBLOB, v_file_size, v_dest_offset, v_src_offset, v_blob_csid, v_lang_context, v_warning); 

    dbms_output.put_line(cRuleBLOB); 
    dbms_lob.freetemporary(cRuleBLOB); 
    END LOOP; 
    CLOSE cRules; 
END; 

回答

0

的問題是在輸出一行的

dbms_output.put_line(cRuleBLOB); 

最大長度爲32767個字節。

+0

謝謝!現在很明顯....我被文檔中的LINE限制弄糊塗了:「行長度溢出,每行限制32767字節」,我從來沒有猜到它會用於整個CLOB –

相關問題