この付録では、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のデータ型」を参照してください。 コレクションの添字の制限については、「コレクション要素の参照」を参照してください。