2016-04-02 10 views
-4

私はトリガーに問題があります(オラクルの新機能) このトリガーでは、新しい契約を挿入するときに、この契約の開始日がこのユーザーの他の契約の終了日より前であることが必要ですトリガーは、古いend_dateを新しい契約のstart_dateに変更する必要があります。この簡単なトリガーの解決

CREATE OR REPLACE TRIGGER Date_contracts 
    BEFORE INSERT OR UPDATE OF START_DATE ON CONTRACTS 
    FOR EACH ROW 
    BEGIN 
     IF :NEW.START_DATE < (SELECT DISTINCT END_DATE FROM CONTRACTS WHERE SSN = NEW.SSN) 
     THEN OLD.END_DATE := NEW.START_DATE; 
     END IF; 
    END; 
    /

とSQL developresは、サブクエリはこのコンテキストで許可されていないことを言う:

は、ここに私のコードです。私は修理することを確信していますが、私のレベルがとても低いので解決できません。私はあなたが

+0

それは**それは1つの以上のレコードを返すことがあります示した警告です* * –

+0

古い開始日を変更できると考えると、基本的なトリガーの誤解があります。 –

答えて

0

1.

はSSN = NEW.SSN がprobleを引き起こすことができる1つのまたは複数のレコードが返される場合がある契約からDISTINCT END_DATEを選択感謝:)私を助け願っています。

2.

トリガーが作成されたトリガー内で同じテーブルから選択すると、問題が発生することがあります。

おかげ

+0

はい、これは問題でした:)ありがとう – Nogus

0

リードあなたが設定程度Using Triggers
カント:OLD。値 - この読み取り専用の値: はおそらくあなたがしてみてください...(古い値は更新前の更新された行の値である)、これは

update CONTRACTS set END_DATE = :NEW.START_DATE 
where SSN = :NEW.SSN and END_DATE < :NEW.START_DATE and someid <> nvl(:OLD.someid, :NEW.someid) 
関連する問題