2017-06-16 97 views
1

我想使用Python來創建一個表,並插入一些值Python的cx_Oracle無效選項

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就好了開發者!

+0

換行符可能影響'create_table_workclasses'中的查詢。 '\ nCREATE TABLE WORKCLASSES(\ nWORKCLASSES_NAME VARCHAR2(32)NOT NULL \ n)\ n'''NOT NULL \ n'是一個無效的選項。 –

+0

create table語句也適用於cx_Oracle - 至少就你在這裏展示它而言!我沒有得到這樣的錯誤! –

+0

請注意您在INSERT ALL子句中有一個額外的分號 –

回答

0

我建議你學習下面的帖子: 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;"