将BLOB转换为CLOB时出现数字或值错误

时间:2015-10-05 14:41:19

标签: sql oracle plsql blob clob

我有一个BLOB列,我需要它在CLOB中的内容,以便我可以使用更多的字符串函数。不幸的是我在表上只有SELECT权限,所以我无法改变它的结构。

我使用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;

1 个答案:

答案 0 :(得分:0)

问题在于

dbms_output.put_line(cRuleBLOB);

输出中单行的最大长度为32767字节。