解决这个简单的触发器

时间:2016-04-02 12:03:43

标签: sql oracle oracle11g

我的触发器有问题(我是oracle的新手) 使用此触发器,我想在插入新合约时,并且此合约的start_date位于该用户的另一个合约的end_date之前,触发器必须将旧的end_date更改为新合约的start_date。

这是我的代码:

CREATE OR REPLACE TRIGGER Date_contracts
    BEFORE INSERT OR UPDATE OF START_DATE ON CONTRACTS
    FOR EACH ROW
    BEGIN
      IF :NEW.START_DATE < (SELECT DISTINCT END_DATE FROM CONTRACTS WHERE SSN = NEW.SSN) 
      THEN OLD.END_DATE := NEW.START_DATE;
      END IF;
    END;
    /

并且sql developres说在这种情况下不允许使用子查询。我确定要修复,但我无法解决它因为我的水平太低了。我希望你帮助我:)谢谢

2 个答案:

答案 0 :(得分:0)

1

SELECT NISTINCT END_DATE FROM CONTRACTS SSN = NEW.SSN 可能会返回一条或多条可能导致问题的记录。

2

在创建触发器的触发器中从同一表中选择可能会导致问题。

由于

答案 1 :(得分:0)

关于Using Triggers的芦苇 你不能设置:OLD。 values - 这是只读值(:旧值是更新前更新行的值)... 可能你试试这个

update CONTRACTS set END_DATE = :NEW.START_DATE 
where SSN = :NEW.SSN and END_DATE < :NEW.START_DATE and someid <> nvl(:OLD.someid, :NEW.someid)