この付録では、PL/SQL言語によって課されるプログラム上の制限について説明します。PL/SQLはプログラミング言語Adaをベースにしています。したがって、PL/SQLでは、ツリー構造の中間言語Descriptive Intermediate Attributed Notation for Ada(DIANA)を使用しています。この中間言語は、インタフェース定義言語(IDL)と呼ばれるメタ表記を使用して定義されます。DIANAは、コンパイラなどのツールによって内部的に使用されます。
PL/SQLのソース・テキストはコンパイル時にシステム・コードに変換されます。サブプログラムまたはパッケージのDIANAおよびシステム・コードは、データベースに格納されます。実行時、それらは共有メモリー・プール内にロードされます。DIANAは依存サブプログラムのコンパイルに使用され、システム・コードはそのまま実行されます。
共有メモリー・プールの場合、パッケージ仕様部、ADT仕様部、スタンドアロン・サブプログラムまたは無名ブロックは、67108864(2**26)個のDIANAノードに制限されています(ノードは、識別子、キーワード、演算子などのトークンに対応します)。PL/SQLコンパイラによる制限を超えないかぎり、6,000,000行以下のコードが許されます(PL/SQLコンパイラによる一部の制限を表C-1に示します)。
表C-1 PL/SQLコンパイラの制限
項目 | 制限 |
---|---|
プログラム・ユニットに渡されるバインド変数 |
32768 |
プログラム・ユニット内の例外ハンドラ |
65536 |
レコード内のフィールド |
65536 |
ブロック・ネストのレベル |
255 |
レコード・ネストのレベル |
32 |
副問合せネストのレベル |
254 |
ラベル・ネストのレベル |
98 |
ネストしたコレクションのレベル |
事前定義された制限なし |
|
-2147483648..2147483647 |
明示カーソル、ファンクション、プロシージャでの仮パラメータの数 |
65536 |
プログラム・ユニットから参照されるオブジェクト |
65536 |
|
126 |
|
38 |
|
63 |
識別子のサイズ(文字) |
30 |
文字列リテラルのサイズ(バイト) |
32767 |
|
32767 |
|
32760 |
|
32760 |
|
32767 |
|
32767 |
|
32767 |
|
32767 |
|
4G×DB_BLOCK_SIZEパラメータの値 |
|
4G×DB_BLOCK_SIZEパラメータの値 |
|
4G×DB_BLOCK_SIZEパラメータの値 |
|
4G×DB_BLOCK_SIZEパラメータの値 |
トリガーのサイズ |
32K |
プログラム・ユニットに必要なメモリー量を見積もるときには、データ・ディクショナリ・ビューUSER_OBJECT_SIZE
を使用して静的データを問い合せることができます。PARSED_SIZE
という列に、フラット化されたDIANAのバイト・サイズが戻ります。次に例を示します。
CREATE OR REPLACE PACKAGE pkg1 AS TYPE numset_t IS TABLE OF NUMBER; FUNCTION f1(x NUMBER) RETURN numset_t PIPELINED; END pkg1; / CREATE PACKAGE BODY pkg1 AS -- FUNCTION f1 returns a collection of elements (1,2,3,... x) FUNCTION f1(x NUMBER) RETURN numset_t PIPELINED IS BEGIN FOR i IN 1..x LOOP PIPE ROW(i); END LOOP; RETURN; END f1; END pkg1; /
次の問合せの結果を書式設定するためのSQL*Plusコマンド:
COLUMN name FORMAT A4 COLUMN type FORMAT A12 COLUMN source_size FORMAT 999 COLUMN parsed_size FORMAT 999 COLUMN code_size FORMAT 999 COLUMN error_size FORMAT 999
問合せ:
SELECT * FROM user_object_size WHERE name = 'PKG1' ORDER BY type;
結果:
NAME TYPE SOURCE_SIZE PARSED_SIZE CODE_SIZE ERROR_SIZE ---- ------------ ----------- ----------- --------- ---------- PKG1 PACKAGE 112 498 310 79 PKG1 PACKAGE BODY 233 106 334 0
ただし、サイズの解析結果からDIANAノードの数を見積もることはできません。解析後のサイズが同じプログラム・ユニットが2つあり、一方に必要なDIANAノードの数が1500に対して、他方に必要なのが2000である(2番目のユニットに含まれるSQL文が複雑であるなどの理由で)場合もあるためです。
PL/SQLブロック、サブプログラム、パッケージまたはスキーマ・レベルのユーザー定義型のいずれかのサイズが上限を超えると、「PLS-00123:
プログラムが大きすぎます。
」などのエラーとなります。多くの場合、この問題はパッケージまたは無名ブロックで発生します。パッケージの場合、最良の方法は複数個のより小さなパッケージに分けることです。無名ブロックの場合、最良の方法はサブプログラムのグループとして再定義し、データベースに格納できるようにすることです。
データ型の制限の詳細は、「PL/SQLのデータ型」を参照してください。