我们正在尝试在CLOB字段中应用子字符串函数来修剪前4000个字符。我们收到以下错误消息。
以下是我们正在使用的查询:
select
cast(substr(field_name,1,4000) as varchar(4000))
from table_name;
错误报告:
SQL错误:ORA-22835:缓冲区太小,无法进行CLOB到CHAR或BLOB到RAW的转换(实际值:8000,最大值:4000)
22835. 00000 - “缓冲区对于CLOB到CHAR或BLOB到RAW的转换太小(实际:%s,最大值:%s)”
*原因:尝试将CLOB转换为CHAR或BLOB转换为RAW,其中 LOB大小大于CHAR和RAW的缓冲区限制 类型。 请注意,如果字符长度,则以字符报告宽度 语义对列有效,否则宽度为 以字节为单位报告 *行动:执行以下操作之一 1.在执行转换之前使LOB变小, 例如,在CLOB上使用SUBSTR 2.使用DBMS_LOB.SUBSTR将CLOB转换为CHAR或BLOB转换为RAW。
答案 0 :(得分:3)
VARCHAR的限制是4000 字节而不是字符。如果您的数据库字符集是多字节字符集substr(field_name,1,4000)
将太长。 (错误消息中的8000表示每个字符使用2个字节,因此UTF16可能?)。
尝试:
select cast(substr(field_name,1,2000) as varchar(4000 byte))
from table_name;
但请注意,2000个字符可能需要超过4000个字节(这取决于您的数据库字符集和您正在编码的文本)。
答案 1 :(得分:2)
答案 2 :(得分:0)
尝试以下功能。这应该可以解决您的问题。
SELECT SUBSTR(xmltype(CLOBColumnname),4001,LENGTH(CLOBColumnname))
FROM TABLENAME;