5

Pro*C コードでは、最後に実行された SQL ステートメントをsqlgls()(またはSQLStmtGetText())経由で取得できます。

これは、ロギングの目的、特に動的ステートメントの場合に役立ちます。

しかし、これらの SQLLIB 関数によって返される SQL ステートメントには、バインド マーカー (つまり:b1:b2... など) しか含まれていません。使用されるホスト変数の実際の値は含まれません。

したがって、次の質問があります: ホスト変数の値を含む最後の SQL ステートメントを表示するにはどうすればよいですか?

それ以外の場合は、によって返された文字列を出力した後に、使用されているすべての変数を手動で出力する必要がありますsqlgls()。これは、まったく使用せずに SQL ステートメントを出力するよりも便利ではありませんsqlgls

たとえば、代わりに

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

印刷したい:

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

(ロギングに加えて、SQLシェルにコピーして貼り付けやすくするため、つまりテスト用)

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テキストを取得するには、単純なスクリプトが必要です。これは、バインド値を自分で印刷するよりも便利ではないと思います。

もう 1 つの方法は10046 レベル 4 トレースを実行することですが、ここでも copynpaste 機能をサポートするためにいくつかのトリックを実行する必要があります。

于 2013-02-09T01:25:35.730 に答える