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