指定绑定变量后的实际SQL语句

时间:2011-01-14 17:22:22

标签: python sql oracle cx-oracle

我正在尝试记录从脚本执行的每个SQL语句。但是我想到了一个我无法克服的问题。

有没有办法在指定绑定变量后计算实际的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来计算我的查询。

3 个答案:

答案 0 :(得分:7)

查询从不计算为单个字符串。查询和参数的实际文本从不插值,生成两者的实际完整字符串。

这是使用参数化查询的全部要点 - 您将查询与数据分开 - 一次性防止sql注入和限制,并允许轻松查询优化。数据库既可以单独获取,又可以完成它需要做的事情,而无需将它们连接在一起。

也就是说,您可以自己生成查询,但请注意,您生成的查询(尽管可能等效)不是实际在数据库上执行的查询。

答案 1 :(得分:1)

最好的办法是在数据库服务器上执行此操作,因为正确实现的Oracle连接器在将查询发送到服务器之前不会将绑定变量放入字符串中。查看是否可以找到Oracle服务器设置,使其记录它执行的查询。

答案 2 :(得分:0)

您可能需要考虑使用Oracle的扩展SQL跟踪功能。我建议从这里开始:http://carymillsap.blogspot.com/2011/01/new-paper-mastering-performance-with.html