2011-10-28 11 views
4

にBLOB結果にDBMS_LOB.SUBSTRを使用すると、私は次のエラーを取得する:私はBLOBフィールドにDBMS_LOB.SUBSTR機能を実行しようとするとORA-06502

ORA-06502: PL/SQL: numeric or value error: raw variable length too long

ORA-06512: at line 1

マイクエリ:

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

dbms_lob.substr documentationによれば、2番目のパラメータの値を32767まで使用できます。レポートのサイズは200,000バイトを超えているため、範囲内です。数でプレーした後、私はSUBSTR関数に量パラメータ(第2パラメータ)で使用できるメイク値は2000

であることを

を発見した誰もがなぜ知っていますか?

答えて

2

2000オクテットの長さ制限のみSQLエンジンに適用されます。 Pl/sqlでは、32767(2^15-1)までの全範囲を利用することができます。

12c現在、2000年の長さ制限が解除されています。

ただし、12cより前では、4000を超える列サイズ(11g2の値)を許可しないsqlplusクライアントの長さ制限があります。

次のコードこのバージョンは12Cを必要としながら、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 

...:

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 
関連する問題