示例:检索例程的语句文本
可以使用例程监视功能来检索例程所执行的语句。
方案
在本示例中,数据库管理员 (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.