2017-09-25 5 views
2
create or replace trigger trig1 
before delete or insert or update on students 
begin 
if(To_char(sysdate,'day') = 'monday' then 
raise_application_error(-20500,'table is secured'); 
end if; 
end; 

トリガーを作成しましたが、mondayでは機能しません。テーブルに対してDMLアクションを実行します。私は1つの解決策を見つけました - 日の代わりにdyを使用する - なぜですか?なぜsysdateの日がplsqlトリガで月曜日に働いていないのですか?

+1

構文エラーです。異なる数の "("と ")"。 – jarlh

+0

おそらく国際化の設定です。 –

答えて

4

2つの理由があります。

あなたがなり、その後dayを使用し、最長の名前にブランクが埋め込まれ、これを避けるために

SELECT '"'||To_char(sysdate, 'day')||'"' 
FROM dual; 

"monday " 

使用'fmday'を試してみてください。

次に、TO_CHAR()の結果は、現在のユーザーセッションNLS_DATE_LANGUAGEの設定に依存します。現在のユーザーセッションの設定から独立するために、

To_char(sysdate, 'fmday', 'NLS_DATE_LANGUAGE = american') = 'monday'` 

を使用してください。

0

あなたは代わりに一日数を扱うことができます:

create or replace trigger trig1 
before delete or insert or update on students 
begin 
if(To_char(sysdate,'d') = '2' then 
raise_application_error(-20500,'table is secured'); 
end if; 
end; 

ドキュメント:https://docs.oracle.com/database/121/SQLRF/sql_elements004.htm#SQLRF00210

D - 曜日(1-7)。この要素は、セッションのNLS領域に依存します。

3

Wernfried Domscheit has answered "why"クエリが機能していません(TO_CHAR(datevalue, 'DAY')はスペースで右パディング)。

クエリが国際的に使用されている場合に破損する可能性があるNLS_DATE_LANGUAGEおよびNLS_TERRITORYの設定ではなく、日付を切り捨てて、これらの設定とは独立したISO-週(常に月曜日)の開始時刻と比較することができます:

create or replace trigger trig1 
before delete or insert or update on students 
begin 
    IF TRUNC(SYSDATE) = TRUNC(SYSDATE, 'IW') THEN 
    raise_application_error(-20500,'table is secured'); 
    END IF; 
end; 
/
関連する問題