首页 > 解决方案 > 如何正确地将表中的值与触发器进行比较?(PL-SQL)

问题描述

我目前无法在 Oracle SQL 中使用触发器。我正在尝试跨表比较值。更具体地说,我想查看一个日期是否大于/晚于另一个日期,根据结果,可能会发生错误,即项目预算输入日期不能早于项目的开始日期。

我有两个相关的表。

项目:https ://i.imgur.com/MC7yPZT.png

预算:https ://i.imgur.com/HGJ6oLy.png

这是我的触发器:

-- check legality of budget date
CREATE OR REPLACE TRIGGER trg_budget_date 
BEFORE UPDATE OF budget_date ON budget 
FOR EACH ROW
DECLARE var_project_start DATE;
BEGIN

    SELECT project.project_start
    INTO var_project_start
    FROM project
    WHERE project.project_id = :new.project_id;

    IF :new.budget_date > var_project_start THEN
        RAISE_APPLICATION_ERROR(-20000, 'Budget made before project start.');
    END IF;

END;
/

为了展示我的触发器如何不起作用,我将首先解释我是如何测试它的。

SELECT project_id, project_start
FROM project
WHERE project_id = '8';              

结果是 15-SEP-18。现在让我们尝试在开始日期之前插入预算,例如 13-SEP-18。

INSERT INTO budget VALUES (8, 9000, '13-SEP-18', 4);

运行这两个命令后,结果如下:

https://i.imgur.com/cWjrIMv.png

如您所见,它似乎根本不起作用。项目预算 (8) 被添加,就好像触发器根本不起作用一样。

如果有人能看到问题,请指出正确的方向,我将不胜感激。非常感谢您的阅读和您的时间。

标签: oracleplsqldatabase-trigger

解决方案


也许我错过了什么,但对我来说似乎很简单。您的触发器仅在更新之前运行,您也应该添加 BEFORE INSERT。检查以下模式:

CREATE [ OR REPLACE ] TRIGGER trigger_name  
BEFORE INSERT or UPDATE or DELETE

希望能帮助到你!


推荐阅读