ヘッダーをスキップ
Oracle Database PL/SQL言語リファレンス
11g リリース1(11.1)
E05670-03
  目次
目次
索引
索引

戻る
戻る
 
次へ
次へ
 

C PL/SQLのプログラム上の制限

この付録では、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

ネストしたコレクションのレベル

事前定義された制限なし

PLS_INTEGER値またはBINARY_INTEGER値の絶対値

-2147483648..2147483647

明示カーソル、ファンクション、プロシージャでの仮パラメータの数

65536

プログラム・ユニットから参照されるオブジェクト

65536

FLOAT値(2進数)の精度

126

NUMBER値(10進数)の精度

38

REAL値(2進数)の精度

63

識別子のサイズ(文字)

30

文字列リテラルのサイズ(バイト)

32767

CHAR値(バイト)のサイズ

32767

LONG値(バイト)のサイズ

32760

LONG RAW値(バイト)のサイズ

32760

RAW値(バイト)のサイズ

32767

VARCHAR2値(バイト)のサイズ

32767

NCHAR値(バイト)のサイズ

32767

NVARCHAR2値(バイト)のサイズ

32767

BFILE値(バイト)のサイズ

4G×DB_BLOCK_SIZEパラメータの値

BLOB値(バイト)のサイズ

4G×DB_BLOCK_SIZEパラメータの値

CLOB値(バイト)のサイズ

4G×DB_BLOCK_SIZEパラメータの値

NCLOB値(バイト)のサイズ

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