2017-03-20 10 views
0

別の表からのエントリに基づいて別の表にデータを挿入するためのトリガーを作成しました。トリガが作成されますが、テーブルに値を入力すると、以下のエラーが発生します。トリガーが作成されましたが、新しいエントリの挿入後に機能しません。 ORA-04091エラーが表示されました

ORA-04091:表OOMUSER.EMTN_EVC_PAIR_STATUSトリガー/機能、変異され

ORA-06512、それが表示されないことがあります。 "OOMUSER.PORTSTATUSUPDATE" で、ライン22

ORA-04088:エラートリガー 'OOMUSER.PORTSTATUSUPDATE'

DROP TRIGGER OOMUSER.PORTSTATUSUPDATE; 

CREATE OR REPLACE TRIGGER OOMUSER.PORTSTATUSUPDATE 
AFTER INSERT 
ON OOMUSER.EMTN_EVC_PAIR_STATUS  FOR EACH ROW 
DECLARE 
LEGA VARCHAR2(20); 
LEGB VARCHAR2(20); 
ACTIVEPAIRA NUMBER; 
ACTIVEPAIRB NUMBER; 
BEGIN 
SELECT EELA.CPE_PORT_SERVICE_ID INTO LEGA FROM EMTN_EVC_LEG_A EELA WHERE EELA.EMTN_EVC_PAIRID = :NEW.EMTN_EVC_PAIRID; 
SELECT EELB.CPE_PORT_SERVICE_ID INTO LEGB FROM EMTN_EVC_LEG_B EELB WHERE EELB.EMTN_EVC_PAIRID = :NEW.EMTN_EVC_PAIRID; 

IF (:NEW.STATUS = 'Active' OR :NEW.STATUS = 'Planned') 
THEN  
    INSERT INTO OOMUSER.EMTN_ETN_CPE_PORT_STATUS 
     (CPE_PORT_SERVICE_ID,STATUS,STATUS_START_DATETIME) 
     VALUES(LEGA,:NEW.STATUS,SYSDATE); 
    INSERT INTO OOMUSER.EMTN_ETN_CPE_PORT_STATUS 
     (CPE_PORT_SERVICE_ID,STATUS,STATUS_START_DATETIME) 
     VALUES(LEGB,:NEW.STATUS,SYSDATE); 

ELSIF(:NEW.STATUS = 'Rejected' OR :NEW.STATUS = 'Cancelled') 
THEN 
    SELECT COUNT(OVEDS.EMTN_EVC_PAIRID) INTO ACTIVEPAIRA FROM OOM_VW_EMTN_DUALEVC_STATUS OVEDS WHERE OVEDS.EMTN_EVC_PAIRID IN 
    (
     SELECT EELA.EMTN_EVC_PAIRID FROM EMTN_EVC_LEG_A EELA WHERE EELA.CPE_PORT_SERVICE_ID = 
     (
      SELECT EELA.CPE_PORT_SERVICE_ID FROM EMTN_EVC_LEG_A EELA WHERE EELA.EMTN_EVC_PAIRID = :NEW.EMTN_EVC_PAIRID 
     ) 
    ) AND UPPER(OVEDS.STATUS) IN ('ACTIVE','PLANNED'); 

    IF(ACTIVEPAIRA = 0) 
    THEN 
     INSERT INTO OOMUSER.EMTN_ETN_CPE_PORT_STATUS 
      (CPE_PORT_SERVICE_ID,STATUS,STATUS_START_DATETIME) 
      VALUES(LEGA,:NEW.STATUS,SYSDATE); 
    END IF; 

    SELECT COUNT(OVEDS.EMTN_EVC_PAIRID) INTO ACTIVEPAIRB FROM OOM_VW_EMTN_DUALEVC_STATUS OVEDS WHERE OVEDS.EMTN_EVC_PAIRID IN 
    (
     SELECT EELB.EMTN_EVC_PAIRID FROM EMTN_EVC_LEG_B EELB WHERE EELB.CPE_PORT_SERVICE_ID = 
     (
      SELECT EELB.CPE_PORT_SERVICE_ID FROM EMTN_EVC_LEG_B EELB WHERE EELB.EMTN_EVC_PAIRID = :NEW.EMTN_EVC_PAIRID 
     ) 
    ) AND UPPER(OVEDS.STATUS) IN ('ACTIVE','PLANNED'); 

    IF(ACTIVEPAIRB = 0) 
    THEN 
     INSERT INTO OOMUSER.EMTN_ETN_CPE_PORT_STATUS 
      (CPE_PORT_SERVICE_ID,STATUS,STATUS_START_DATETIME) 
      VALUES(LEGB,:NEW.STATUS,SYSDATE); 
    END IF; 

END IF; 

END; 
/
+0

トリガーの内側には、2つのインサートがあります。これらのテーブルのいずれかに、これらの挿入物に発生するトリガーがありますか?もしそうなら、emtn_evc_pair_status上のこれらのトリガーのどこかにselect文がありますか? – Rene

+0

これをお読みください。 https://www.techonthenet.com/oracle/errors/ora04091.php – Utsav

+0

@Rene:これはemtn_evc_pair_statusテーブルの唯一のトリガーではありません –

答えて

1

の実行中に、その行22 ayssあなたのエラーメッセージが問題です:

ORA-06512:「OOMUSER.PORTSTATUSUPDATE」で、トリガー本体のソースコードの行番号を考え出すライン22

それはStackOverflowのに貼り付けられている場合は特に、正確な科学ではありませんが、万が一、

SELECT COUNT(OVEDS.EMTN_EVC_PAIRID) INTO ACTIVEPAIRB FROM OOM_VW_EMTN_DUALEVC_STATUS OVEDS WHERE OVEDS.EMTN_EVC_PAIRID 

OOM_VW_EMTN_DUALEVC_STATUSの図である:line 22トラブルとしてこの行を示していることをもっともらしく思えますか?もしそうなら、それはどのテーブルに依存していますか?私の推測はそこにEMTN_EVC_PAIR_STATUSの機能です。

+0

にトリガがありません。 OOM_VW_EMTN_DUALEVC_STATUSはビューであり、この問題を回避するために行うことができ、この同じビューを使用することができるデータ –

+0

のEMTN_EVC_PAIR_STATUSテーブルに依存していますか? –

+1

少なくともトリガーではありません。明らかに私はあなたが実装しようとしているビジネスロジックを理解していませんが、それはトリガーのためには複雑すぎるようです。トリガー挿入を含むすべてを処理するストアドプロシージャを持つことを検討する必要があります。 – APC

関連する問題