2016-12-06 3 views
0

を発射しながら、テーブルのエラーを突然変異このトリガーが起動されている間、私はエラーORA-04091を受け取る:トリガー

CREATE OR REPLACE TRIGGER SendNotifications 
     AFTER UPDATE OF penalty_amount ON Penalites 
     FOR EACH ROW 
    DECLARE 
     phone_no number(9,0); 
     BEGIN 
      SELECT PHONE_NUMBER INTO phone_no 
      FROM ADRESSES 
      INNER JOIN ORDERS 
       ON adresses.ID_READER = orders.ID_READER 
      INNER JOIN PENALITES 
       ON orders.ID_ORDER = penalites.ID_ORDER 
      WHERE :new.ISPAID = 'N'; 

      DBMS_OUTPUT.PUT_LINE('Phone numbers where selected.'); 
     END; 
    /

私は私が使用する必要がありますね:新しいです。と:古い。私はそれに対処する方法がわかりません。何か提案や出発点を教えていただけますか?

+1

あなたは何を達成しようとしていますか?まず、ローカル変数にデータを選択したり、カーソルを開いたりしない限り、 'select'文を使用することはできません。トリガーは呼び出し側に何も返すことができないので、 'sys_refcursor'を開いて返すことはできません。カーソルループを作成し、修正されている 'penalty'行に関連する行だけを処理したい場合は、' penalties'への結合を削除し、 'orders.id_order =:new.id_order'を使用しますが、私はそれがあなたが本当に欲しいものなのか分からない。 –

+0

これをローカル変数に選択します。私は自分の投稿を更新しました。 – monterinio

答えて

0

トリガーのSELECTステートメントが、トリガーが定義されているテーブルPENALTIESからデータを取得しようとしています。このような行トリガーは、定義されている表からデータを検索することはできません。

  1. は、SELECT文からPENALTIESを削除FOR EACH ROW、または
  2. を除去することによって、この文トリガーください:あなたは3つのオプションがあります。この文は同等の操作を行うだろうと思わ:

    SELECT PHONE_NUMBER FROM ADRESSES INNER JOIN ORDERS ON adresses.ID_READER = orders.ID_READER WHERE :new.ISPAID = 'N' AND orders.ID_ORDER = :new.ID_ORDER;

  3. は、複合トリガーにこれを変換します。 See this answer for details

運が良かった。

+0

2番目の選択肢が最も速いと思われますが、残りの部分も確認します。ありがとうございました。 – monterinio