2017-09-08 8 views
0

Je suis en train de créer un déclencheur simple cx_Oracle qui copie les valeurs dans un tableau appelé étudiant quand une valeur est insérée dans la table studentTemp. Il n'y a que deux colonnes dans chaque table, à savoir stud_ID et stud_Name. Lorsque je tente d'insérer la valeur dans StudentTemp en utilisanterreur de déclenchement cx_Oracle

cur.execute("INSERT INTO studentTemp VALUES(1, 'Bob')") 

Je reçois erreur DatabaseError: ORA-04098: déclenchement « S12345.INSERT_STUD » est invalide et a échoué revalidation. Voici le code

cur.execute('''CREATE OR REPLACE TRIGGER insert_Stud 
      AFTER INSERT ON studentTemp 
      FOR EACH ROW 
      BEGIN 
       INSERT INTO Student(Stud_ID,Stud_Name) VALUES 
       (:new.Stud_ID, :new.Stud_Name); 
      END;''') 

J'ai aussi essayé

cur.execute('''CREATE OR REPLACE TRIGGER insert_Stud 
      AFTER INSERT ON studentTemp 
      REFERENCING NEW AS new 
      FOR EACH ROW 
      BEGIN 
       INSERT INTO Student(Stud_ID,Stud_Name) VALUES (:new.Stud_ID, :new.Stud_Name); 
      END;/''') 

Mais toujours obtenir la même erreur

Je peux le faire fonctionner si j'utilise une procédure stockée comme celui-ci

# create insertStudent() stored procedure 
cur.execute('''CREATE OR REPLACE PROCEDURE insertStudent(
       sID IN STUDENT.STUDENT_ID%TYPE, 
       sName IN STUDENT.STUDENT_NAME%TYPE) 
      IS 
      BEGIN 
       INSERT INTO STUDENT VALUES(sID, sName); 
      END;''') 

# create insert_Stud() trigger 
cur.execute('''CREATE OR REPLACE TRIGGER insert_Stud 
      AFTER INSERT ON studentTemp 
      FOR EACH ROW 
      BEGIN 
       insertStudent(:new.Stud_ID, :new.Stud_Name); 
      END;''') 

Quelqu'un peut-il me dire gentiment comment résoudre ce problème. Merci

Répondre

0

Il me semble que vous avez une erreur en nommant vos champs Student-Table.

Dans votre procédure, les colonnes sont référencées comme

STUDENT.STUDENT_ID 
STUDENT.STUDENT_NAME 

Dans votre détente, vous les appelez

INSERT INTO Student(**Stud_ID**,**Stud_Name**) VALUES ... 
+0

Merci. Je l'ai corrigé mais je reçois toujours la même erreur. – Awais

+0

Avez-vous la possibilité de vous connecter à la base de données avec SQL Developer? Vous pouvez ensuite compiler le déclencheur directement et obtenir des commentaires sur ce qui ne va pas – Pesse

0

Essayez d'utiliser SQL * Plus pour créer le déclencheur. Ensuite, utilisez la commande "show errors" pour voir quel est le problème. Après cela, vous devriez pouvoir utiliser cx_Oracle sans aucune difficulté. La seule différence est que le suivi/dans SQL * Plus n'a pas besoin d'être là.