从Clob中选择

时间:2019-02-27 12:55:52

标签: sql oracle

我正在尝试使用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

1 个答案:

答案 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分成可管理的大小块。