| Oracle Database PL/SQLユーザーズ・ガイドおよびリファレンス 10g リリース2(10.2) B19257-01 |
|
この付録では、PL/SQL言語によって課されるプログラム上の制限について説明します。PL/SQLはプログラミング言語Adaをベースにしています。したがってPL/SQLでは、ツリー構造の中間言語、DIANA(Descriptive Intermediate Attributed Notation for Ada)を使用しています。この中間言語は、インタフェース定義言語(IDL)と呼ばれるメタ表記を使用して定義されます。DIANAは、コンパイラなどのツールによって内部的に使用されます。
PL/SQLのソース・コードはコンパイル時に機械可読のmコードに変換されます。1つのプロシージャまたはパッケージに対応するDIANAおよびmコードの両方がデータベースに格納されます。実行時にDIANAとmコードは共有メモリー・プール内にロードされます。DIANAは依存プロシージャのコンパイルに使用され、mコードはそのまま実行されます。
共有メモリー・プールの場合、パッケージ仕様部、オブジェクト型仕様部、スタンドアロン・サブプログラムまたは無名ブロックは、67108864(2**26)個のDIANAノードに制限されています。ノードは、識別子、キーワード、演算子などのトークンに対応します。PL/SQLコンパイラによる制限を超えないかぎり、6,000,000行以下のコードが許されます。PL/SQLコンパイラによる一部の制限を表C-1に示します。
プログラム・ユニットに必要なメモリー量を見積もるときには、データ・ディクショナリ・ビュー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のデータ型」を参照してください。コレクションの添字の制限については、「コレクション要素の参照」を参照してください。
|
![]() Copyright © 2005 Oracle Corporation. All Rights Reserved. |
|