6

BLOB フィールドで dbms_lob.substr 関数を実行しようとすると、次のエラーが発生します。

ORA-06502: PL/SQL: 数値または値のエラー: RAW変数の長さが長すぎます

ORA-06512: 1行目

私のクエリ:

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

dbms_lob.substrドキュメントによると、2番目のパラメーターの値は 32767 まで使用できるはずで、レポートのサイズは 200,000 バイトを超えているため、範囲内です。

数値をいじってみたところ、substr 関数の amount パラメーター (2 番目のパラメーター) で使用できる 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 に答える