Python cx_oracle 通过位置绑定变量忽略数字
Python cx_oracle ignores numbers by positional bind variables
cursor.execute("SELECT * FROM t WHERE c1=:2 AND c2=:1", (1, 2))
执行为
SELECT * FROM t WHERE c1=1 AND c2=2
而不是
SELECT * FROM t WHERE c1=2 AND c2=1
如我所料。为什么?
事实上所有的 :numbers 都被完全忽略了
sql = ":5, :0, :0, :2, :1, :3"
与
的解释相同
sql = ":1, :2, :3, :4, :5, :6"
这是故意的还是错误?
cx_Oracle 正在使用具有此行为的 OCI。您可以阅读本白皮书(第 14 页底部和第 15 页顶部):
Oracle 有效地从左到右扫描,并按照遇到的顺序为绑定变量分配位置编号。您可以改用命名绑定变量来避免这种潜在的混淆。
cursor.execute("SELECT * FROM t WHERE c1=:2 AND c2=:1", (1, 2))
执行为
SELECT * FROM t WHERE c1=1 AND c2=2
而不是
SELECT * FROM t WHERE c1=2 AND c2=1
如我所料。为什么?
事实上所有的 :numbers 都被完全忽略了
sql = ":5, :0, :0, :2, :1, :3"
与
的解释相同sql = ":1, :2, :3, :4, :5, :6"
这是故意的还是错误?
cx_Oracle 正在使用具有此行为的 OCI。您可以阅读本白皮书(第 14 页底部和第 15 页顶部):
Oracle 有效地从左到右扫描,并按照遇到的顺序为绑定变量分配位置编号。您可以改用命名绑定变量来避免这种潜在的混淆。