2016-04-16 15 views
0

、より多くのであれば、私はテーブルを作成しました:SQLのトリガーチェック年齢は、Oracleデータベースを使用した16

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 Iであるだろうトリガーをしたいと思いますこのトリガを持って、それは動作しません。私は

ALTER SESSION SET NLS_DATE_FORMAT = 'DD-MM-YYYY'; 

任意の提案を使用して日付の書式を変更しているかもしれないので、

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; 
/

+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 
    . . . 
関連する問題