指定绑定变量后的实际SQL语句是什么
我想记录我脚本中执行的每一个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
你可能想要考虑使用Oracle的扩展SQL跟踪功能来解决这个问题。我建议你可以从这里开始了解:http://carymillsap.blogspot.com/2011/01/new-paper-mastering-performance-with.html。
1
你最好的办法是在数据库服务器上处理这个问题,因为一个正确配置的Oracle连接器在把查询发送到服务器之前,不会把绑定变量放进字符串里。你可以看看有没有Oracle服务器的设置,可以让它记录执行的查询。
7
这个查询从来不会被计算成一个完整的字符串。查询的实际文本和参数从来不会被合并在一起,也不会生成一个包含这两者的真实完整字符串。
使用参数化查询的主要目的就是把查询和数据分开,这样可以防止SQL注入攻击,同时也能避免一些限制,还能让查询更容易优化。数据库会分别接收到这两部分,然后根据需要处理,而不会把它们合在一起。
当然,你可以自己生成查询,但要注意,你生成的查询虽然可能是等效的,但并不是实际在数据库上执行的那个查询。