場景: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 的 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 分析
兩條核心 SQL:
`SELECT * FROM v$sql`
`SELECT * FROM dba_hist_sqltext`