2017-09-08 166 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中的尾隨/不需要在那裏。