2

呼び出し後にsql_id/子番号/プランハッシュを取得する方法はありOCIStmtExecute()ますか?で見ることができませんOCIAttrGet()

注:見ることができない通常のユーザーとしてv$session-私ができればそれは実行するのと同じくらい簡単ですselect prev_sql_id, prev_child_number from v$session where sid=sys_context('USERENV', 'SID')

ありがとう!

4

2 に答える 2

0

ociまたはsys_contextを使用してsql_idまたはplan_hash_valueを取得する手段はありません。ただし、その機能を追加するために、拡張要求をoracleサポートに提出することをお勧めします。

次のステートメントを使用して、セッションのすべてのSQLステートメントをトレースする可能性があります。

alter session set events '10046 trace name context forever, level 12'

トレースレベルに応じて、生成されるトレースは多かれ少なかれ(レベル4および8では作成される情報が少なくなります)。トレースをオフにするには、

alter session set events '10046 trace name context off'

もう1つのオプションは、sql_idを自分で計算する関数を作成することです。

  • SQLテキストを使用して、128ビットのmd5を計算します
  • 下位64ビットはsql_idです(興味がある場合は下位32ビットがプランハッシュです)

もちろん、これはエラーが発生しやすい傾向があります。これは、将来、Oracleがsql_idを計算するメカニズムを変更する可能性があるためです。

于 2011-11-19T05:13:14.230 に答える
0

次のクエリは機能するはずですが、それが特定したいステートメントの次のステートメント実行である場合に限ります。

select prev_sql_id, prev_child_number
  from v$session
 where sid = sys_context('userenv','sid')

そしてそれは機能します...ほとんどの場合。私の顧客は、Oracle12c用のPL/ SQLアプリケーションを作成し、アプリケーションクエリを実行するコードの一部に上記のクエリを配置しました。彼は、prev_child_numberに対して間違った値を返すことがあることを示す出力を見せてくれました。私が見たところ、常に正しいデータを返すことができませんでした。99を超える個別のステートメントの実行により、間違ったprev_child_numberが6回返されました。

このクエリが間違ったデータを返す原因となる既存のバグを探しているところですが、まだ見つかりません。Oracleサポートを使用して新しいSRをログに記録する必要がある場合があります。

于 2015-06-10T18:41:53.940 に答える