1

AFTER UPDATE で実行されるトリガーがあります。思い通りにいかない。

null 許容型のフィールドで値が変更されたかどうかを確認するにはどうすればよいですか? null 許容型の次のフィールドがあります。

FRM_DATE   DATE
FRM_TIME   DATE
THE_DATE   DATE
THE_TIME   NUMBER(4,2)
THE_BOOL   NUMBER(2)

上記のフィールドの値が実際に変更された場合にのみ、一連のロジックを実行したいと思います。値が同じ場合、コードを実行したくありません。したがって、UI から、フィールドの 1 つに値があり、ユーザーがそれを削除して (現在は NULL になります)、送信ボタンを押した場合、変更が行われたためにロジックを実行したいとします。

私は次のことを試しましたが、私が望むロジックを実行しません:

IF (nvl(:old.FRM_DATE, '') <> nvl(:new.FRM_DATE,'')) THEN
   --My logic
END IF;

私も試しました

IF (nvl(:old.FRM_DATE, NULL) <> nvl(:new.FRM_DATE,NULL)) THEN
  --My logic
END IF;

何か案は?

敬具、

4

4 に答える 4

3

Oracle では、null と空の文字列''事実上同等です。

Oracle Databaseは現在、長さがゼロの文字値をNULLとして扱います。ただし、これは今後のリリースでは当てはまらない可能性があるため、空の文字列を null と同じように扱わないことをお勧めします。

...つまり、2 つのチェックは実際には同じです。どちらの場合もnvl(something, null)、あまり意味がありません。「値がnullの場合はnullにする」と言っていますが、これは冗長であり、実際の変換は行いません。したがって、古い値または新しい値のいずれかが null の場合でも、null をそれ自体または null 以外の値と比較しようとしています。そしてサンが言ったように、等価条件を使用して null を何かと比較することはできません

San が示すように、魔法の値を使用することもできますが、それが実際にデータに表示されることは決してないことを確認する必要があります。明示的にチェックすると、より安全になり、意図がより明確になりますis null

IF (:old.FRM_DATE IS NULL AND :new.FRM_DATE IS NOT NULL)
  OR (:old.FRM_DATE IS NOT NULL AND :new.FRM_DATE IS NULL)
  OR :old.FRM_DATE != :new.FRM_DATE
THEN
...
于 2015-02-10T09:59:14.647 に答える
0

null を null と比較したり、null を他の値と比較したりすることはできません。ロジックを次のように変更してください。

IF (nvl(:old.FRM_DATE, to_date('01-01-1900', 'dd-mm-yyyy')) <> nvl(:new.FRM_DATE,to_date('01-01-1900', 'dd-mm-yyyy'))) THEN
   --My logic
END IF;
于 2015-02-10T09:43:55.453 に答える
0

念のため、追加の推奨事項。使用するトリガーの種類を確認しますか? つまり、行トリガーまたはステートメントトリガーです。列のトリガーの例も確認できます。

列の更新時の Oracle SQL トリガー

于 2015-02-10T11:18:28.103 に答える