我正在尝试读取
BLOB
消息并将其显示为我的一个程序中的变量,但出现以下错误:
错误 - ORA-22835:缓冲区太小,无法将 CLOB 转换为 CHAR 或将 BLOB 转换为 RAW 转换(实际:9923,最大:2000)
我用谷歌搜索并找到了如下建议来修剪
BLOB
消息,但我宁愿将完整的 BLOB
消息显示为字符串。
UTL_RAW.CAST_TO_VARCHAR2(dbms_lob.substr(variable_name,2000,1))
如何显示完整的消息?数据库或过程级别上是否有我可以更改的设置?
您可以通过读取块中的
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);
对我的问题来说就像一个魅力。
尝试使用 DBMS_LOB.GETLENGTH(),而不是修剪字符串