你误用了装订。
有三种不同的方法可以将变量与cxúu Oracle绑定在一起see here:
1)通过将元组传递给带有编号变量的SQL语句:sql = "select * from sometable where somefield = :1 and otherfield = :2"
cur.execute(sql, (aValue, anotherValue))
2)通过将关键字参数传递给带有命名变量的SQL语句:sql = "select * from sometable where somefield = :my_field and otherfield = :anotherOne"
cur.execute(sql, myField=aValue, anotherOne=anotherValue)
3)通过将字典传递给带有命名变量的SQL语句:sql = "select * from sometable where somefield = :my_field and otherfield = :anotherOne"
cur.execute(sql, {"myField":aValue, "anotherOne":anotherValue})
备注
那你的代码为什么能工作?
让我们试着理解这里发生了什么:bind= {"var" : "ciao"}
sql = "select * from sometable where somefield = :bind and otherfield = :bind"
cur.execute(sql,(bind["var"], bind["var"]))
甲骨文将理解,它期望一个变量。这是一个命名变量,通过名称bind链接。然后,应将参数作为命名参数提供,如下所示:cur.execute(sql, bind="ciao")
或者用字典,比如:cur.execute(sql, {bind:"ciao"})
但是,当cx_Oracle接收到一个元组时,它会按数字在绑定中回退,就好像您的SQL语句是:sql = "select * from sometable where somefield = :1 and otherfield = :2"
当您传递bind['var']两次时,这只是字符串"ciao"。它将两个元组项映射到编号的变量:cur.execute(sql, ("ciao", "ciao"))
这是偶然的,但这一准则是非常误导人的。
要绑定单个值的元组
还要注意,第一个选项需要一个元组。但是,如果要绑定单个值,则可以使用此表示法创建单个值的元组:sql = "select * from sometable where somefield = :1"
cur.execute(sql, (aValue,))
[编辑]:感谢@tyler christian提到传递dict是由cxúOracle支持的。