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。
这怎么会引发错误?
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。