0

我正在尝试创建一个触发器,当应用程序表中的应用程序状态行发生更改时,它会自动更新学生的应用程序状态。我现在已经浏览了一个多小时左右的网页,尽管找到了一个潜在的解决方法,但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会引发错误。谁能指出我如何解决这个问题的正确方向,如果状态匹配,我可以让这个功能在更新时自动触发。

谢谢你的时间

编辑 - 我引用的表 在此处输入图像描述

4

1 回答 1

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;
于 2013-11-29T16:40:26.597 回答