レポートに表示される行のデータが長いとORA-6502が発生する、との相談がありました。Oracle APEXはデータベース・サーバーでHTMLを生成しています。その処理はPL/SQLで記述されていますが、PL/SQLのVARCHAR2の最大値が32767バイトであるため、いくつかの箇所で、32767バイトが扱えるデータの上限になっています。
クラシック・レポートと対話モード・レポートの1行の長さも、そのひとつです。
以下のようなエラーが発生します。
同じレポートでも対話グリッドは、ブラウザ側でJavaScriptのコンポーネントとして実装されていて、描画(HTMLの生成)はブラウザ側で行われています。そのため、このような制限はありません。
クラシック・レポートを例にとって、1行の長さがどのように決まるのか説明します。クラシック・レポートのテンプレートを新規に作成する、または編集するときの参考になると思います。
最初にテストに使用するデータを準備します。
表TEST_STRLENを作成し、1バイトから32767バイトまでの長さの文字列を挿入します。
create table test_strlen(str varchar2(32767));
declare
l_string varchar2(32767);
begin
for i in 1..32767
loop
l_string := l_string || mod(i,10);
insert into test_strlen values(l_string);
end loop;
end;
確認作業にはAlways FreeのAutonomous Databaseを使用しています。ADBは初期化パラメータのMAX_STRING_SIZEがEXTENDEDになっているため、VARCHAR2の最大サイズが32767バイトになっています。そうでない場合は4000バイトが上限になるため、代わりに最大サイズの制限がないCLOBを使う必要があります。
作成した表TEST_STRLENには、1バイトから32767バイトまでの長さの文字列が挿入されています。全部で32767行になります。
確認に使用するAPEXアプリケーションを作成します。
アプリケーション作成ウィザードを起動します。
アプリケーションの名前を文字数制限の確認とします。ページの追加をクリックし、クラシック・レポートのページを作成します。
追加ページを開いて、クラシック・レポートを選択します。
ページ名をレポートとし、SQL問合せとして、以下のSQLを記述します。
select str
from test_strlen
where length(str) <= :P1_MAX
order by length(str) desc
検索条件に使用しているページ・アイテムP1_MAXは、アプリケーションの作成後に追加します。
ホーム・ページは使わないので編集をクリックして、削除を実行します。レポートのページだけを含めて、アプリケーションの作成を実行します。
アプリケーションが作成されたら、ページ・デザイナでホーム・ページを開きます。リージョンレポートにページ・アイテムP1_MAXを作成します。
識別の名前をP1_MAX、タイプを数値フィールド、ラベルを最大値とします。