Oracle - 有什么方法可以解决PL / SQL块上的SELECT INTO问题

时间:2013-11-29 16:17:47

标签: sql oracle pls-00428

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

感谢您的时间

编辑 - 我引用的表格 enter image description here

1 个答案:

答案 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;