【问题标题】:creating a trigger in oracle that uses data from another table在 oracle 中创建使用另一个表中的数据的触发器
【发布时间】:2014-02-25 12:03:02
【问题描述】:

我正在尝试在名为 race 的表中创建一个触发器,该触发器强制执行“STARTDATE

换句话说,比赛表中的 startdate 必须小于或等于会议表的 enddate(STARTDATE 不能在此日期之后运行!)

我希望在向比赛表添加记录并且输入的开始日期错误时触发触发器(开始日期在会议表的结束日期之后)

到目前为止,我已经创建了这个,但我不知道我是否正确或如何完成它!

CREATE OR REPLACE TRIGGER race_date_trg    
BEFORE INSERT OR UPDATE
  ON RACE
  FOR EACH ROW
  WHEN (NEW.RACEID)
   DECLARE STARTDATE DATE;
  BEGIN
    SELECT * FROM meeting INTO VARIABLE
    IF STARTDATE <= ENDDATE THEN
      INSERT INTO RACE (STARTDATE) VALUES (:n.startdate);
    else
  end (race_date_trg);

感谢您的帮助!

【问题讨论】:

  • 您的代码中有几个语法错误。也许this document 会有所帮助。

标签: sql oracle plsql triggers


【解决方案1】:

你的触发器有很多错误。

  1. 你不必声明 STARTDATE 变量,你应该使用 :new.STARTDATE
  2. 表达式 WHEN (:new.RACEID) 错误
  3. 您必须在选择之前声明 VARIABLE。
  4. 您的触发器不应插入 Race。如果开始日期不正确,您可能会引发错误。

触发器可能如下所示:

CREATE OR REPLACE TRIGGER race_date_trg    
BEFORE INSERT OR UPDATE
  ON RACE
  FOR EACH ROW
  DECLARE
    MEETING_ENDDATE DATE;
  BEGIN
    SELECT ENDDATE INTO MEETING_ENDDATE FROM meeting;
    IF :NEW.STARTDATE > MEETING_ENDDATE THEN
      RAISE_APPLICATION_ERROR(-20000, 'Wrong start date!');
    END IF:
  end race_date_trg;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-06-29
    • 1970-01-01
    • 1970-01-01
    • 2018-12-02
    • 2019-05-13
    • 2016-12-27
    • 2015-07-29
    • 1970-01-01
    相关资源
    最近更新 更多