CLOB字段上的子字符串

时间:2013-10-18 19:33:03

标签: sql oracle clob

我们正在尝试在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。

3 个答案:

答案 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)

使用dbms_lob.substr替代方案:

dbms_lob.substr(clob_field_name, desired_size)

不需要演员。

答案 2 :(得分:0)

尝试以下功能。这应该可以解决您的问题。

SELECT SUBSTR(xmltype(CLOBColumnname),4001,LENGTH(CLOBColumnname)) 
FROM TABLENAME;