2017-09-08 106 views
0

我试图创造cx_oracle其中当一些值插入表格studentTemp表中的值复制称为学生一个简单的触发器。每个表中只有两列,分别是stud_ID和stud_Name。当我尝试使用Cx_oracle触发错误

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

我收到错误DatabaseError插入在StudentTemp值:ORA-04098:触发器“S12345.INSERT_STUD”是无效的,失败再验证。以下是

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;''') 

我也曾尝试代码

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;/''') 

但仍然得到同样的错误

我可以,如果我使用一个存储过程,这样

# 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;''') 
它的工作

有人可以告诉我如何解决这个问题。谢谢

回答

0

在我看来,你在命名你的学生表字段时有一个错误。

在你的程序中,colums被引用为

STUDENT.STUDENT_ID 
STUDENT.STUDENT_NAME 

在你的扳机,你叫他们

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

谢谢。我修正了这个问题,但它仍然得到相同的错误 – Awais

+0

你有没有可能通过SQL Developer连接到数据库?然后你可以直接编译触发器并获得反馈有什么问题 – Pesse

0

尝试使用SQL * Plus创建触发器。然后使用“show errors”命令查看问题所在。之后,您应该可以毫无困难地使用cx_Oracle。唯一的区别是,SQL * Plus中的尾随/不需要在那里。