我正在尝试创建一个触发器,当应用程序表中的应用程序状态行发生更改时,该触发器会自动更新学生的应用程序状态。我现在浏览网页已经有一个多小时了,尽管找到了使用EXECUTE IMMEDIATE
的潜在工作但我无法实现我想要的结果(EXECUTE IMMEDIATE
导致了未绑定的变量错误)。
触发代码
CREATE OR REPLACE TRIGGER trg_applications
BEFORE INSERT OR UPDATE ON applications FOR EACH ROW
BEGIN
IF UPDATING THEN
/* If the status is ACCEPTED, then approve the students application */
SELECT CASE
WHEN get_status(:NEW.status_id) =
LOWER('Applicant Accepted Offer')
THEN student_accept_offer( :NEW.student_id )
END
FROM status;
END IF;
END;
get status方法返回VARCHAR2
以检查新状态是否与条件匹配,如果是,我想使用下面的student_approved
更新autonomous_transaction
行。
student_accept_offer
代码
CREATE OR REPLACE FUNCTION student_accept_offer( this_stu_id NUMBER )
RETURN VARCHAR2 IS
PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
UPDATE students
SET students.student_on_placement = 1
WHERE students.student_id = this_stu_id;
COMMIT;
RETURN 'Student has approved application';
END student_accept_offer;
当我在触发器之外测试它时,此函数按预期工作,但是当它嵌入触发器时会抛出PLS-00428
错误。任何人都可以指出我正确的方向,如何解决这个问题,如果状态匹配,允许我在更新时自动触发此功能。
感谢您的时间
编辑 - 我引用的表格
答案 0 :(得分:1)
稍微更改代码以删除SELECT
语句(因为它似乎没必要)然后这样做有效吗?
CREATE OR REPLACE TRIGGER trg_applications
BEFORE INSERT OR UPDATE ON applications FOR EACH ROW
BEGIN
IF UPDATING THEN
/* If the status is ACCEPTED, then approve the students application */
IF get_status(:NEW.status_id) = 'applicant accepted offer' THEN
student_accept_offer( :NEW.student_id );
END IF;
END IF;
END;