从oracle sql中的两个单独的表中检查age触发器

时间:2014-03-12 12:34:34

标签: sql oracle plsql triggers

我需要创建一个触发器来检查参与者的年龄(以年为单位)是否高于他/她参与的比赛的最低年龄。为此,我需要从参与者表格中获取信息比赛表。我需要将此触发器添加到结果表中 这是我的表:

CREATE TABLE race 
( 
RaceID int, 
Location varchar2 (60), 
StartDate Date, 
RaceTime Date, 
MinAge int, 
);

CREATE TABLE participant
(
ParticipantID int,
"Name" varchar2 (60),
DateOfBirth date,
Sex varchar2 (1),
Age int
);

CREATE TABLE results
(
RaceID int not null unique,
ParticipantID int not null unique,
position number (2)
);

这是我到目前为止所创造的内容:

 create or replace TRIGGER dob_trg
  BEFORE INSERT OR UPDATE ON RESULTS
  FOR EACH ROW
DECLARE
RACE_MINAGE NUMBER;
PARTICIPANT_AGE NUMBER;
BEGIN
  SELECT RACE.MINAGE, PARTICIPANT.AGE
    INTO RACE_MINAGE, PARTICIPANT_AGE
    FROM RACE PARTICIPANT
   WHERE RACE.RACEID = :NEW.RACEID; 
  IF : NEW.AGE < : NEW.MINAGE THEN
    RAISE_APPLICATION_ERROR(-20000, 'Participant too young!');
  END IF;
enddob_trg;

但是我收到以下错误 错误(9,6):PLS-00103:遇到符号&#34;:&#34;

任何帮助都非常感谢!

2 个答案:

答案 0 :(得分:1)

Erros:

表格竞赛 - MinAge col

结尾处有一个额外的逗号
CREATE TABLE race 
( 
RaceID int, 
Location varchar2 (60), 
StartDate Date, 
RaceTime Date, 
MinAge int, 
);

内部触发错误:

IF : NEW.AGE < : NEW.MINAGE THEN <应该

IF :NEW.AGE < :NEW.MINAGE THEN

您的创建触发器位于表结果上,但操作是在名为AGE的列上进行的,该列属于参与者表。
在前进之前修正这个逻辑。

触发器内还有一个错误:

FROM RACE PARTICIPANT


在表格之间添加逗号

固定触发器

- 我认为你的触发器应该是什么样的!
编译并试一试 看我的逻辑:
此查询将使用谓词“NEW.ParticipantID”

存储minage的值
  SELECT RACE.MINAGE, PARTICIPANT.AGE
            INTO RACE_MINAGE, PARTICIPANT_AGE
            FROM RACE, PARTICIPANT
           WHERE RACE.RACEID = :NEW.ParticipantID;

这一部分: - 如果RACE_MINAGE大于或等于

IF :NEW.AGE <= RACE_MINAGE THEN
        RAISE_APPLICATION_ERROR(-20000, 'Participant too young!');
      END IF;

完成触发

  CREATE OR REPLACE TRIGGER dob_trg
  BEFORE INSERT OR UPDATE ON participant
  FOR EACH ROW
DECLARE
RACE_MINAGE NUMBER;
PARTICIPANT_AGE NUMBER;
BEGIN
  SELECT RACE.MINAGE, PARTICIPANT.AGE
    INTO RACE_MINAGE, PARTICIPANT_AGE
    FROM RACE, PARTICIPANT
   WHERE RACE.RACEID = :NEW.ParticipantID;
   exception
  when NO_DATA_FOUND then
   NULL; -- or do something else you choose
  IF :NEW.AGE <= RACE_MINAGE THEN
    RAISE_APPLICATION_ERROR(-20000, 'Participant too young!');
  END IF;
  end;

答案 1 :(得分:0)

IF : NEW.AGE < : NEW.MINAGE THEN

您应该删除:符号后面的空格。

IF :NEW.AGE < :NEW.MINAGE THEN

此外,您似乎在FROM子句中缺少逗号:

FROM RACE PARTICIPANT

但这不会使你的代码工作,因为你正在测试你的IF语句中的错误字段。此外,您没有过滤参与者ID。