带有过滤器长度(CLOB)的DBMS_LOB.SUBSTR导致ORA-06502

时间:2018-01-19 12:31:52

标签: oracle plsql clob

这怎么会引起错误?

select 
   DBMS_LOB.SUBSTR("CLOB-Data-Column",4000,1) as column_name 
from "Table_name"
where LENGTH("CLOB-Data-Column") <= 4000

错误是

ORA-06502: PL/SQL: numeric or value error: character string buffer too small

尝试

时没有错误
select 
   SUBSTR("CLOB-Data-Column",1, 4000) as column_name 
from "Table_name"
where LENGTH("CLOB-Data-Column") <= 4000

但这太慢了。

根据关于SO的类似主题的旧问题和Oracle文档的参考,对于DBMS_LOB.SUBSTR(),字符串长度为4000应该没问题。数字4000表示CLOB的字符数(根据Oracle引用)。如果我将过滤器的长度更改为低于2000,则查询将无错运行。

数据库列的类型为CLOB。 Oracle文档说'amount'(DBMS_LOB.SUBSTR的第一个参数):要读取的字节数(对于BLOB)或字符(对于CLOB)。

1 个答案:

答案 0 :(得分:1)

某些字符似乎是多字节字符。 DBMS_LOB.SUBSTR对字符进行计数,这些字符不符合允许的最大VARCHAR2大小,即4000。