5

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

这对于记录目的很有用——尤其是对于动态语句。

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

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

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

例如,而不是

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

我想打印:

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

(除了日志记录,为了更容易将它复制到 SQL-shell 中 - 即用于测试)

4

2 回答 2

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 文本,我认为这并不比自己打印绑定值更方便。

另一种方法是运行 10046 4 级跟踪,但您需要再次执行一些技巧来支持 copynpaste 功能。

于 2013-02-09T01:25:35.730 回答
0

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

因此,我创建了跟踪库 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 代码。跟踪库由运行时链接器预加载。

一个

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

显示库的帮助屏幕。

于 2013-09-13T18:30:17.640 回答