【问题标题】:Numeric or value error when converting BLOB to CLOB将 BLOB 转换为 CLOB 时出现数字或值错误
【发布时间】:2016-01-02 06:31:53
【问题描述】:

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

我使用DBMS_LOB 包,它适用于相对较小的 BLOBS。例如,长度为 30.000 的 BLOB 可以,但长度为 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;

【问题讨论】:

    标签: sql oracle plsql blob clob


    【解决方案1】:

    问题出在

    dbms_output.put_line(cRuleBLOB);
    

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

    【讨论】:

    • 谢谢!!现在很明显......我对文档中的 LINE 限制感到困惑:“行长度溢出,每行限制为 32767 个字节”,我永远不会猜到它适用于整个 CLOB
    猜你喜欢
    • 1970-01-01
    • 2012-10-02
    • 1970-01-01
    • 2021-08-04
    • 2018-07-15
    • 1970-01-01
    • 2015-10-21
    • 1970-01-01
    • 2020-12-10
    相关资源
    最近更新 更多