对于赋值,我需要编写一个Oracle SQL触发器,以防止STUDENT表中的StdBalance列超过500.通常我会使用检查约束来强制执行此操作,但是我被迫为它编写触发器。正如预期的那样,由于我在更新触发器中使用SELECT,Oracle会抛出一个变异错误,并且不会让我用任何东西更新StdBalance值。有谁知道如何解决这个问题?这是触发器的代码。
CREATE OR REPLACE TRIGGER Balance_Trigger
BEFORE UPDATE ON STUDENT
FOR EACH ROW
DECLARE
Current_Balance NUMBER;
BEGIN
SELECT :new.StdBalance
INTO Current_Balance
FROM STUDENT
WHERE :new.stdID = StdID;
IF Current_Balance > 500
THEN Raise_Application_error(-20007, 'You cannot exceed an unpaid balance of $500');
end if;
end;
/
show error;
答案 0 :(得分:2)
只需使用:
Current_Balance := :new.StdBalance;
而不是
SELECT :new.StdBalance
INTO Current_Balance
FROM STUDENT
WHERE :new.stdID = StdID;
抑制变异错误。
P.S。即使在这些情况下使用此类任务,正如David Faber所警告的那样,无需返回Current_Balance
的值,:new.StdBalance
可以直接用于IF :new.StdBalance > 500 ...
的比较。