2017-06-16 1 views
1

J'essaie d'utiliser Python pour créer une table et insérez des valeursPython cx_Oracle option non valide

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() 

Obtenir une erreur de

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

La chose est que la requête fonctionne très bien dans SQL Développeur!

+0

Le caractère de nouvelle ligne peut affecter la requête dans 'create_table_workclasses'. '' \ nCLASSE WORKCLASSES (\ NWORKCLASSES_NAME VARCHAR2 (32) NOT NULL \ n) \ n'' 'NOT NULL \ n' est une option invalide. –

+0

L'instruction create table fonctionne également très bien avec cx_Oracle, du moins pour autant que vous l'ayez affichée ici! Je n'ai pas de telles erreurs! –

+0

Notez que vous avez un point-virgule supplémentaire dans la clause INSERT ALL –

Répondre

0

Je vous suggère d'étudier après ce qui suit: Python style - line continuation with strings?

Fondamentalement, il dit lorsque vous utilisez « » » il substitue le saut de ligne dans le code source pour \ n.

Ainsi, la solution est d'utiliser un seul caractère guillemet "avec séparateur \ pour les nouvelles lignes

Ex.:

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

Si vous êtes l'espace pédant s'il vous plaît considérer les espaces au début Juste au cas où il y aurait encore un autre moyen de mettre le code en retrait, mais en utilisant encore plus de séparateurs et de citations

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