簡體   English   中英

如何使用觸發器正確比較跨表的值? (PL-SQL)

[英]How do I correctly compare values across tables with triggers? (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) 的預算被添加,就好像觸發器根本不起作用一樣。

如果有人能看到問題,請指出正確的方向,我將不勝感激。 非常感謝您的閱讀和您的時間。

也許我錯過了一些東西,但對我來說這似乎很簡單。 您的觸發器僅在更新之前運行,您還應該添加 BEFORE INSERT。 檢查以下模式:

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

希望能幫助到你!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM