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

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

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

事前定義された制限なし

PLS_INTEGER値またはBINARY_INTEGER値の絶対値

-2147483648..2147483647

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

65536

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

65536

FLOAT値(2進数)の精度

126

NUMBER値(10進数)の精度

38

REAL値(2進数)の精度

63

識別子のサイズ(バイト)

128

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

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パラメータの値

トリガーのサイズ

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のデータ型」を参照してください。