从trace文件中提取sql语句包括两个步骤:
首先要找到sql语句本身,然后找到sql语句可能用到的绑定变量的值。
本文假设你已经找到了报错的trace文件。
第一步:查找sql语句
跳到"Current cursor:"那行(在"*** Cursor Dump ***"部分的开始处)。记下和当前cursor关联的数字(详情参考下文例子)。
如果当前的游标数字是0,表示当前没有sql语句。在这种情况下,最好是在trace文件前面的Call Stack Trace部分看看,这里告诉我们发生错误时正在做什么。一般情况下,oracle技术支持在处理问题的时候,会查看trace文件。
如果当前游标是个非0数值,在trace文件后面的部分查找以"Cursor n"开头的行,n表示你要找的游标号,从10.2及其以后的版本开始,查找"Cursor#n"开头的行。找到后,在下一行,你会看到"cursor name:",sql语句就在其后。
注意:
通常情况下,你通过查找"Current SQL statement for this session:"就能很快定位该sql,一般会在trace文件的前面部分。
如果sql语句没有用到绑定变量(例如. ":b1", ":b2", 等。),第二步可以不看了。
第二步:查找绑定变量的值
如果sql语句使用了绑定变量,根据游标中的sql语句,你就能定位特定的文本部分,和每个绑定变量的值关联。文本的每部分以"bind x:"开头,其中的x的范围是0 到 n-1,其中的n代表绑定变量个数。
在sql语句和绑定变量之间可能会有大量的内存dump,可以忽略这些信息。
每个绑定变量会有很多属性列表,下面是我们感兴趣的一部分列表:
a.) dty 指数据类型,常见的值为:
1 VARCHAR2 or NVARCHAR2
2 NUMBER
8 LONG
11 ROWID
12 DATE
23 RAW
24 LONG RAW
96 CHAR
112 CLOB or NCLOB
113 BLOB
114 BFILE
b.) mxl 指最大长度,即变量占用的最大字节数,dty=2 and mxl=22 表示NUMBER(22)列
c.) scl 指位数 (对NUMBER列而言)
d.) pre 指小数点位数(对NUMBER列而言)
e.) value 指绑定变量的值
将游标dump中的绑定变量的值和sql语句中绑定变量的值直接对应:
:b1 ~ bind 0
:b2 ~ bind 1
:b3 ~ bind 2
以此类推………
绑定变量可以称为:1, :2,等,或者:a1, :a2等。最关键的是,在sql语句中的排列顺序和变量的dump部分的排列要完全一致。
现在你应该能找到绑定变量(包括长度,数值长度,精度)以及对应的值。
--转自