【问题标题】:Python cx_Oracle invalid optionPython cx_Oracle 无效选项
【发布时间】:2017-06-16 17:54:36
【问题描述】:

我正在尝试使用 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 中运行良好!

【问题讨论】:

  • 换行符可能会影响create_table_workclasses 中的查询。 '\nCREATE TABLE WORKCLASSES (\nWORKCLASSES_NAME VARCHAR2(32) NOT NULL\n)\n' NOT NULL\n 是无效选项。
  • create table 语句也适用于 cx_Oracle —— 至少就您在此处显示的而言!我没有收到这样的错误!
  • 请注意,您在 INSERT ALL 子句中有一个额外的分号

标签: python sql oracle cx-oracle


【解决方案1】:

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

基本上,当您使用 ''' 时,它会将源代码中的换行符替换为 \n。

因此可能的解决方案是使用双引号单字符 " 和分隔符 \ 来换行。

例如:

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;"

【讨论】:

    猜你喜欢
    • 2019-07-11
    • 2019-02-14
    • 1970-01-01
    • 1970-01-01
    • 2021-06-18
    • 2018-05-21
    • 1970-01-01
    • 1970-01-01
    • 2021-09-14
    相关资源
    最近更新 更多