在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中 - 即用于测试)
答案 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
显示图书馆的帮助屏幕。