2017-05-10 4 views
0

Lorsque vous essayez d'exécuter cette requête sur cx_Oracle en pythonErreur: ORA-00911 caractère invalide

Insert into orange.cp4_freeze_tasks (
SELECT distinct cust_id, 'C' 
    FROM (SELECT f.cust_id, cust_site, debt_invoiced + debt_no_invoiced deuda, 
    DECODE (d.manual_level, 0, cp_level, manual_level) nivel, 
    (SELECT nvl(freeze_limit,9999999999) 
     FROM orange.cp4_level_config 
     WHERE site_id = cust_site 
     AND cplevel = 
        DECODE (d.manual_level,0, cp_level,manual_level)) freeze_limit 
    FROM orange.cp4_freezed_customers f, orange.cp4_debt_status d 
    WHERE f.cust_id = d.cust_id) c 
WHERE deuda <= freeze_limit/2 and not exists (Select 1 from orange.cp4_freeze_tasks 
where cust_id = c.cust_id and task_status = 'C'));commit; 

Je reçois l'erreur suivante:

cx_Oracle.DatabaseError: ORA-00911: invalid character 

déjà essayé la solution des autres questions: Suppression du dernier point-virgule

Une idée de comment résoudre le problème?

+0

poster la trace complète de la pile, s'il vous plaît –

+0

Rien ne saute sur moi, sauf se terminant par valider dans votre déclaration SQL. Pouvez-vous supprimer le commit et commettre autrement de python, comme, connection.commit() ;? Sinon, vous devez envelopper les instructions dans un bloc pl/sql anonyme. – unleashed

Répondre

3

devineras c'est ce qui est l'origine du problème:

where cust_id = c.cust_id and task_status = 'C'));commit; 

Vous avez deux instructions SQL dans une requête. Supprimez le ;commit;. Votre instruction d'insertion devrait maintenant fonctionner. Changez votre python et ajoutez ceci après avoir exécuté l'insert:

connection.commit() 

évidemment changer connection pour adapter le nom de la variable réelle que vous utilisez.

+0

Cela a fait l'affaire! Pendant un moment, j'ai pensé que ça ne fonctionnait pas mais la requête avait besoin de temps. Je vous remercie! –