当前位置: 首页 > 面试题库 >

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

危文乐
2023-03-14
问题内容

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

我正在使用 绑定变量, 正如在 2005年的 这篇很棒的文章(由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);

我成功启用了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

我真正想要看到的是在发送给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自己。


问题答案:

作为选项之一,您可以通过手动或自动(例如,在用户的登录触发器中)为会话设置级别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 lid = 103 tim = 2640550035 hv = 1641534478
ad =‘7ff5bd0baf0’sqlid =’ap9rzz5hxgp0f’
从对偶中选择1,其中1234567 =:var < -我们的查询
结束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:
Bind#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


 类似资料:
  • 问题内容: Python文档似乎尚不清楚参数是通过引用还是通过值传递,并且以下代码会产生未更改的值“原始” 我可以做些什么来通过实际引用传递变量吗? 问题答案: 传入的参数实际上是对对象的引用(但引用是通过值传递的) 有些数据类型是可变的,但有些则不是 所以: 如果将可变对象传递给方法,则该方法将获得对该对象的引用,并且可以对其进行突变,但是如果您将该引用重新绑定到该方法中,则外部作用域对此一无所

  • 我声明了10个变量,它们的末尾有索引。 我想获取索引(var_5)或任何索引的值。如何使用Java动态地实现这一点。我想传递索引5,它应该返回11。

  • 问题内容: 是否可以获取传递给函数的变量的原始变量名?例如 以便: 返回值: 编辑: 我想要做的就是使一个函数像: ..并让函数根据传递给它的变量的名称生成文件名。 我想如果不可能的话,我只需要每次将变量和变量名作为字符串传递。 问题答案: 你不能 在传递给函数之前先对其进行评估。您所能做的就是将它作为字符串传递。

  • 问题内容: 我目前正在express.js应用程序中处理handlebars.js。为了使事情保持模块化,我将所有模板都分成了部分。 我的问题 :我找不到通过部分调用传递变量的方法。假设我有一个部分看起来像这样: 假设我用“ myPartial”这个名字注册了这个部分。然后,在另一个模板中,我可以说: 效果很好,部分将按预期渲染,我是一个快乐的开发人员。但是,我现在需要的是一种通过此调用传递不同变

  • 问题内容: 我有一个链接: 触发ajax调用 但是在控制台中,我看到以下内容: 处理了ajax文件,但是POST数据为空,并且没有执行成功操作,因此将其用零发布,并且类未更改 我凝视着……有什么明显的东西吗? 问题答案: 不会自动传递给AJAX回调函数。您可以使用参数告诉jQuery通过它:

  • 本文向大家介绍如何通过AJAX调用传递JavaScript变量?,包括了如何通过AJAX调用传递JavaScript变量?的使用技巧和注意事项,需要的朋友参考一下 要通过AJAX调用传递JavaScript变量,请替换以下内容- 与- 示例 尝试以下代码以通过AJAX调用正确传递变量-