示例:检索例程的语句文本

可以使用例程监视功能来检索例程所执行的语句。

方案

在本示例中,数据库管理员 (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.
注: 如果 MON_GET_ROUTINE_EXEC_LIST 返回动态 SQL 语句或外部例程语句,但相关联的 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.