Python cx_Oracle绑定变量

时间:2015-09-30 14:27:58

标签: python cx-oracle bind-variables

我是一个Python新手,我在使用绑定变量时遇到了麻烦。如果我执行下面的代码,一切正常。

bind= {"var" : "ciao"}
sql = "select * from sometable where somefield = :bind"
cur.prepare(sql)
cur.execute(sql,bind)

相反,如果我添加另一个绑定变量,我会收到错误。

bind= {"var" : "ciao"}
sql = "select * from sometable where somefield = :bind and otherfield = :bind"
cur.prepare(sql)
cur.execute(sql,(bind,bind))

cur.execute(sql,(bind,bind))
Oracle.NotSupportedError: Variable_TypeByValue(): unhandled data

我用

解决了这个问题
cur.execute(sql,(bind["var"],bind["var"]))

但我无法理解为什么上一个命令不正常。

使用绑定变量的正确方法是什么?我正在使用cx_Oracle。

1 个答案:

答案 0 :(得分:4)

@ffarquest说cx_Oracle不支持使用字典,但事实上,@ giovanni-de-ciantis只是错误地使用它。

named_params = {'dept_id':50, 'sal':1000}
query1 = cursor.execute(
    'SELECT * FROM employees WHERE department_id=:dept_id AND salary>:sal',
    named_params
)

OR

query2 = cursor.execute(
    'SELECT * FROM employees WHERE department_id=:dept_id AND salary>:sal',
    dept_id=50,
    sal=1000
)

在给定的示例中,我认为对:bind的第二个引用需要用不同的东西替换,因为它不是按顺序完成的。此外,重命名变量bind以消除混淆。

bind_dict = {bind:"var" : diff:"ciao"}
sql = "select * from sometable where somefield=:bind and otherfield=:diff"
cur.prepare(sql)
cur.execute(sql, bind_dict )

本文来自2007年,显示您可以使用字典: http://www.oracle.com/technetwork/articles/dsl/prez-python-queries-101587.html