« まだまだ、Dashborad de Aquarium! | トップページ | PL/SQL de Conditional Compile #2 »

2007年8月15日 (水) / Author : Hiroshi Sekiguchi.

PL/SQL de Conditional Compile #1

PL/SQLで条件付きコンパイル? 耳慣れないのも方も多いかもしれない。 C/C++では、おなじみの#ifdefなどのディレクティブ!

そう、それです! プリプロセッサといえば分かり易いでしょうか。 
Oracle10g R2以降で、正式に、PL/SQLのプリプロセッサが実装されています。(正式にと書いたのには理由があります、実は、この条件付きコンパイルは、Oracle10g R1 10.1.0.4以降、Oracle9i R2 9.2.0.6.0以降にバックポートされています。) 

マニュアルでは、 conditional compilation (条件付きコンパイル)として解説されています。

PL/SQLの条件付きコンパイル、マニュアルには記載はされているものの、この機能を解説している日本語のサイトはほとんど見た事がありませんし、実際の所、私もまだ本格的に利用したことはありません。しかし、うまく使えばそれなりの効果は期待できそうですね。

では、早速、条件付きコンパイルの例を。

● 正式に機能追加されたリリースである、Oracle10g R2で試す。

SYS> select * from v$version;

BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.2.0 - Prod
PL/SQL Release 10.2.0.2.0 - Production
CORE 10.2.0.2.0 Production
TNS for 32-bit Windows: Version 10.2.0.2.0 - Production
NLSRTL Version 10.2.0.2.0 - Production

初期化パラメータにいくつかのPL/SQLコンパイル用パラメータが追加されている。 (Oracle10g R1や、Oracle9i R2と比較するわかりやすいかも。。) 以下は、初期化パラメータの幾つかをリストしたもの。詳細はマニュアル参照のこと。
SYS> show parameter plsql

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
plsql_ccflags string
plsql_code_type string INTERPRETED
plsql_compiler_flags string INTERPRETED, NON_DEBUG
plsql_debug boolean FALSE
plsql_native_library_dir string
plsql_native_library_subdir_count integer 0
plsql_optimize_level integer 2
plsql_v2_compatibility boolean FALSE
plsql_warnings string DISABLE:ALL


● 条件付きコンパイル、PLSQL_CCFLAG初期化パラメータで独自フラグを利用する例

以下は、PLSQL_CCFLAG初期化パラメータで、DEBUGONという独自のフラグを設定し、条件付きコンパイルを行う例で、選択ディレクティブである$IF - $THENを利用してデバッグ用ログの表示コードを制御しています。

PLSQL_CCFLAGで、debugonフラグをtrueに設定すれば、DBMS_OUTPUT.PUT_LINE()でデバッグ用ログを表示するコードがコンパイルされ、false又はフラグが設定されていなければ、表示しないコードでコンパイルされます。

SCOTT> l
1 create or replace
2 FUNCTION CONDITIONAL_COMPILATION_SAMPLE
3 RETURN TIMESTAMP
4 IS
5 vNow TIMESTAMP;
6 BEGIN
7 $IF $$DEBUGON $THEN
8 DBMS_OUTPUT.ENABLE(20000);
9 DBMS_OUTPUT.PUT_LINE('======= start =====');
10 $END
11 SELECT SYSTIMESTAMP INTO vNow FROM dual;
12 $IF $$DEBUGON $THEN
13 DBMS_OUTPUT.PUT_LINE('======= end =======');
14 $END
15 RETURN vNow;
16* END CONDITIONAL_COMPILATION_SAMPLE;
17 /

ファンクションが作成されました。


● dbms_preprocessorパッケージによる条件付きコンパイル後のソースの確認

dbms_preprocessorパッケージのprint_post_processed_source()プロシージャを利用すると、条件付きコンパイル後のソースを確認することができる。(all_sourceビューには、条件付きコンパイル前のソースが格納されているため、条件付きコンパイル後のソースとは異なってしまう。)
DBMS_PREPROCESSORパッケージに関する詳細は、マニュアルを参照のこと。

SCOTT> set serveroutput on
SCOTT> exec dbms_preprocessor.print_post_processed_source('FUNCTION','SCOTT','CONDITIONAL_COMPILATION_SAMPLE');
FUNCTION CONDITIONAL_COMPILATION_SAMPLE
RETURN TIMESTAMP
IS
vNow TIMESTAMP;
BEGIN
SELECT SYSTIMESTAMP INTO vNow FROM dual;
RETURN vNow;
END CONDITIONAL_COMPILATION_SAMPLE;

PL/SQLプロシージャが正常に完了しました。

上記のコードは、PLSQL_CCFLAG初期化パラメータにdebugonフラグが未定義又は、falseで定義された場合のコードである。


● 実行してみると、デバッグ用ログは表示されていない。(当然!)

SCOTT> set serveroutput on
SCOTT> select conditional_compilation_sample from dual;

CONDITIONAL_COMPILATION_SAMPLE
---------------------------------------------------------------------------
07-08-13 18:20:39.234000000

SCOTT> set serveroutput off

● PLSQL_CCFLAG初期化パラメータに debugonフラグをtrueで設定してみると・・・。

SCOTT> 
SCOTT> alter session set plsql_ccflags='debugon:true';

セッションが変更されました。

SCOTT> l
1 create or replace
2 FUNCTION CONDITIONAL_COMPILATION_SAMPLE
3 RETURN TIMESTAMP
4 IS
5 vNow TIMESTAMP;
6 BEGIN
7 $IF $$DEBUGON $THEN
8 DBMS_OUTPUT.ENABLE(20000);
9 DBMS_OUTPUT.PUT_LINE('======= start =====');
10 $END
11 SELECT SYSTIMESTAMP INTO vNow FROM dual;
12 $IF $$DEBUGON $THEN
13 DBMS_OUTPUT.PUT_LINE('======= end =======');
14 $END
15 RETURN vNow;
16* END CONDITIONAL_COMPILATION_SAMPLE;
17 /

ファンクションが作成されました。


SCOTT> exec dbms_preprocessor.print_post_processed_source('FUNCTION','SCOTT','CONDITIONAL_COMPILATION_SAMPLE');
FUNCTION CONDITIONAL_COMPILATION_SAMPLE
RETURN TIMESTAMP
IS
vNow TIMESTAMP;
BEGIN
DBMS_OUTPUT.ENABLE(20000);
DBMS_OUTPUT.PUT_LINE('======= start =====');
SELECT SYSTIMESTAMP INTO vNow FROM dual;
DBMS_OUTPUT.PUT_LINE('======= end =======');
RETURN vNow;
END CONDITIONAL_COMPILATION_SAMPLE;

PL/SQLプロシージャが正常に完了しました。

SCOTT>
SCOTT> set serveroutput on
SCOTT> select conditional_compilation_sample from dual;

CONDITIONAL_COMPILATION_SAMPLE
---------------------------------------------------------------------------
07-08-13 18:26:13.906000000

======= start =====
======= end =======
SCOTT>
ということで、デバッグ用ログが表示されるコードでコンパイルされています!。

次回は、Oracle10g R1 10.1.0.4.0で試す予定。
Conditional_compilation_sql_develop

| |

トラックバック


この記事へのトラックバック一覧です: PL/SQL de Conditional Compile #1:

コメント

コメントを書く