【问题标题】:Error- ORA-22835: Buffer too small for CLOB to CHAR or BLOB to RAW conversion错误 - ORA-22835:缓冲区太小,无法进行 CLOB 到 CHAR 或 BLOB 到 RAW 的转换
【发布时间】:2014-10-20 13:03:06
【问题描述】:

我正在尝试读取BLOB 消息并将其显示为我的一个程序中的变量,但收到以下错误:

错误 - ORA-22835:对于 CLOB 到 CHAR 或 BLOB 到 RAW 的缓冲区太小 转换(实际:9923,最大值:2000)

我在谷歌上搜索并找到了一个建议来修剪BLOB 消息,如下所示,但我宁愿将完整的BLOB 消息显示为字符串。

UTL_RAW.CAST_TO_VARCHAR2(dbms_lob.substr(variable_name,2000,1)) 

如何显示完整的消息?我可以更改数据库或过程级别的设置吗?

【问题讨论】:

    标签: sql oracle stored-procedures blob clob


    【解决方案1】:

    我通过使用

    中描述的选项完成了这项工作

    http://www.dba-oracle.com/t_convert_blob_varchar_datatype.htm

    【讨论】:

    • 能解释一下如何插入吗?
    【解决方案2】:

    尝试使用 DBMS_LOB.GETLENGTH(),而不是修剪字符串

    【讨论】:

      【解决方案3】:

      您可以通过读取块中的BLOB 值来解决缓冲区问题。为此,您可以定义用户定义函数 (UDF) as suggested here。以下 UDF 一次读取一个块 BLOB 字段,将其转换为 VARCHAR2 并连续附加结果以将结果作为 CLOB 返回:

      CREATE OR REPLACE FUNCTION VC2CLOB_FROM_BLOB(B BLOB)
      RETURN CLOB IS
          c CLOB;
          n NUMBER;
      BEGIN
          IF (b IS NULL) THEN 
              RETURN NULL;
          END IF;
          IF (LENGTH(b) = 0) THEN
              RETURN EMPTY_CLOB();
          END IF;
          DBMS_LOB.CREATETEMPORARY(c, TRUE);
          n := 1;
          WHILE (n + 32767 <= LENGTH(b)) LOOP
              DBMS_LOB.WRITEAPPEND(c, 32767, UTL_RAW.CAST_TO_VARCHAR2(DBMS_LOB.SUBSTR(b, 32767, n)));
              n := n + 32767;
          END LOOP;
          DBMS_LOB.WRITEAPPEND(c, LENGTH(b) - n + 1, UTL_RAW.CAST_TO_VARCHAR2(DBMS_LOB.SUBSTR(b, LENGTH(b) - n + 1, n)));
          RETURN c;
      END;
      /
      

      定义好之后,就可以这么简单的调用了:

      SELECT VC2CLOB_FROM_BLOB(variable_name);
      

      对我的问题很有帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-10-01
        • 1970-01-01
        • 2022-01-02
        • 2015-10-21
        • 2011-11-25
        • 2011-03-31
        • 2013-09-14
        相关资源
        最近更新 更多