2016-08-03 12 views
0

Ich habe zwei Ansätze versucht. Zuerst verwende ich gespeicherte Prozedur im Trigger aufgerufen werden.Fehler aktualisieren oder aktualisieren materialisierte Ansicht mit Trigger

CREATE OR REPLACE TRIGGER MV_BANK_CODE_UPDATE 
AFTER UPDATE OR INSERT OR DELETE OF APPROVAL_STATUS ON BANK_CODES 
FOR EACH ROW 
    BEGIN 


    SP_UPDATE_MV_BANK_CODES; 


    END; 
/

Stored Procedure:

CREATE OR REPLACE PROCEDURE SP_UPDATE_MV_BANK_CODES IS 


BEGIN 

DELETE MV_BANK_CODES; 
COMMIT; 
INSERT MV_BANK_CODES 
(SELECT DISTINCT 
     bankcodeeo.clearing_area, 
     bankcodeeo.bank_code, 
     bankcodeeo.bank_code_id, 
     bankcodeeo.bank_name, 
     bankcodeeo.office_code, 
     bankcodeeo.bank_address, 
      oldaccounteo.office_code 
     || '.' 
     || oldaccounteo.gl_account_no 
     || '.' 
     || oldaccounteo.sl_account_no 
     || '.' 
     || oldaccounteo.currency_code 
     || '.' 
     || oldaccounteo.department_code 
     || '.' 
     || oldaccounteo.working_unit_code 
     || '.' 
     || oldaccounteo.project_code 
      AS new_ind_account_no, 
     /*tcgleo.*/ 
     '9' AS position, 
     transactioncodeeo.transaction_code, 
     oldaccounteo.gl_account_no, 
     oldaccounteo.sl_account_no, 
     oldaccounteo.currency_code, 
     oldaccounteo.department_code, 
     oldaccounteo.working_unit_code, 
     oldaccounteo.project_code, 
     oldaccounteo.old_ind_account_no, 
     oldaccounteo.old_ind_account_name, 
     transactioncodeeo.forex_type_flag, 
     transactioncodeeo.forex_type, 
     glaccounteo.gl_account_type AS classification_flag, 
     bankcodeeo.member_code, 
     oldaccounteo.category_code, 
     glaccounteo.normal_position, 
     transactioncodeeo.source_account_flag, 
     transactioncodeeo.usage_forex, 
     bankcodeeo.member_type, 
     TRANSACTIONCODEEO.CURRENCY_TYPE 
    FROM bank_codes bankcodeeo 
     INNER JOIN old_accounts oldaccounteo 
      ON  bankcodeeo.account_no = oldaccounteo.old_ind_account_no 
      AND oldaccounteo.approval_status = '2' 
      AND oldaccounteo.activation_status = '1' 
     INNER JOIN gl_sl_accounts glsleo 
      ON  glsleo.gl_account_no = oldaccounteo.gl_account_no 
      AND glsleo.sl_account_no = oldaccounteo.sl_account_no 
      AND glsleo.approval_status = '2' 
      AND glsleo.activation_status = '1' 
     INNER JOIN gl_accounts glaccounteo 
      ON  glaccounteo.gl_account_no = glsleo.gl_account_no 
      AND glaccounteo.approval_status = '2' 
      AND glaccounteo.activation_status = '1' 
     INNER JOIN tc_gl tcgleo 
      ON tcgleo.gl_account_no = glaccounteo.gl_account_no 
     INNER JOIN transaction_codes transactioncodeeo 
      ON  transactioncodeeo.transaction_code = tcgleo.transaction_code 
      AND transactioncodeeo.approval_status = '2' 
      AND transactioncodeeo.activation_status = '1' 
WHERE bankcodeeo.approval_status = '2' 
     AND bankcodeeo.activation_status = '1'); 

     COMMIT; 

END; 
/

Wenn ich Tabelle aktualisiert BANK_CODE, bekam ich einen Fehler:

ORA-01732: data manipulation operation not legal on this view 
ORA-06512: at "SP_UPDATE_MV_BANK_CODES", line 6 
ORA-06512: at "MV_BANK_CODE_UPDATE", line 3 
ORA-04088: error during execution of trigger 'MV_BANK_CODE_UPDATE' 

Zweitens habe ich DBMS_MVIEW.REFRESH:

CREATE OR REPLACE TRIGGER MV_BANK_CODE_UPDATE_X 
AFTER UPDATE OR INSERT OR DELETE OF APPROVAL_STATUS ON BANK_CODES 

FOR EACH ROW 
    BEGIN 

    DBMS_MVIEW.REFRESH('MV_BANK_CODES'); 

    END MV_BANK_CODE_UPDATE_X; 
/

Als ich Aktualisierung ed Tabelle BANK_CODE, bekam ich einen Fehler:

ORA-04092: cannot COMMIT in a trigger 
ORA-06512: at "SYS.DBMS_SNAPSHOT", line 3014 
ORA-06512: at "SYS.DBMS_SNAPSHOT", line 2994 
ORA-06512: at "MV_BANK_CODE_UPDATE_X", line 3 
ORA-04088: error during execution of trigger 'MV_BANK_CODE_UPDATE_X' 

Was soll ich tun?

Antwort

0

Möglicherweise verstehe ich Ihre Anforderung, Sie müssen die materialisierte Ansicht MV_BANK_CODES aktualisieren, wenn dml-Vorgänge in der Tabelle BANK_CODES auftreten.

Ein paar Punkte müssen Sie

  1. Zunächst einmal keine Notwendigkeit, beachten Sie manuell Code zu schreiben, die MV mit Trigger zu aktualisieren.
  2. Wir können nicht in Triggern Commit/Rollback tun.
  3. DBMS_MVIEW.REFRESH verpflichtet implizit, daher ist es nicht möglich, innerhalb Trigger

BAD Lösungen zu begehen: Sie es, indem Sie PRAGMA AUTONOMOUS Block innerhalb des Trigger tun, die die insert/update behandelt/Löschen innerhalb der MV als separate Transaktion, und daher wird der mv nicht festgeschriebene Daten haben, und wenn etwas danach fehlschlägt, werden die mv-Daten nicht zurückgesetzt.

preferrable solutons: Nun, wenn Sie die materialisierte Ansicht aktualisieren möchten, müssen Sie herausfinden, wie definieren Sie Ihre Ansicht materialisiert Documentation Materialized View Refresh

create materialized view MV_BANK_CODES 
    REFRESH FAST ON COMMIT 
AS 
    SELECT DISTINCT 
     bankcodeeo.clearing_area, 
     bankcodeeo.bank_code, 
     bankcodeeo.bank_code_id, 
     bankcodeeo.bank_name, 
+0

ich einen Link gefunden, wo justin Höhle schön beantwortet http: // stackoverflow.com/questions/13068366/how-to-refresh-materialized-view-using-trigger –

Verwandte Themen