Python cx_Oracle无效选项

时间:2017-06-16 17:54:36

标签: python sql oracle 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中的查询工作正常!

1 个答案:

答案 0 :(得分:0)

我建议您研究以下帖子: Python style - line continuation with strings?

基本上它说当你使用'''时,它会替换\ 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;"