如何编写触发器来检查 Oracle 中的更新值?
How to write a trigger that checks an updated value in Oracle?
对于一项作业,我需要编写一个 Oracle SQL 触发器来防止 STUDENT table 中的 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 0');
end if;
end;
/
show error;
只需使用:
Current_Balance := :new.StdBalance;
而不是
SELECT :new.StdBalance
INTO Current_Balance
FROM STUDENT
WHERE :new.stdID = StdID;
抑制突变错误。
P.S。即使在这些情况下使用此类赋值,正如 David Faber 警告的那样,也没有必要 return Current_Balance
的值,:new.StdBalance
可以直接用于与 IF :new.StdBalance > 500 ...
进行比较.
对于一项作业,我需要编写一个 Oracle SQL 触发器来防止 STUDENT table 中的 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 0');
end if;
end;
/
show error;
只需使用:
Current_Balance := :new.StdBalance;
而不是
SELECT :new.StdBalance
INTO Current_Balance
FROM STUDENT
WHERE :new.stdID = StdID;
抑制突变错误。
P.S。即使在这些情况下使用此类赋值,正如 David Faber 警告的那样,也没有必要 return Current_Balance
的值,:new.StdBalance
可以直接用于与 IF :new.StdBalance > 500 ...
进行比较.