在BLOB上使用DBMS_LOB.SUBSTR导致ORA-06502

时间:2011-10-28 17:09:40

标签: oracle oracle11g ora-06502

当我尝试在BLOB字段上运行dbms_lob.substr函数时,出现以下错误:

  

ORA-06502:PL / SQL:数字或值错误:原始变量长度太长

     

ORA-06512:第1行

我的查询:

select dbms_lob.substr(my_report, 10000, 1) 
from my_table where my_table.report_id = :myid

根据dbms_lob.substr documentation,我应该能够在第二个参数中使用一个值达32767,并且报告的大小超过200,000个字节,因此它在该范围内。

在使用数字后,我发现我可以在量参数(第二个参数)中使用的subs值为substr函数的值。

有谁知道为什么?

2 个答案:

答案 0 :(得分:6)

该函数将结果作为RAW数据类型返回,RAW数据类型的最大大小为2000字节。

参考文献:

http://download.oracle.com/docs/cd/B10501_01/server.920/a96540/sql_elements2a.htm#SQLRF0021

http://dbaforums.org/oracle/index.php?showtopic=8445

答案 1 :(得分:2)

2000个八位字节的长度限制仅适用于sql引擎。在Pl / sql中,您可以利用长度为32767(2 ^ 15-1)的整个范围。

截至12c,已取消2000年的长度限制。

但是,在12c之前,sqlplus客户端存在长度限制,不允许列大小超过4000(11g2的值)。

以下代码适用于11g2及更高版本

var myid number;
exec :myid := 1234; -- whatever

DECLARE
    l_r   RAW(32767);
BEGIN
    select dbms_lob.substr ( my_report, 2000, 1 ) head
      into l_r
      from my_table
     where my_table.report_id = :myid  
       ;

  l_r := UTL_RAW.COPIES ( l_r, 10 );
  dbms_output.put_line ( 'id ' || :myid || ', len(l_r) = ' || utl_raw.length(l_r));
END;
/
show errors 

......虽然此版本需要12c:

var myid number;
exec :myid := 1234; -- whatever

DECLARE
    l_r   RAW(32767);
BEGIN
    select dbms_lob.substr ( my_report, 32767, 1 ) head
      into l_r
      from my_table
     where my_table.report_id = :myid  
       ;

  dbms_output.put_line ( 'id ' || :myid || ', len(l_r) = ' || utl_raw.length(l_r));
END;
/
show errors