2016-12-06 15 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'行有關的行,你可以刪除這個連接到'penalty'並使用'orders.id_order =:new.id_order',但是我我不確定那是你真正想要的。 –

+0

我想選擇這個到局部變量。我更新了我的帖子。 – monterinio

回答

0

觸發器中的SELECT語句試圖從PENALTIES(檢索觸發器的表格)檢索數據。像這樣的行觸發器不允許從它們定義的表中檢索數據。你有三個選擇:

  1. 將此聲明觸發通過移除FOR EACH ROW,或
  2. SELECT語句刪除PENALTIES。看來,這個聲明會做相同的:

    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

看來,第二個選項是最快的,但我會檢查其餘的。謝謝。 – monterinio