例: ルーチンのステートメント・テキストの取得

ルーチン・モニターを使用すると、ルーチンによって実行されたステートメントを取得できます。

シナリオ

この例では、データベース管理者 (DBA) はルーチンによって実行されたコストの高いステートメントを手動で調査しています。 調査の一環として、MON_GET_ROUTINE_EXEC_LIST 内の行をルーチンの特定のステートメントまたは行にリンクすると役立つことがあります。 無名ブロック、動的 SQL ステートメント、または外部ルーチンなどの存続期間の短いルーチンのステートメント・テキストを取得するには、パッケージ・キャッシュのステートメントを取得します。 以下の照会は、MON_GET_ROUTINE_EXEC_LIST 内の行を特定のステートメントにリンクします。
SELECT
   A.ROUTINETYPE, A.ROUTINESCHEMA, A.ROUTINENAME,
   A.SECTION_TYPE, A.SECTION_NUMBER, A.STMTNO, 
   SUBSTR(B.STMT_TEXT,1,160)
FROM
   TABLE(MON_GET_ROUTINE_EXEC_LIST('P','DRICARD',NULL,'PROC1',-1)) AS A, 
   TABLE(MON_GET_PKG_CACHE_STMT(NULL,NULL,NULL,-1)) AS B
WHERE
   A.EXECUTABLE_ID=B.EXECUTABLE_ID
返される結果は、次のようになります。
STMT_TEXT                                   
 --------------------------------------------
WITH GET_UPDATE_LIST (COL1, COL2STATS) AS AF
insert into T1 values(3,'d','d','d')        
call SYSIBMSUBROUTINE.P1_66613_1157394573() 

  3 record(s) selected.
注: 動的 SQL ステートメントまたは外部ルーチン・ステートメントが MON_GET_ROUTINE_EXEC_LIST によって返され、関連付けられた executable_id がパッケージ・キャッシュにもうない場合には、イベント・モニターを使用してその情報をログに記録していない限りは、対象のステートメント・テキストをリカバリーすることはできません。 InfoSphere® Optim™ Performance Manager 製品のリフレッシュ・サイクルでは、ほとんどの場合、この情報を取得できます。
コンパイル済み SQL ステートメントおよびインライン化されたルーチンの場合、MON_GET_ROUTINE_EXEC_LIST によって返されるパッケージおよびステートメントの情報を使用してステートメント・テキストを検出できます。 例えば、
SELECT  RS.ROUTINETYPE, RS.ROUTINESCHEMA, RS.ROUTINENAME,
   RS.SECTION_NUMBER, RS.STMTNO, SUBSTR(SS.TEXT,1,160)
FROM
   TABLE(MON_GET_ROUTINE_EXEC_LIST('F','DRICARD','','MYFUNC',-1)) AS RS,
   SYSIBM.SYSSTMT SS
WHERE 
   RS.SECTION_TYPE = 'S'
    AND SS.PLNAME = RS.PACKAGE_SCHEMA
    AND SS.PLCREATOR = RS.PACKAGE_NAME
    AND SS.STMTNO = RS.STMTNO
    AND SS.SECTNO = RS.SECTION_NUMBER
返される結果は、次のようになります。
STMT_TEXT                                   
 --------------------------------------------
insert into MYTABLE values('1')        

  1 record(s) selected.