使用绑定时,cx_Oracle返回空查询

时间:2014-03-17 03:09:28

标签: python sql oracle

在我的sql应用程序中进行查询时,我遇到了一个奇怪的问题。我正在使用python3和cx_Oracle 5.1.2。我的测试表按如下方式组织:

  

创建表人(   sin CHAR(15),   名称VARCHAR(40),   PRIMARY KEY(罪))

插入以下值(sin,name):

  

(' 1',' a'),(' 2'' b'),(' 3&# 39;,' C&#39)

当我使用不安全的查询进行简单选择时:

  

curs.execute("从sin =' 1'")

的人中选择姓名

结果是' a',正如预期的那样,但如果我使用绑定:

  

curs.execute("从sin =:v",v =' 1')中选择姓名

结果为空。我已经尝试将其更改为位置'?'参数,设置' v'的大小通过setinputsizes(v = 15)但似乎没有任何效果。

我有什么遗失的东西吗?

谢谢,

1 个答案:

答案 0 :(得分:2)

问题在于您使用CHAR数据类型而不是VARCHAR2。

即使在SQL * Plus中也可以观察到差异。

如果我们绑定VARCHAR2变量,则不会选择任何行:

SQL> variable v varchar2(15)
SQL> exec :v := '1';

PL/SQL procedure successfully completed.

SQL> select name from people where sin = :v;

no rows selected

如果我们绑定一个CHAR变量,它与列的数据类型相同,则选择一行:

SQL> variable v char(15)
SQL> exec :v := '1';

PL/SQL procedure successfully completed.

SQL> select name from people where sin = :v;

NAME
----------------------------------------
a

因此,您需要将列数据类型从CHAR更改为VARCHAR2(顺便说一句,VARCHAR也已过时)或指示cx_Oracle使用FIXED_CHAR数据类型:

>>> v = curs.var(cx_Oracle.FIXED_CHAR, 15)
>>> v.setvalue(0, '1')
>>> print v
<cx_Oracle.FIXED_CHAR with value '1'>

>>> result = curs.execute("select name from people where sin = :sin", sin=v)
>>> for r in result: print r

('a',)