使用Oracle数据库,我创建了一个表:
CREATE TABLE PLAYER (
PID number NOT NULL,
FIRSTNAME varchar2(100) NOT NULL,
SURNAME varchar2(100) NULL,
DATEOFBIRTH date NULL,
EXPERIENCE integer NULL,
CONSTRAINT PLAYER_PK PRIMARY KEY (PID)
) ;
我想制作一个触发器来检查玩家的年龄是否超过16岁。我有这个触发器,它不起作用。
CREATE OR REPLACE TRIGGER t_DATE_BIRTH
BEFORE INSERT ON PLAYER
FOR EACH ROW
BEGIN
if (extract(year from (sysdate-:new.DATEOFBIRTH) year to month )<16) then
dbms_output.put_line ('Player must be above 16 years old ');
rollback;
end if
END;
/
也许是因为我使用
更改了日期的格式ALTER SESSION SET NLS_DATE_FORMAT = 'DD-MM-YYYY';
有什么建议吗?
答案 0 :(得分:2)
日期的格式无关紧要。相反,引发错误:
CREATE OR REPLACE TRIGGER t_DATE_BIRTH
BEFORE INSERT ON PLAYER
FOR EACH ROW
BEGIN
if (extract(year from (sysdate-:new.DATEOFBIRTH) year to month ) < 16) then
RAISE_APPLICATION_ERROR -20002, 'Player must be above 16 years old');
end if;
END;
一般来说,检查年龄的更好方法不仅仅是使用年份。我建议:
if add_months(:new.DateOfBirth, 16*12) >= sysdate then
. . .