Cx_oracle触发错误

时间:2017-09-08 01:10:49

标签: oracle python-3.x cx-oracle

我正在尝试在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;''')

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

2 个答案:

答案 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中的尾随/不需要在那里。