我需要创建一个触发器来检查参与者的年龄(以年为单位)是否高于他/她参与的比赛的最低年龄。为此,我需要从参与者表格中获取信息比赛表。我需要将此触发器添加到结果表中 这是我的表:
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;
任何帮助都非常感谢!
答案 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”
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。