python cx_Oracle 标识符无效

python cx_Oracle invalid identifier

我正在尝试查询 oracle 数据库。

import cx_Oracle

dsn_tns = '(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=some.server.com)(PORT=1521))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=service_name)))'
con = cx_Oracle.connect('USER', 'PWD', dsn_tns)

cur = con.cursor()
cur.execute('select * from admin.summary where NUMBER = "C123456"')

res = cur.fetchall()
print res

cur.close()
con.close()

并得到:

$ python cx_oracle.py
Traceback (most recent call last):
  File "cx_oracle.py", line 9, in <module>
    cur.execute('select * from admin.summary where NUMBER = "C123456"')
cx_Oracle.DatabaseError: ORA-00936: missing expression

我还尝试将查询字符串更改为

'select * from admin.summary where NUMBER = 'C1012445''

并得到:

$ python cx_oracle.py
  File "cx_oracle.py", line 9
    cur.execute('select * from admin.summary where NUMBER = 'C1012445'')
                                                                    ^
SyntaxError: invalid syntax

有什么建议吗? Python 版本为 2.7

cur.execute('select * from admin.summary where NUMBER = "C123456"'

在 SQL 中,双引号用于数据库标识符名称(表和列),而不是字符串文字。所以 Oracle 编译器正在寻找名为 C123456.

的列

cur.execute('select * from admin.summary where NUMBER = 'C1012445'')

您的字符串由单引号括起来,因此它在 = 之后结束,Python 解释器不知道如何处理 C123456

尝试像这样转义引号:

cur.execute('select * from admin.summary where NUMBER = ''C1012445'' ')

正如@ChristopherJones 指出的那样,NUMBER 是一个保留字,不能用作 Oracle 中的名称。我假设发布的代码是一个编辑,但如果有人愚蠢到强行通过这样的列名,他们一定是通过使用双引号来完成的。在这种情况下,对该列的所有后续引用也必须用双引号转义:

cur.execute('select * from admin.summary where "NUMBER" = ''C1012445'' ')

NUMBER 是 SQL 中的保留字,用于数据类型。默认情况下,它不会是列名,除非有人强制使用:

SQL> create table t ("NUMBER" number);

Table created.

如果他们这样做,那么您的 SQL 还需要引用列名称,例如:

cur.execute("""select "NUMBER" from t where "NUMBER" = 1""")

或者,在您的情况下,例如:

cur.execute("""select * from admin.summary where "NUMBER" = 'C123456'""")

但是,除非您始终在 'where' 子句中使用相同的值,否则您应该为 C123456 使用绑定变量。看看 https://github.com/oracle/python-cx_Oracle/blob/master/samples/BindQuery.py 是怎么做到的。

使用绑定变量有助于可伸缩性并有助于阻止 SQL 注入攻击。