我正在尝试使用DBMS_LOB.SUBSTR()从Clob中选择数据,但出现错误
ORA-06502:PL / SQL:数字或值错误:字符串缓冲区也是如此 小
我正在使用它,因为我需要使用内部Clob中的片段来重建文件,并且我使用SUBSTR功能来构建它。
我正在使用以下内容,请注意,这适用于选择了少量数据的文件,但是当它们看起来太大时会失败:
DBMS_LOB.SUBSTR(RAW_CLOB,INSTR(RAW_CLOB,'ZPT|',INSTR(RAW_CLOB,(dbms_lob.substr(raw_clob, 4,instr(raw_clob,CHR(10))+1))||'1591018726313')+1)-INSTR(RAW_CLOB,(dbms_lob.substr(raw_clob, 4,instr(raw_clob,CHR(10))+1))||'1591018726313')-1,INSTR(RAW_CLOB,(dbms_lob.substr(raw_clob, 4,instr(raw_clob,CHR(10))+1))||'1591018726313')) file_body
当我从INSTR获取值时,它会转换为以下内容
SELECT DBMS_LOB.SUBSTR(RAW_CLOB,1000,63) file_body
仅在任何PLSQL过程之外单独运行仍然会产生错误。当我将范围缩小到下面时,我设法获得了一些结果,但这只是提供一个示例:
SELECT DBMS_LOB.SUBSTR(RAW_CLOB,4052,63) file_body
答案 0 :(得分:1)
您说过您正在PL / SQL中进行此操作,但未显示任何PL / SQL,因此其中有些是猜测。
当您选择的变量太小而无法选择时,就会发生该错误。 DBMS_LOB.SUBSTR
返回一个VARCHAR2
,在SQL中最大长度为4000个字节(默认情况下,可扩展为32767个),在PL中最大长度为32767个 bytes / SQL。我在那里强调字节,因为如果您正在使用具有AL32UTF8之类的多字节字符集的数据库来工作,这可能是相关的。
即使您未达到绝对最大限制,如果您选择的INTO
变量太小,仍然会出现该错误:
declare
v varchar2(10 char);
begin
select dbms_lob.substr( '12345678901', 11, 1 ) into v from dual;
end;
如果您要操纵较大的CLOBs
并将其分成几部分,这意味着始终要经过一个中间VARCHAR2
,则必须考虑到这一点。通常,这意味着将CLOB
分成可管理的大小块。