e-learning、オラクル研修、LMS(学習管理システム)のiStudy

e-learning、オラクル研修、LMS(学習管理システム)のiStudy

第98回 「条件付きコンパイル(その2)」

2014.05.29

こんにちは。インストラクターの蓑島です。

前回に引き続き今回も条件付きコンパイルの解説です。

前回紹介したように、条件付きコンパイルとは、条件によってコンパイルするコードを変更できる機能です。
そしてその条件に使えるものが2通りあり、一つは「パッケージの定数」、そしてもう一つは「データベースの初期化パラメータPLSQL_CCFLAGSで設定したフラグ」です。
前回は「パッケージの定数」を条件に使うケースをご紹介し実際にコーディングもしましたが、今回は後者の「データベースの初期化パラメータPLSQL_CCFLAGSで設定したフラグ」を条件に使うケースについて簡単に解説します。

まず、PLSQL_CCFLAGSパラメータにコンパイラが参照するフラグを設定します。フラグ名は任意で自由に設定できます。その値はブール値(TRUEまたはFALSE)か、数値です。また、このパラメータはセッションレベルで設定できますので、必要なときに必要なセッションでのみ、設定可能です。
以下の例をご覧ください。

SQL> SHOW USER
ユーザーは"SCOTT"です。

1
2
3
ALTER SESSION SET PLSQL_CCFLAGS= 'FLAG1:TRUE,FLAG2:FALSE' ;
 
セッションが変更されました。

上記の例は、SCOTTユーザがセッションレベルでPLSQL_CCFLAGSパラメータをセットしたものです。
そしてこのパラメータにセットしたフラグとその値は、以下のとおりです。
フラグ名 FLAG1 その値 TRUE
フラグ名 FLAG2 その値 FALSE

つまり、PLSQL_CCFLAGSパラメータは、以下の形式でフラグ名と値をセットするわけです。
フラグ名1:値1,フラグ名2:値2,・・・・

では早速、このようなフラグを条件付きコンパイルの中でどのように参照するのか確認しましょう。
以下の例をご覧ください。

1
2
3
4
5
6
7
8
9
10
11
12
CREATE OR REPLACE PROCEDURE PROC98
IS
BEGIN
   $IF  $$FLAG1  $ THEN
        DBMS_OUTPUT.PUT_LINE( 'FLAG1はTRUEです' );
   $ ELSE
        DBMS_OUTPUT.PUT_LINE( 'FLAG1はTRUEではありません' );
   $ END
END ;
/
 
プロシージャが作成されました。

このPROC98プロシージャの条件付きコンパイルの部分は、4行目から、8行目の範囲です。
つまり、$IFから、$ENDまでの範囲です。
この中で、注目していただきたいのは、4行目の 「$$FLAG1」という記述です。この部分の記述は「$」が2個連続しています。
条件付きコンパイルのIF文のキーワードは、普通は「$」が1個です。「$IF」、「$ELSE」、「$THEN」、「$ELSE」、「$END」のように、「$」が1個です。
しかし「$$FLAG1」だけ、「$」が2個連続しています。
このように、「$」が2個連続するキーワードは、「問い合わせディレクティブ」といいます。
そしてそれは、PLSQL_CCFLAGSパラメータにセットしたフラグを表しています。
いわば『この値は、PLSQL_CCFLAGSパラメータを問い合わせて確認してください』と、コンパイラに対して指示(ディレクティブ)しているわけです。

そうすると「$$FLAG1」の値はTRUEですね。
よって、上記のコードは、「$THEN」以下の「DBMS_OUTPUT.PUT_LINE('FLAG1はTRUEです');」というコードがコンパイルされるわけです。
実際に実行して試してみましょう。

SQL> SET SERVEROUTPUT ON -- 画面出力を有効にして

1
2
3
4
5
6
7
BEGIN
    PROC98;    -- 実行する
END ;
/
FLAG1は TRUE です                     --  ←プロシージャの画面出力
 
PL/SQLプロシージャが正常に完了しました。

このように、結果はその通りの結果となりました。

では、このプロシージャが実際にどのようなコードでコンパイルされたのかも確認します。
条件付きコンパイルで実際にコンパイルされたコードを確認する手順は前回もご紹介していますが以下の通りです。

SQL> SHOW USER
ユーザーは"SYSTEM"です。 -- 管理者ユーザで
SQL> SET SERVEROUTPUT ON -- 画面出力を有効にして

1
2
3
4
5
6
7
8
9
10
11
12
13
BEGIN
   DBMS_PREPROCESSOR.PRINT_POST_PROCESSED_SOURCE   -- プロシージャコール
    ( 'PROCEDURE' , 'SCOTT' , 'PROC98' );
END ;
/
---- 以下は、上記のプロシージャコースの結果としての画面出力です。
PROCEDURE PROC98
IS
BEGIN
DBMS_OUTPUT.PUT_LINE( 'FLAG1はTRUEです'   );
END ;
 
PL/SQLプロシージャが正常に完了しました。

ご覧のように、「DBMS_OUTPUT.PUT_LINE('FLAG1はTRUEです' );」のコードでコンパイルされたことがわかります。

このように、条件付きコンパイルで可能な条件に、パッケージ定数の他、PLSQL_CCFLAGSパラメータにセットしたフラグも使用できるわけです。

それでは、今回はここまでにいたします。また次回、ご期待ください。

先頭へ戻る