我正在尝试在cx_oracle中创建一个简单的触发器,当在表 studentTemp 中插入一些值时,该触发器会复制名为学生的表中的值。每个表中只有两列,即stud_ID和stud_Name。当我尝试使用
在StudentTemp中插入值时cur.execute("INSERT INTO studentTemp VALUES(1, 'Bob')")
我收到错误 DatabaseError: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 :(得分:0)
在我看来,您在命名学生表字段时遇到错误。
在您的过程中,列标记为
STUDENT.STUDENT_ID
STUDENT.STUDENT_NAME
在你的触发器中,你称之为
INSERT INTO Student(**Stud_ID**,**Stud_Name**) VALUES ...
答案 1 :(得分:0)
尝试使用SQL * Plus创建触发器。然后使用“show errors”命令查看问题所在。之后你应该可以毫无困难地使用cx_Oracle。唯一的区别是SQL * Plus中的尾随/不需要在那里。