首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> DB2 資料庫 >> DB2 教學

如何查看 DB2 預存程序中 SQL 語句的執行情況

     編輯:DB2 教學

核心概念

  • 動態 SQL:可用 SNAPSHOT 監控。
  • 靜態 SQL(預存程序內):需用 Event Monitor 捕獲,但它只記錄 Package ID 與 Section ID,不直接記錄 SQL 文本。

透過系統目錄表 SYSCAT.STATEMENTS 以 Package ID + Section ID 反查原始 SQL。

完整實作範例

1. 建立測試預存程序

CREATE PROCEDURE sales_status (IN quota INTEGER)
DYNAMIC RESULT SETS 2
LANGUAGE SQL
BEGIN
  DECLARE SQLSTATE CHAR(5);
  DECLARE rs CURSOR WITH RETURN FOR
    SELECT sales_person, SUM(sales) AS total_sales
    FROM sales
    GROUP BY sales_person
    HAVING SUM(sales) > quota;
  OPEN rs;
  INSERT INTO tt1 VALUES (1),(2),(3),(4),(5);
END @

2. 建立並啟用 Event Monitor

db2 create event monitor ev2 for statements write to file 'D:\tmp'
db2 set event monitor ev2 state 1
db2 "call sales_status(10)"
db2 flush event monitor ev2
db2evmon -db sample -evm ev2 > 1.out

3. 分析輸出檔關鍵欄位

輸出中會出現多筆 Statement Event,重點欄位:

  • Type:Static
  • Operation:Execute / Close
  • Section:區段號
  • Package:套件名稱(如 P2323139)
  • Rows read / written:讀寫列數

範例中:

  • Section=1,Rows read: 45 → 對應游標查詢
  • Section=2,Rows read: 1, Rows written: 5 → 對應 INSERT

4. 反查原始 SQL

SELECT STMTNO, SECTNO, TEXT
FROM SYSCAT.STATEMENTS
WHERE PKGNAME = 'P2323139';

結果範例:

STMTNOSECTNOTEXT
81DECLARE RS CURSOR ... HAVING SUM(SALES) > :HV00008
172INSERT INTO TT1 VALUES (1),(2),(3),(4),(5)

操作要點總結

  1. Event Monitor 僅捕獲執行時的 Package/Section 資訊。
  2. 必須在同一資料庫下查詢 SYSCAT.STATEMENTS 取得 SQL 文本。
  3. 適用於靜態 SQL(預存程序、觸發器、編譯時綁定的應用)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved