6

当我尝试在 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文档,我应该可以在第二个参数中使用一个值,最大为 32767,并且报告的大小超过 200,000 字节,因此在范围内。

玩过这个数字后,发现可以在substr函数的amount参数(第二个参数)中使用的make值是2000。

有谁知道为什么?

4

2 回答 2

7

该函数将结果作为 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

于 2011-10-28T17:12:46.250 回答
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 
于 2015-10-28T22:04:09.350 回答