2017-05-21 2 views
1

に基づいてトリガーを作成しようとしてい私は(8-18時間または日曜日以外すなわち、)営業時間外に行われた場合、挿入、更新および削除を妨げるトリガーを作成しようとしている曜日と時刻

ここに私のコードです:

CREATE OR REPLACE TRIGGER HOLIDAY 
BEFORE DELETE OR INSERT OR UPDATE ON DEPT FOR EACH ROW 
BEGIN 
IF ((EXTRACT(DAY FROM SYSDATE)='SUNDAY') OR (EXTRACT(HOUR FROM LOCALTIMESTAMP) NOT BETWEEN 8 AND 18)) THEN 
    RAISE_APPLICATION_ERROR(-20001,'ILLEGAL OPERATION - OUT OF OFFICE HOURS OR HOLIDAY!'); 
END IF ; 
END; 
/

トリガーが作成されました。 今日は日曜日で、私は行を挿入しようとすると、アプリケーションエラーではなく、私が得るものである、調達されていません。

SQL> @/home/divya/A43.SQL 

Trigger created. 

SQL> DELETE FROM DEPT WHERE D_NO = 'D3' ; 
DELETE FROM DEPT WHERE D_NO = 'D3' 
      * 
ERROR at line 1: 
ORA-06502: PL/SQL: numeric or value error: character to number conversion error 
ORA-06512: at "DIVYA12345.HOLIDAY", line 2 
ORA-04088: error during execution of trigger 'DIVYA12345.HOLIDAY' 

エラーです正確に何を教えてくださいsomeeoneことはできますか?エラーを表示する - エラーは出力されません。どんな助けも高く評価されます。前もって感謝します。

+0

さておき、ロジックがあまりにも修正する必要があります。このコードは、時間が8〜18であるため、18:45に挿入されます。 – mathguy

+0

あなたはありがとう! – user8029928

答えて

1

EXTRACT(DAY FROM SYSDATE)は、その名前ではなく月の番号を返すため、エラーが発生します。コメントで示唆したように名前を取得するには、代わりにTO_CHAR(SYSDATE, 'DAY')、またはto_char(sysdate,'fmDY', 'nls_date_language = ENGLISH')を使用することができます。

CREATE OR REPLACE TRIGGER HOLIDAY 
BEFORE DELETE OR INSERT OR UPDATE ON DEPT FOR EACH ROW 
BEGIN 
IF (TO_CHAR(sysdate,'fmDY', 'nls_date_language = ENGLISH')='SUNDAY') OR (EXTRACT(HOUR FROM LOCALTIMESTAMP) NOT BETWEEN 8 AND 18)) THEN 
    RAISE_APPLICATION_ERROR(-20001,'ILLEGAL OPERATION - OUT OF OFFICE HOURS OR HOLIDAY!'); 
END IF ; 
END; 
/
+2

安全を期すために、私は 'to_char(sysdate、 'fmDY'、 'nls_date_language = ENGLISH')'を使います。そうしないと、セッションの日付設定が異なるエンドユーザーがトリガーを超えてしまう可能性があります。 –

+0

@WilliamRobertsonは正しいですが、理由はありません:)実際には、TO_CHAR(SYSDATE、 'DAY') 'は 'SUNDAY'と等しくないので' fm'を使用する必要があります - 'DAY'は実際には '' SUNDAY ''と同じです。 –

+0

@JeffreyKemp - そうです。私はいつもこのために 'fmDy'を使う第二の理由があることを知っていました。フランス語のデスクトップを持つユーザーがDimancheでそれを実行する場合には、言語を指定する価値があります:) –

関連する問題