【发布时间】:2021-03-17 17:14:38
【问题描述】:
我是 PL/SQL 的新手,我在尝试实现的触发器方面遇到问题。
触发器的目的是在插入表之前检查货币值,以查看是否有人在插入过程中出错。如果有,他们将收到一条消息,说明该值不正确。这些值以十亿为单位,所以现在我只是检查输入的值是否高于 10000。
我目前拥有的触发器是;
CREATE TRIGGER Check_Value
BEFORE INSERT OR UPDATE OF "Potential Annual Value By 2026" ON AIPOTENTIALVALUEFORHEALTHCARE
BEGIN
IF (NEW."Potential Annual Value By 2026" < 10000.00) THEN
DBMS_OUTPUT.put_line('Value typed was incorrect');
ELSIF (NEW."Potential Annual Value By 2026" >= 10000.00) THEN
INSERT INTO AIPOTENTIALVALUEFORHEALTHCARE VALUES(NEW.ValueID, NEW.ApplicationID, NEW."Application Name", NEW.KeyDriverForAdoptionID, NEW."KeyDriverDescription", NEW."Potential Annual Value By 2026");
END IF;
END;
由于错误,这将不起作用:
PLS-00201: identifier NEW.'Potential Annual Value By 2026' must be declared
我的猜测是我错误地设置了触发器,并且它不知道在运行触发器时要检查哪个值。根据一些研究,我尝试使用 .NEW 将语句的值传递到触发器中,但是我不确定这是否是正确的实现。
我已经尝试过已经发布的方法;
CREATE TRIGGER Check_Value
BEFORE INSERT OR UPDATE OF "Potential Annual Value By 2026" ON AIPOTENTIALVALUEFORHEALTHCARE
BEGIN
IF (:NEW."Potential Annual Value By 2026" < 10000.00) THEN
DBMS_OUTPUT.put_line('Value typed was incorrect');
ELSIF (:NEW."Potential Annual Value By 2026" >= 10000.00) THEN
INSERT INTO AIPOTENTIALVALUEFORHEALTHCARE VALUES
(:NEW.ValueID, :NEW.ApplicationID, :NEW."Application Name",
:NEW.KeyDriverForAdoptionID, :NEW."KeyDriverDescription",
:NEW."Potential Annual Value By 2026");
END IF;
END;
并收到另一个错误:
ORA-04082: NEW or OLD references not allowed in table level triggers
04082. 00000 - "NEW or OLD references not allowed in table level triggers"
*Cause: The trigger is accessing "new" or "old" values in a table trigger.
*Action: Remove any new or old references.
如果此错误表明我不能在表级触发器中使用 NEW 引用,我如何能够在插入语句提交之前验证它的内容?
【问题讨论】:
-
顺便说一句,你真的,真的,REALLY不想在混合大小写的情况下命名列或任何其他对象或嵌入空格(更新“到 2026 年的潜在年度价值”)。每当您发现自己必须用双引号将对象名称括起来时,您都需要重新考虑。然后再次。又一次。