错误 - ORA-22835:缓冲区太小,无法进行 CLOB 到 CHAR 或 BLOB 到 RAW 的转换

问题描述 投票:0回答:3

我正在尝试读取

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
3个回答
2
投票

您可以通过读取块中的

BLOB
值来解决缓冲区问题。为此,您可以定义一个用户定义函数 (UDF) 如此处建议。以下 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);

对我的问题来说就像一个魅力。



1
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.