неверный идентификатор python cx_Oracle - PullRequest
0 голосов
/ 18 февраля 2019

Я пытаюсь запросить oracle db.

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

Ответы [ 2 ]

0 голосов
/ 19 февраля 2019

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', вы должны использовать переменную bind для C123456.Посмотрите, как это делает https://github.com/oracle/python-cx_Oracle/blob/master/samples/BindQuery.py.

Использование переменных связывания помогает масштабируемости и помогает остановить атаки с использованием SQL-инъекций.

0 голосов
/ 18 февраля 2019

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'' ')
...