2017-03-16 5 views
-2

テーブルにAFTER TRIGGERを作成し、そのテーブルをSELECTクエリで使用しても、テーブルの変更に誤りはありませんか?トリガされたテーブルへの参照を使用してTRIGGERを作成する方法はありますか?

私が使用したいクエリの例。それは店なので、私もステップ出現回数をカウントするために必要とされるためにレコードを挿入してい

CREATE OR REPLACE TRIGGER COUNT_STEP 
    AFTER INSERT 
    ON STEPS 
    FOR EACH ROW 
    DECLARE 
    V_COUNT_SETP VARCHAR (10000); 
BEGIN 
    SELECT COUNT (STATUS_NAME) 
     INTO V_COUNT_SETP 
     FROM (SELECT A.ALERT_ID, S.STATUS_NAME 
       FROM ALERTS A, ALERT_STATUSES S, STEPS ST 
       WHERE  :NEW.ALERT_INTERNAL_ID = A.ALERT_INTERNAL_ID 
        AND ST.ALERT_STATUS_INTERNAL_ID = S.STATUS_INTERNAL_ID 
        AND S.STATUS_NAME IN ('Auto Escalate')) 
    GROUP BY ALERT_ID; 

    UPDATE ALERTS A 
     SET A.COUNT = V_COUNT_ESC 
    WHERE A.ALERT_INTERNAL_ID = :NEW.ALERT_INTERNAL_ID; 
END;  
/

テーブル: このクエリは、特定のステータスの名前は、アラートのライフサイクルに現れて回数を更新しますアラートIDとそれが持っていたすべてのステップID。

+0

質問を投稿する前に、[ask]と[mcve]でlokを持ってください。あなたの質問を改善するために、トリガが何をすべきか、何を試したのか、問題があるかを明確に記述する小さなサンプルを作成しようとします。 – Aleksej

+0

アラートテーブルからステップおよび/またはalert_statusesへの参加が不足しているようですテーブル。それは間違っているようだ。また、STEPS.ALERT_INTERNAL_ID列に固有の値が含まれていますか? – Boneist

+0

@Boneist私は警告のための結合がと思った:NEW.ALERT_INTERNAL_ID = A.ALERT_INTERNAL_ID – nfrank

答えて

0

あなたの質問は少しだけ明確にする必要があります。しかし、私が理解したところでは、テーブルにトリガを作成し、その同じテーブルに対してselectを実行する必要があります。これは、あなたに突然のテーブルエラーを与えます。それを回避するには、そのテーブルで複合トリガーを実行する必要があります。このような何か:

create or replace trigger emp_ct 
for insert on employees compound trigger 

    v_count number; -- Add variable here 

    before statement is 
    begin 
    -- PERFORM YOUR SELECT AND SEND TO A VARIABLE 
    end before statement; 


    after each row is 
    begin 
    -- DO WANT YOU WANTED TO DO. USE THE VARIABLE 
    end after each row; 
end; 

基本的には、複合トリガーで、あなたはすべてのトリガイベントをキャプチャすることができます。これを行うことで、キャプチャしているテーブルを照会することができます。

+0

afterステートメントのbeforeステートメントから選択した値を使用する方法がわかりません。 SELECT COUNT(...)を実行している場合は、後に続くUPDATEステートメントでこの値を更新するにはどうすればいいですか? – nfrank

+0

私は変数の宣言を追加しました。 –

+0

ありがとう!あなたはちょうど私の日を作った! :) – nfrank

関連する問題