【问题标题】:How to get tracing info for binding variables passed through OracleParameter in ODP.NET?如何获取通过 ODP.NET 中的 OracleParameter 传递的绑定变量的跟踪信息?
【发布时间】:2013-09-26 12:26:21
【问题描述】:

在谷歌上搜索了很多但没有找到我要找的东西后,我决定问这个问题。

我正在使用 绑定变量,这在 2005 中由 Mark A. Williams 撰写的标题为 The Values That Bind 的精彩文章中进行了演示,如下所示:

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);

我成功启用了ODP.NET debug tracing,但缺少的一个关键信息是记录的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

我真正想看到的是发送到 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

在使用ODP.NET 跟踪功能时,我是否缺少某些配置或我想要的此信息不可用?

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

【问题讨论】:

    标签: sql oracle odp.net trace bind-variables


    【解决方案1】:

    我同意 Nicholas 发布的所有内容,但要补充一点,从 Oracle 10.1 开始,DBMS_MONITOR PL/SQL Package 是启用/禁用跟踪的首选方法。尽管 Nicholas 已经很好地证明了设置事件仍然有效。

    正如您所观察到的,出于安全考虑,ODP 不会将绑定变量值发送到其跟踪文件中。

    【讨论】:

    • 太棒了!我知道这个答案是由 Mark A. Williams(我的问题中提到的那篇文章的作者)提供的。我通过电子邮件与他取得了联系,请他就此事提供他的见解。他回复了电子邮件并告诉我他刚刚回复了它。我是多么的荣幸! :D
    【解决方案2】:

    作为选项之一,您可以通过手动或自动(例如在用户的登录触发器中)为会话设置 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 tim=2640550035 hv=1641534478
    ad='7ff5bd0baf0' sqlid='ap9rzz5hxgp0f'
    select 1 from dual where 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 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
    

    结果:

    PARSING_USER_ID   SQL_FULLTEXT                      NAME    VALUE_STRING   
     ------------------------------------------------------------------------ 
               103   select 1 from dual where 1 =:var  :VAR     1234567
    

    【讨论】:

    • 相当不错的尼古拉斯。我已经阅读了这些选项,但我很想知道是否有一个丢失/隐藏的配置允许我使用标准 ODP.NET 跟踪来获取绑定信息。他们可以添加一个新的跟踪级别来显示该信息,不是吗?至少我们可以选择获取该信息,这很棒。我会尽快尝试这些选项。非常感谢!
    猜你喜欢
    • 2020-02-10
    • 2014-09-10
    • 1970-01-01
    • 2015-01-23
    • 2017-03-31
    • 2018-10-06
    • 2022-07-20
    • 2018-02-16
    • 2011-03-11
    相关资源
    最近更新 更多