Недопустимая опция Python cx_Oracle

Я пытаюсь использовать Python для создания таблицы и вставки некоторых значений

cur = con.cursor()

remove_table = '''
BEGIN
   EXECUTE IMMEDIATE 'DROP TABLE {}';
EXCEPTION
   WHEN OTHERS THEN
      IF SQLCODE != -942 THEN
         RAISE;
      END IF;
END;
'''
create_table_workclasses = '''
CREATE TABLE WORKCLASSES (
WORKCLASSES_NAME VARCHAR2(32) NOT NULL
)
'''
insert_workclasses = '''
INSERT ALL
INTO WORKCLASSES VALUES ('Private');
INTO WORKCLASSES VALUES ('Selfemp-inc')
INTO WORKCLASSES VALUES ('Federal-gov')
SELECT * FROM dual;
'''

cur.execute(remove_table.format('WORKCLASSES'))
cur.execute(create_table_workclasses)
cur.execute(insert_workclasses)

cur.close()
con.close()

Получение ошибки

cur.execute(create_table_workclasses)
cx_Oracle.DatabaseError: ORA-00922: missing or invalid option

Дело в том, что запрос отлично работает в SQL Developer!


person Cars Data    schedule 16.06.2017    source источник
comment
Символ новой строки может влиять на запрос в create_table_workclasses . '\nCREATE TABLE WORKCLASSES (\nWORKCLASSES_NAME VARCHAR2(32) NOT NULL\n)\n' NOT NULL\n — недопустимый вариант.   -  person Oluwafemi Sule    schedule 16.06.2017
comment
Оператор create table отлично работает и с cx_Oracle — по крайней мере, насколько вы его показали здесь! У меня таких ошибок нет!   -  person Anthony Tuininga    schedule 19.06.2017
comment
Обратите внимание, что у вас есть лишняя точка с запятой в предложении INSERT ALL.   -  person Christopher Jones    schedule 23.06.2017


Ответы (1)


Я бы посоветовал вам изучить следующий пост: стиль Python - продолжение строки со строками?

По сути, он говорит, что когда вы используете ''', он заменяет новую строку в исходном коде на \n.

Таким образом, возможным решением является использование одинарного символа двойной кавычки "вместе с разделителем \ для новых строк.

E.g.:

remove_table = "BEGIN \
EXECUTE IMMEDIATE 'DROP TABLE {}'; \
  EXCEPTION WHEN OTHERS \
  THEN IF SQLCODE != -942 THEN \
    RAISE; \
  END IF; \
END;"

Если вы любите пробелы, обратите внимание на пробелы в начале новых строк. Они также добавят в окончательную строку

На всякий случай есть еще один способ, сохраняющий отступ кода, но использующий еще больше разделителей и кавычек.

remove_table = "BEGIN " \
"EXECUTE IMMEDIATE 'DROP TABLE TEST';" \
"  EXCEPTION WHEN OTHERS " \
"    THEN IF SQLCODE != -942 THEN " \
"      RAISE;" \
"    END IF;" \
"END;"
person Mikolas Pansky    schedule 16.06.2017