如何获取在ODP.NET中通过OracleParameter传递的绑定变量的跟踪信息?

Len*_*rri 4 sql oracle trace odp.net bind-variables

谷歌搜索了很多,没有找到我正在寻找的东西,我决定问这个问题.

我正在使用绑定变量,正如2005年这篇名为The Mark That Bind by Mark A. Williams的精彩文章所示,如下所示:

OracleParameter p_APP_NAME =
    new OracleParameter("p_APP_NAME", OracleDbType.NVarchar2, ParameterDirection.Input);
                         p_APP_NAME.Size = 50;
                         p_APP_NAME.Value = log.Application.Name;
                         cmd.Parameters.Add(p_APP_NAME);
Run Code Online (Sandbox Code Playgroud)

我成功启用了ODP.NET调试跟踪,但缺少的一个关键信息是记录的SQL statement不会显示绑定到绑定变量的值是什么.

它是记录OracleCommand.CommandText但没有OracleCommand.Parameters值.它告诉我这个:

TIME:2013/09/20-22:59:21:890 TID:20fc  OpsSqlPrepare2(): SQL: UPDATE PS_LOG SET 
                                              APP_NAME = :p_APP_NAME, 
                                              WHERE LOG_ID = :p_LOG_ID
Run Code Online (Sandbox Code Playgroud)

我真正想看到的是发送到ORACLE服务器的查询中使用的实际值,如下所示:

TIME:2013/09/20-22:59:21:890 TID:20fc  OpsSqlPrepare2(): SQL: UPDATE PS_LOG SET 
                                              APP_NAME = 'App Name', 
                                              WHERE LOG_ID = 777
Run Code Online (Sandbox Code Playgroud)

我错过了一些配置或我想要的信息在使用ODP.NET跟踪功能时不可用吗?

如果这不是内置的,我想我将不得不实现自己的替换方法并记录SQL Statement自己.

Nic*_*nov 7

作为其中一个选项,您可以通过为会话设置级别12或4的10046事件来手动或自动打开带有绑定变量转储的sql跟踪(例如,在用户的登录触发器中):

alter session set events '10046 trace name context forever, level 12';
Run Code Online (Sandbox Code Playgroud)

之后,将在user_dump_dest参数指定的目录中生成跟踪文件.

SQL> show parameter user_dump_dest;

NAME                                 TYPE        VALUE                          
------------------------------------ ----------- ------------------------------ 
user_dump_dest                       string      D:\...\diag\rdbms\cdb\cdb 
                                                 \trace   
Run Code Online (Sandbox Code Playgroud)

这是一个例子:

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 ;
Run Code Online (Sandbox Code Playgroud)

在新生成的跟踪文件中显示的其他信息中,我们可以找到有关查询,绑定变量及其值的信息:

参与游标#375980232 len = 40 dep = 0 uid = 103
oct = 3 lid = 103 tim = 2640550035 hv = 1641534478
ad ='7ff5bd0baf0'sqlid ='ap9rzz5hxgp0f'lelect
1 from dual where 1234567 =:var < - our query
STMT
PARSE 结束#375980232:c = 0,e = 375,p = 0,cr = 0,cu = 0,mis = 1,r = 0,dep = 0,og = 1,plh = 0,tim = 2640550034
BINDS#375980232:
绑定#0
oacdty = 02 mxl = 22(22)mxlc = 00 mal = 00 scl = 00 pre = 00
oacflg = 03 fl2 = 1000000 frm = 01 csi = 178 siz = 24 off = 0
kxsbbbfp = 16646e10 bln = 22 avl = 05 flg = 05
value = 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
Run Code Online (Sandbox Code Playgroud)

结果:

PARSING_USER_ID   SQL_FULLTEXT                      NAME    VALUE_STRING   
 ------------------------------------------------------------------------ 
           103   select 1 from dual where 1 =:var  :VAR     1234567
Run Code Online (Sandbox Code Playgroud)