【问题标题】:cx_Oracle returns empty query when using bindingscx_Oracle 在使用绑定时返回空查询
【发布时间】:2014-03-17 03:09:27
【问题描述】:

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

创建表人( 罪 CHAR(15), 名称 VARCHAR(40), 主键(罪))

插入以下值(罪名、姓名):

('1','a'), ('2','b'), ('3','c')

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

curs.execute("select name from people where sin = '1'")

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

curs.execute("select name from people where sin = :v", v='1')

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

我有什么遗漏的吗?

谢谢,

【问题讨论】:

  • 不确定 - 你试过curs.execute("select name from people where sin = :v", {'v':'1'})吗?

标签: python sql oracle


【解决方案1】:

问题在于您使用 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',)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-05
    • 2014-09-17
    • 1970-01-01
    相关资源
    最近更新 更多