我正在尝试记录从脚本执行的每个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来计算我的查询。
答案 0 :(得分:7)
查询从不计算为单个字符串。查询和参数的实际文本从不插值,不生成两者的实际完整字符串。
这是使用参数化查询的全部要点 - 您将查询与数据分开 - 一次性防止sql注入和限制,并允许轻松查询优化。数据库既可以单独获取,又可以完成它需要做的事情,而无需将它们连接在一起。
也就是说,您可以自己生成查询,但请注意,您生成的查询(尽管可能等效)不是实际在数据库上执行的查询。
答案 1 :(得分:1)
最好的办法是在数据库服务器上执行此操作,因为正确实现的Oracle连接器在将查询发送到服务器之前不会将绑定变量放入字符串中。查看是否可以找到Oracle服务器设置,使其记录它执行的查询。
答案 2 :(得分:0)
您可能需要考虑使用Oracle的扩展SQL跟踪功能。我建议从这里开始:http://carymillsap.blogspot.com/2011/01/new-paper-mastering-performance-with.html。