SQL における条件付きコンパイル

条件付きコンパイルでは、コンパイル対象となる実際の SQL を判別するために使用されるコンパイラー指示を SQL に組み込むことができます。

条件付きコンパイルに使用できるコンパイラー指示として、次の 2 種類があります。
選択ディレクティブ
コード・フラグメントの選択を判別するために使用されるコンパイラー制御ステートメント。 _IF ディレクティブは、照会ディレクティブか、定数として定義されたグローバル変数を参照できます。
照会ディレクティブ
システムによって割り当てられた、または CURRENT SQL_CCFLAGS で条件付きコンパイル名前付き定数と指定された、コンパイラー名前付き定数への参照。 照会ディレクティブは、直接使用するか、選択ディレクティブ内で使用することが可能です。
これらのディレクティブは、以下のコンテキストで使用できます。
  • SQL プロシージャー定義
  • コンパイル済み SQL 関数定義
  • コンパイル済みトリガー定義
  • Oracle PL/SQL パッケージ定義
ディレクティブは、データ定義言語ステートメントでオブジェクト・タイプ (FUNCTION、PACKAGE、PACKAGE BODY、PROCEDURE、または TRIGGER) が指定された後にのみ置くことができます。

選択ディレクティブ

選択ディレクティブは IF ステートメントとよく似ていますが、条件付きコンパイルの使用を示す接頭部がキーワードにあり、終了キーワードは _END です。

構文図を読む構文図をスキップする_IFsearch-condition_THENcode-fragment _ELSEIFsearch-condition_THENcode-fragment _ELSEcode-fragment _END
search-condition
もしあれば、どの code-fragment を含めるかを決定するために評価される条件を指定します。 条件が不明または偽の場合は、条件が真になるまで、または _ELSE 節に達するまで、あるいは選択ディレクティブの終了に達するまで、次の検索条件で評価が続行されます。 検索条件には、以下のエレメントのみを含めることができます (SQLSTATE 428HV)。
  • タイプが BOOLEAN、INTEGER、または VARCHAR の定数
  • NULL 定数
  • 照会ディレクティブ
  • 定義された定数値が BOOLEAN、INTEGER、または VARCHAR タイプの単純リテラルであるグローバル定数
  • 基本述部
  • NULL 述部
  • ブール定数またはブール照会ディレクティブである述部
  • 論理演算子 (AND、OR、および NOT)
code-fragment
選択ディレクティブを置く SQL ステートメントのコンテキストに含めることができる SQL コードの一部分。 code-fragment 内に選択ディレクティブを置くことはできません (SQLSTATE 428HV)。

照会ディレクティブ

照会ディレクティブは、コンパイル環境について照会するために使用されます。 照会ディレクティブは、下線文字 2 つを接頭部とする通常 ID として SQL ステートメント内で指定されます。 実際の ID は、以下のいずれかの値を表すことになります。
  • システムによって定義されたコンパイル環境値
  • ユーザーによって定義されたデータベース・レベルまたは個別セッション・レベルのコンパイル値

システムによって定義される唯一のコンパイル環境変数が __SQL_LINE です。この環境変数は、現在コンパイル中の SQL の行番号を示します。

データベース・レベルのユーザー定義コンパイル値は、sql_ccflags データベース構成パラメーターを使用して定義できます。セッション・レベルのユーザー定義コンパイル値は、値を CURRENT SQL_CCFLAGS 特殊レジスターに割り当てることによって定義できます。

参照される照会ディレクティブが定義されていない場合は、照会ディレクティブの値を NULL 値と見なして処理が続行します。

  • 定数として定義されたグローバル変数への参照: 選択ディレクティブ内のグローバル変数 (モジュールでパブリッシュされるモジュール変数への参照にすることも可能) への参照は、コンパイル時に定数に基づいた値を提供するためのみに使用されます。 参照されるグローバル変数は、以下の要件を満たしていなければなりません。
    • 現行サーバーに存在する (SQLSTATE 42704)
    • データ・タイプが BOOLEAN、INTEGER、または VARCHAR である (SQLSTATE 428HV)
    • 単一定数値のある CONSTANT 節を使用して定義されている (SQLSTATE 428HV)
    このようなグローバル変数をグローバル定数と言います。後でグローバル定数に変更を加えても、コンパイル済みのステートメントに影響を与えることはありません。
  • 代替構文: データ・サーバー環境が PL/SQL ステートメントを実行できるようになっている場合:
    • ELSEIF の代わりに ELSIF を指定できます。
    • 条件付きコンパイルのキーワードであることを示す接頭部として、下線文字 (_) の代わりにドル記号文字 ($) を使用できます。
    • 照会ディレクティブであることを示す接頭部として、下線文字 2 つ (__) の代わりにドル記号文字 2 つ ($$) を使用できます。
    ドル記号文字接頭部は、照会ディレクティブを使用する既存の SQL ステートメントをサポートすることのみを目的としています。新しい SQL ステートメントを書く場合は使用しないことをお勧めします。

値が TRUE の DBV97 というコンパイル値に対してデータベース全体の設定を指定します。
   UPDATE DATABASE CONFIGURATION USING SQL_CCFLAGS Db2V97:TRUE
この値は、以降のこのデータベースへの接続でのデフォルトとして使用できます。
例えば、特定のセッションが現行セッション内のいくつかのルーチンの定義で使用するために最大年数コンパイル値を必要とする場合は、SET CURRENT SQL_CCFLAGS ステートメントを使用してデフォルトの SQL_CCFLAGS を拡張できます。
   BEGIN
     DECLARE CCFLAGS_LIST VARCHAR(1024);
     SET CCFLAGS_LIST = CURRENT SQL_CCFLAGS CONCAT ',max_years:50';
     SET CURRENT SQL_CCFLAGS = CCFLAGS_LIST;
   END
CCFLAGS_LIST 変数への割り当ての右辺に CURRENT SQL_CCFLAGS を使用した場合は既存の SQL_CCFLAGS 設定値が保持されるのに対し、ストリング定数の場合は追加のコンパイル値が指定されます。
以下は、CURRENT SQL_CCFLAGS の内容を使用する CREATE PROCEDURE ステートメントの例です。
   CREATE PROCEDURE CHECK_YEARS (IN YEARS_WORKED INTEGER)
   BEGIN
      _IF __Db2V97 _THEN
         IF YEARS_WORKED > __MAX_YEARS THEN
         ...
         END IF;
      _END
照会ディレクティブ __Db2V97 は、コードを含めることができるかどうかを判別するためのブール値として使用されます。 照会ディレクティブ __MAX_YEARS は、コンパイル時に定数値 50 に置き換えられます。