この付録では、PL/SQL言語によって課されるプログラム上の制限について説明します。 PL/SQLはプログラミング言語Adaをベースにしています。 したがってPL/SQLでは、ツリー構造の中間言語、DIANA(Descriptive Intermediate Attributed Notation for Ada)を使用しています。 この中間言語は、インタフェース定義言語(IDL)と呼ばれるメタ表記を使用して定義されます。 DIANAは、コンパイラなどのツールによって内部的に使用されます。
PL/SQLのソース・コードはコンパイル時にシステム・コードに変換されます。 サブプログラムまたはパッケージのDIANAおよびシステム・コードは、データベースに格納されます。 実行時にDIANAとmコードは共有メモリー・プール内にロードされます。 DIANAは依存サブプログラムのコンパイルに使用され、システム・コードはそのまま実行されます。
共有メモリー・プールの場合、パッケージ仕様部、オブジェクト型仕様部、スタンドアロン・サブプログラムまたは無名ブロックは、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パラメータの値 |
プログラム・ユニットに必要なメモリー量を見積もるときには、データ・ディクショナリ・ビューUSER_OBJECT_SIZE
を使用して問い合せることができます。 PARSED_SIZE
という列に、フラット化されたDIANAのバイト・サイズが戻ります。 次に例を示します。
SQL> SELECT * FROM user_object_size WHERE name = 'PKG1'; NAME TYPE SOURCE_SIZE PARSED_SIZE CODE_SIZE ERROR_SIZE ---------------------------------------------------------------- PKG1 PACKAGE 46 165 119 0 PKG1 PACKAGE BODY 82 0 139 0
ただし、サイズの解析結果からDIANAノードの数を見積もることはできません。 解析後のサイズが同じプログラム・ユニットが2つあり、一方に必要なDIANAノードの数が1500に対して、他方に必要なのが2000である(2番目のユニットに含まれるSQL文が複雑であるなどの理由で)場合もあるためです。
PL/SQLブロック、サブプログラム、パッケージまたはオブジェクト型のいずれかのサイズが上限を超えると、「PLS-00123:
プログラムが大きすぎます。」などのエラーとなります。 多くの場合、この問題はパッケージまたは無名ブロックで発生します。 パッケージの場合、最良の方法は複数個のより小さなパッケージに分けることです。 無名ブロックの場合、最良の方法はサブプログラムのグループとして再定義し、データベースに格納できるようにすることです。
データ型の制限の詳細は、第3章「PL/SQLのデータ型」を参照してください。 コレクションの添字の制限については、「コレクション要素の参照」を参照してください。