質問

スクリプトから実行されたすべてのSQLステートメントを記録しようとしています。しかし、私は克服できない1つの問題を考えています。

バインド変数が指定された後、実際のSQLステートメントを計算する方法はありますか。 sqliteでは、以下のコードを使用して、手動で実行するためにステートメントを計算する必要がありました。

def __sql_to_str__(self, value,args):
    for p in args:
        if type(p) is IntType or p is None:
            value = value.replace("?", str(p) ,1)
        else:
            value = value.replace("?",'\'' + p + '\'',1)
    return value

CX_ORACLEにあるようです cursor.parse() 設備。しかし、実行前にクエリを計算するためにCX_ORACLEをトリックする方法を理解することはできません。

役に立ちましたか?

解決

クエリはです 一度もない 単一の文字列として計算されます。クエリとパラメーションの実際のテキストは 一度もない 補間と しないでください 両方を備えた本物の完全な文字列を生成します。

これがパラメーター化されたクエリを使用する全体のポイントです - クエリをデータから分離します - SQL注入と制限をすべて一度に防止し、簡単なクエリの最適化を可能にします。データベースは両方を個別に取得し、それらを結合することなく、必要なことを行います。

とはいえ、クエリを自分で生成できますが、生成するクエリは、おそらく同等ではありますが、データベースで実際に実行されるものではないことに注意してください。

他のヒント

適切に実装されたOracle Connectorは、クエリをサーバーに送信する前にバインド変数を文字列に入れないため、データベースサーバーでそれを行うことです。実行するクエリをログにするOracleサーバー設定を見つけることができるかどうかを確認します。

このためにOracleの拡張SQLトレース機能の使用を検討することをお勧めします。ここから始めることをお勧めします: http://carymillsap.blogspot.com/2011/01/new-paper-mastering-performance-with.html.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top