作为选项之一,您可以通过手动或自动(例如在用户的登录触发器中)为会话设置级别 12 或 4 的 10046 事件来打开带有绑定变量转储的 sql 跟踪:
alter session set events '10046 trace name context forever, level 12';
之后将在指定的目录中生成跟踪文件user_dump_dest
范围。
SQL> show parameter user_dump_dest;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
user_dump_dest string D:\...\diag\rdbms\cdb\cdb
\trace
这是一个例子:
SQL> alter session set events '10046 trace name context forever, level 12';
2 variable var number;
3 exec :var := 1234567; -- our bind variable
4 select 1 from dual where 1234567 = :var ;
在新生成的跟踪文件中提供的其他信息中,我们可以找到有关查询、绑定变量及其值的信息:
解析游标#375980232 len=40 dep=0 uid=103
oct=3 盖=103 蒂姆=2640550035 hv=1641534478
ad='7ff5bd0baf0'sqlid='ap9rzz5hxgp0f'
从对偶中选择 1,其中 1234567 = :var
STMT 结束
解析#375980232:c = 0,e = 375,p = 0,cr = 0,cu = 0,mis = 1,r = 0,dep = 0,og = 1,plh = 0,tim = 2640550034
绑定#375980232:
绑定#0
oacdty=02 mxl=22(22) mxlc=00 mal=00 scl=00 前=00
oacflg=03 fl2=1000000 frm=01 csi=178 大小=24 关闭=0
kxsbbbfp=16646e10 bln=22 avl=05 flg=05
值=1234567
从 Oracle 10g 及更高版本开始,您还可以查询v$sql_bind_capture
动态性能视图以获取有关绑定变量及其值的信息:
select t.parsing_user_id
, t.sql_fulltext -- text of a query
, bc.name -- name of a bind variable
, bc.value_string -- value of a bind variable
from v$sqlarea t
join v$sql_bind_capture bc
on (bc.sql_id = t.sql_id)
join v$session s
on (s.user# = t.parsing_schema_id)
where s.username = user
and bc.name in (':VAR') -- name of a bind variable(s),
-- value(s) of which we want to know
Result:
PARSING_USER_ID SQL_FULLTEXT NAME VALUE_STRING
------------------------------------------------------------------------
103 select 1 from dual where 1 =:var :VAR 1234567