2024年9月30日月曜日

コマンドラインからAPEXのPL/SQL APIを呼び出すスクリプトの実行時トレースを取得する

Oracle APEXのPL/SQL APIを呼び出すスクリプトの実行時トレースを、画面に表示する方法を紹介します。

APEXのPL/SQL APIを含むスクリプトとして、APEXアプリケーションのインストール・スクリプトを例として使用します。

空のAPEXアプリケーションを作成します。空のAPEXアプリケーションのエクスポートだと、これといった実行時トレースが生成されないため、サポートするオブジェクトとしてインストール・スクリプトを作成します。

サポートするオブジェクトを開きます。


インストールするスクリプトを作成します。


作成をクリックします。


簡単なテストを作るだけなので、最初から作成を選びます。


名前testとし、エディタの使用チェックを入れます。

へ進みます。


スクリプト・エディタが開きます。以下の簡単なSQLスクリプトを記述します。
declare
    l_empno emp.empno%type;
begin
    select empno into l_empno from emp where ename = 'SCOTT';
end;
作成をクリックします。


インストール・スクリプトが作成されました。


アプリケーションをエクスポートします。エクスポート/インポートを開きます。


タスクのエクスポートを開きます。


サポートするオブジェクトの定義はい、または、インポート時に自動的にインストールを選択し、SQLファイルとしてエクスポートするために複数のファイルに分割オフにします。


以上でAPEXアプリケーションがf<アプリケーションID>.sqlというファイル名でエクスポートされます。

APEXアプリケーションのインストール手順については、以前の記事「コマンドラインからアプリケーションをインポートする」で紹介しています。以下では、APEXワークスペースのデフォルト・パーシング・スキーマにSQLclで接続した状態を前提とします。

実行時トレースを画面に出力するために、APEX_DEBUG.ENABLE_DBMS_OUTPUTを呼び出します。DBMS_OUTPUTの出力を画面に表示するため、set serveroutput on size unlimitedの実行も必要です。また、ログ・レベルによりますが大量のログが出力されるため、spoolコマンドを実行しファイルにも出力するようにします。

デバッグ出力を有効にするためAPEX_DEBUG.ENABLEを呼び出します。以下ではレベルとして最も詳細なc_log_level_engine_traceを指定していますが、最初はc_log_level_infoを設定して動作を確認する方が良いと思います。設定可能なレベルは、パッケージAPEX_DEBUGのConstantsに説明されています。

インストール・スクリプトを実行するために、APEX_APPLICATION_INSTALL.SET_AUTO_INSTALL_SUP_OBJを呼び出しています。
set serveroutput on size unlimited
spool install.log
begin
    apex_application_install.set_auto_install_sup_obj( p_auto_install_sup_obj => true );
    apex_debug.enable_dbms_output(p_prefix=>'DebugInstall##-');
    apex_debug.enable(p_level => apex_debug.c_log_level_engine_trace);
end;
/
必要に応じて、パッケージAPEX_APPLICATION_INSTALLの他のAPIの呼び出しも追加します。

実行例は以下になります。エクスポートしたAPEXアプリケーションのIDは181です。

SQL> set serveroutput on size unlimited

SQL> spool install.log

SQL> begin

     apex_application_install.set_auto_install_sup_obj( p_auto_install_sup_obj => true );

     apex_debug.enable_dbms_output(p_prefix=>'DebugInstall##-');

     apex_debug.enable(p_level => apex_debug.c_log_level_engine_trace);

     end;

     /


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


SQL> @f181



APEXアプリケーションのインポートスクリプトが開始すると、以下のようにログが大量に出力されます。実行時トレースの出力にはDebugInstall##--がプレフィックスとして付加されています。

--application/set_environment

DebugInstall##--8-|init cgi_var_name.count=>0                                                      

%CGI.init:723<-%CGI.__pkg_init:869<-%SECURITY.get_ecid:4753<-%DEBUG.log_session_info:1140<-%DEBUG.log_message_int

DebugInstall##-                                                                                     ernal:1240<-%DEBUG.enter:483<-%IMP.import_begin:884<-:2

DebugInstall##----|State is now App=, Page=, Session=0, Workspace=0, User=

------------------------------------------------------------------------------------------------------------------------------------------

DebugInstall##-INF|ECID not set via CGI header, fetching from v$session                            

%SECURITY.get_ecid:4756<-%DEBUG.log_session_info:1140<-%DEBUG.log_message_internal:1240<-%DEBUG.enter:483<-%IMP.i

DebugInstall##-                                                                                     mport_begin:884<-:2

DebugInstall##-INF|ECID not set via v$session, generating with sys_guid()                          

%SECURITY.get_ecid:4766<-%DEBUG.log_session_info:1140<-%DEBUG.log_message_internal:1240<-%DEBUG.enter:483<-%IMP.i

DebugInstall##-                                                                                     mport_begin:884<-:2

DebugInstall##--9-|APEX Version=24.1.1                                                              %IMP.import_begin:884<-:2

DebugInstall##-   |Patch Version=1

DebugInstall##-   |SID=13401

DebugInstall##-   |USER=WKSP_APEXDEV

DebugInstall##-   |ECID=23516A574E408F58E063F15C000A482F

DebugInstall##-   |INSTANCE=4

DebugInstall##-   |

DebugInstall##--9-|R E Q U E S T SQLcle/

DebugInstall##--8-|import_begin

p_version_yyyy_mm_dd=>2024.05.31,p_release=>24.1.1,p_default_workspace_id=>7582124972789269,p_default_application_id=>181,p_default_id_offset=>67131626877163238,p_default_own

er=>WKSP_APEXDEV

DebugInstall##--8-|component_begin

p_version_yyyy_mm_dd=>2024.05.31,p_release=>24.1.1,p_default_workspace_id=>7582124972789269,p_default_application_id=>181,p_default_id_offset=>67131626877163238,p_default_own

er=>WKSP_APEXDEV

DebugInstall##-                                                                                     %IMP.component_begin:727<-%IMP.import_begin:898<-:2

DebugInstall##--8-|get_owner_of_calling_code callstack=>----- PL/SQL Call Stack -----              

%SECURITY.get_owner_of_calling_code:4571<-%IMP.component_begin:770<-%IMP.import_begin:898<-:2

DebugInstall##-   |  object      line  object

DebugInstall##-   |  handle    number  name

DebugInstall##-   |0xbc88946a8      4571  package body APEX_240100.WWV_FLOW_SECURITY.GET_OWNER_OF_CALLING_CODE

DebugInstall##-   |0x275b4cd68       770  package body APEX_240100.WWV_FLOW_IMP.COMPONENT_BEGIN

DebugInstall##-   |0x275b4cd68       898  package body APEX_240100.WWV_FLOW_IMP.IMPORT_BEGIN

DebugInstall##-   |0xa7c6feda0         2  anonymous block

DebugInstall##-   |

DebugInstall##----|State is now App=181, Page=, Session=0, Workspace=0, User=

---------------------------------------------------------------------------------------------------------------------------------------

DebugInstall##--9-|...skip APEX_240100.WWV_FLOW_SECURITY, APEX code                                

%SECURITY.get_owner_of_calling_code:4577<-%IMP.component_begin:770<-%IMP.import_begin:898<-:2


サポート・オブジェクトインストール・スクリプトは、インストール・スクリプトの最後に実行されます。

DebugInstall##-                                                                                    

_WIZARD.run_stmt:261<-%INSTALL_WIZARD.run_script:352<-%INSTALL_WIZARD.install:611<-%INSTALL_WIZARD.auto_install_s

DebugInstall##-                                                                                    

up_obj:1143<-%IMP.post_import_process:1279<-%IMP.component_end:1296<-%IMP.import_end:1336<-:2

DebugInstall##-   |

DebugInstall##-   |    l_empno emp.empno%type;

DebugInstall##-   |

DebugInstall##-   |begin

DebugInstall##-   |

DebugInstall##-   |    select empno into l_empno from emp where ename = 'SCOTT';

DebugInstall##-   |

DebugInstall##-   |end;,p_language=>PLSQL

DebugInstall##--8-|enable_access old g_disabled_level=>2                                           

%SESSION_STATE.enable_access:155<-%SW_API.run_sql_arr:1225<-%SW_API.run_sql:1475<-%INSTALL_WIZARD.run_statement:2

DebugInstall##-                                                                                    

06<-%INSTALL_WIZARD.run_stmt:261<-%INSTALL_WIZARD.run_script:352<-%INSTALL_WIZARD.install:611<-%INSTALL_WIZARD.au

DebugInstall##-                                                                                    

to_install_sup_obj:1143<-%IMP.post_import_process:1279<-%IMP.component_end:1296<-%IMP.import_end:1336<-:2

DebugInstall##--8-|enable_access old g_disabled_level=>1                                           

%SESSION_STATE.enable_access:155<-%INSTALL_WIZARD.run_script:366<-%INSTALL_WIZARD.install:611<-%INSTALL_WIZARD.au

DebugInstall##-                                                                                    

to_install_sup_obj:1143<-%IMP.post_import_process:1279<-%IMP.component_end:1296<-%IMP.import_end:1336<-:2

...Completed supporting objects install

DebugInstall##--8-|write_credential_collection                                                     

WWV_IMP_UTIL.write_credential_collection:832<-%IMP.component_end:1300<-%IMP.import_end:1336<-:2

DebugInstall##--8-|write_remoteserver_collection                                                   

WWV_IMP_UTIL.write_remoteserver_collection:893<-%IMP.component_end:1301<-%IMP.import_end:1336<-:2

... elapsed: 146.37 sec


...done

SQL> 


今回の記事は以上になります。

Oracle APEXのアプリケーション作成の参考になれば幸いです。