Sql触发器检查年龄是否超过16

时间:2016-04-16 15:20:55

标签: sql oracle11g

使用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';

有什么建议吗?

1 个答案:

答案 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
    . . .