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