【问题标题】:Solution of this easy trigger这个简单的触发器的解决方案
【发布时间】:2016-07-22 05:50:47
【问题描述】:

我的触发器有问题(我是 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 developers 说在这种情况下不允许子查询。我确定是要修复,但我无法解决,因为我的水平太低了。我希望你能帮助我:) 谢谢

【问题讨论】:

  • 这是一个警告,显示 它可能返回超过 1 条记录
  • 如果您认为可以更改旧的开始日期,那么您对触发器的理解存在根本性的误解。

标签: sql oracle oracle11g


【解决方案1】:

1.

从 SSN = NEW.SSN 的合同中选择 DISTINCT END_DATE 可能返回一个或多个可能导致问题的记录。

2.

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

谢谢

【讨论】:

  • 是的,这就是问题所在 :) 谢谢
【解决方案2】:

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

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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-05
    • 2010-12-28
    • 1970-01-01
    • 1970-01-01
    • 2012-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多