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

2 投票
3 回答
1887 浏览
提问于 2025-04-16 09:58

我想记录我脚本中执行的每一个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注入攻击,同时也能避免一些限制,还能让查询更容易优化。数据库会分别接收到这两部分,然后根据需要处理,而不会把它们合在一起。

当然,你可以自己生成查询,但要注意,你生成的查询虽然可能是等效的,但并不是实际在数据库上执行的那个查询。

撰写回答