DBMS_LOB.SUBSTR 过滤长度 (CLOB) 结果为 ORA-06502

DBMS_LOB.SUBSTR with filter on length(CLOB) results in ORA-06502

这怎么会引发错误?

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 文档参考,字符串长度 4000 应该适合 DBMS_LOB.SUBSTR()。数字 4000 表示 CLOB 的字符数(根据 Oracle 参考)。如果我将过滤器的长度更改为低于 2000,查询将 运行 没有错误。

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

有些字符似乎是多字节。 DBMS_LOB.SUBSTR 计算字符数,这些字符不适合 VARCHAR2 的最大允许大小,即 4000。