在我的sql应用程序中执行查询时遇到一个奇怪的问题。我正在使用python3和cx_Oracle 5.1.2。我的测试表组织如下:
创建表人员(sin CHAR(15),名称VARCHAR(40),PRIMARY KEY(sin))
插入以下值(sin,name):
('1','a'),('2','b'),('3','c')
当我使用不安全的查询进行简单选择时:
curs.execute(“从sin ='1'的人中选择姓名”)
如预期的那样,结果是'a',但是如果我使用绑定:
curs.execute(“从sin =:v的人中选择姓名,v ='1')
结果为空。我已经尝试将其更改为位置“?” 参数,通过setinputsizes(v = 15)设置'v'的大小,但似乎没有任何效果。
有什么我想念的吗?
谢谢,
问题出在您使用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',)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句