首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Oracle 如何從資料庫端看前端程式執行過哪些 SQL?查 `v$sql` 與 `dba_hist_sqltext` 即可

     編輯:程式設計綜合問答

場景:Delphi 程式用綁定變量拼 SQL,除錯時無法見到最終 SQL 文本,需在 Oracle 端回溯。

核心視圖

視圖用途權限需求
`v$sql` / `gv$sql` (RAC)共享池中當前游標的完整 SQL 文本、執行計畫、綁定變量值、執行統計`SELECT ANY DICTIONARY` 或 `DBA` 角色
`dba_hist_sqltext`AWR 快照保留的歷史 SQL 文本 (含已老化出共享池的)`SELECT_CATALOG_ROLE`
`v$sql_bind_capture`綁定變量實際值 (抽樣捕獲,非每次)同 `v$sql`

常用查詢範本

-- 1. 依模糊關鍵字搜尋近期執行的 SQL
SELECT sql_id, sql_text, executions, elapsed_time/1e6 AS elapsed_sec
FROM v$sql
WHERE sql_text LIKE '%table_name%' AND parsing_schema_name = 'MY_SCHEMA'
ORDER BY last_active_time DESC;

-- 2. 取得特定 sql_id 的綁定變量值
SELECT name, position, datatype_string, value_string
FROM v$sql_bind_capture
WHERE sql_id = 'abc123def456';

-- 3. 歷史 SQL (需 AWR 授權)
SELECT sql_id, sql_text
FROM dba_hist_sqltext
WHERE sql_text LIKE '%bind_variable%';

進階:即時追蹤特定 Session

-- 找到目標 session 的 sid, serial#
SELECT s.sid, s.serial#, s.sql_id, s.prev_sql_id
FROM v$session s
WHERE s.program LIKE '%delphi%' OR s.module = 'MyApp';

-- 開啟 10046 事件追蹤 (需 ALTER SYSTEM 權限)
EXEC DBMS_MONITOR.SESSION_TRACE_ENABLE(sid => 123, serial_num => 456, binds => TRUE, waits => TRUE);
-- 執行業務操作後
EXEC DBMS_MONITOR.SESSION_TRACE_DISABLE(sid => 123, serial_num => 456);
-- 到 USER_DUMP_DEST 撈 .trc 檔,用 tkprof 分析

注意事項

  • `v$sql` 只保留共享池內游標,重啟或大量硬解析會沖刷掉,重要 SQL 趕緊存檔。
  • 綁定變量值在 `v$sql_bind_capture` 為**抽樣**,非每次執行都捕獲;需完整值請用 10046 追蹤。
  • 生產環境慎用 `ALTER SYSTEM SET EVENTS`,優先用 `DBMS_MONITOR`。

兩條核心 SQL:
`SELECT * FROM v$sql`
`SELECT * FROM dba_hist_sqltext`

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved