2

我正在尝试记录从我的脚本执行的每个 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 在执行之前计算我的查询。

4

3 回答 3

7

查询永远不会被计算为单个字符串。查询的实际文本和参数永远不会被插值,也不会产生真正的完整字符串。

这就是使用参数化查询的全部意义——将查询与数据分开——一次性防止 sql 注入和限制,并允许轻松优化查询。数据库分别获取两者,并完成它需要做的事情,而无需将它们连接在一起。

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

于 2011-01-14T17:34:51.933 回答
1

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

于 2011-01-14T17:38:14.283 回答
0

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

于 2011-01-14T19:31:39.537 回答