如何在Oracle Pro * C中显示包含主机变量值的SQL语句?

时间:2013-02-08 08:42:52

标签: sql c oracle binding

在Pro * C代码中,您可以通过sqlgls() (or even SQLStmtGetText())获取最后执行的SQL语句。

这对于日志记录非常有用 - 尤其对于动态语句。

但是这些SQLLIB函数返回的SQL语句只包含绑定标记(例如:b1:b2 ...)。不包括使用的主机变量的实际值。

因此,我有以下问题:如何显示包含主机变量值的最后一个SQL语句?

否则我必须在打印sqlgls()返回的字符串后手动打印所有使用过的变量。在没有使用sqlgls的情况下打印SQL语句并不比这更方便。

例如,而不是

INSERT INTO MYTABLE VALUES (:b1, :b2, :b3);

我想打印:

INSERT INTO MYTABLE VALUES ("hello", "world", 12);

(除了日志记录之外,还可以更容易地将其“复制”到SQL-shell中 - 即用于测试)

2 个答案:

答案 0 :(得分:1)

您可以使用 v $ sql_bind_capture 来跟踪绑定变量值。

引入了v $ sql_bind_capture来报告有关SQL游标使用的绑定变量的信息。此视图允许检索给定SQL游标的绑定变量的实际值。此外,您可以从v $ sqlarea或v $ sqltext或v $ sqltext_with_newlines获取sql文本。

SELECT 
   a.sql_text, 
   b.name, 
   b.position, 
   b.datatype_string, 
   b.value_string 
FROM
  v$sql_bind_capture b,
  v$sqlarea          a,
  v$session          c, 
WHERE
   c.sid = (select sys_context('USERENV','SID') from dual)
AND
   b.sql_id = c.prev_sql_id
AND 
   b.sql_id = a.sql_id;

您需要在此语句中尝试嵌入式sql。并获得获得完整语句所需的变量。你需要一个简单的脚本来获取带有绑定值的sql文本,我认为这不比自己打印绑定值更方便。

另一种方法是run a 10046 level 4 trace,但你需要做一些trics来支持copynpaste功能。

答案 1 :(得分:0)

我查看了Pro * C生成的代码,经过一些实验后,我得到了使用的内部Oracle库函数的API / ABI。

因此,我created the tracing library libtraceproc - 在预加载时 - 拦截相关的Oracle库函数调用并漂亮打印包含主机变量值的SQL语句。

该库有一些运行时选项,例如用于记录到文件,输出统计信息以及在实际Oracle调用之前和/或之后启用跟踪。

它还支持OCI API的低级跟踪,即您也可以将它用于OCI / OCCI / OTL程序。

实施例

$ LD_PRELOAD=./libtraceproc.so TRACEPROC_OPTIONS="-intercept -notime -sql" ./example/main
[..]
-- Before execution:
-- example/main.pc:274
insert into example_tbl (str,n) values ('a' ,0 ) returning n into :s5:s6  ;
insert into example_tbl (str,n) values ('b' ,1 ) returning n into :s5:s6  ;
[..]
-- After execution:
-- example/main.pc:274
insert into example_tbl (str,n) values ('a' ,0 ) returning n into 0  ;
insert into example_tbl (str,n) values ('b' ,1 ) returning n into 1  ;
[..]

libtraceproc.so是跟踪库,main是示例Pro * C应用程序。

请注意,不需要重新编译或重新链接Pro * C代码。跟踪库由运行时链接程序预加载。

A

$ LD_PRELOAD=./libtraceproc.so TRACEPROC_OPTIONS="-help" ./example/main

显示图书馆的帮助屏幕。