• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

table is mutating error- trigger (PL/SQL)

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
0 głosów
539 wizyt
pytanie zadane 11 kwietnia 2018 w SQL, bazy danych przez fusemul Użytkownik (710 p.)

Witam,

stworzyłem procedurę odpowiedzialną za generowanie pliku XML na podstawie zapytania SQL podanego jako parametr. Pojawił się natomiast problem, o którym wcześniej zupełnie nie pomyślałem, gdy procedurę tą próbuję wywołać z triggera.

Uproszczony kod:

CREATE OR REPLACE TRIGGER CH_INTEGRATE_EMP_AIU_TRG
AFTER INSERT OR UPDATE
   ON ...
   FOR EACH ROW
DECLARE
.............
BEGIN
  IF inserting or updating THEN
    l_query := 'select ........ from employees where employee_id = '|| :new.employee_id; 
    ch_integration_pck.populate_integration_tab(l_root,l_query,l_msg_family, o_status, o_message);  
  
  END IF; 
.....
END;

Zamysł jest taki: po każdym update/insert na pewnej tabeli chcemy wygenerować XMLa i wrzucic go gdzies, uzywajac gotowej procedury. (nie chcę logiki za to odpowiedzialnej mieć w triggerze, ponieważ będzie to uzywane w wielu miejscach)

Wywolanie przy triggerze powoduje jednak blad:
SQL Error: ORA-19202: Error occurred in XML processing
ORA-04091: table ... is mutating, trigger/function may not see it

Czy można to jakoś obejść w taki sposób, aby po insercie/updacie procedura odpowiedzialna za generowanie XMLa wywoływała się automatycznie i z selecta w jej ciele można było się dostać do nowego rekordu?

Czy raczej w takim przypadku trzebaby z triggera wywoływać np jakiegoś niezależnego joba, który wywoływałby tą procedurę?
Czytałem coś o compound triggers, ale nie jestem pewien czy za ich pomocą można to obejsć..

dzięki za pomoc z góry

1 odpowiedź

0 głosów
odpowiedź 12 kwietnia 2018 przez fusemul Użytkownik (710 p.)

compound trigger zalatwil sprawe :)
 

CREATE OR REPLACE TRIGGER CH_INTEGRATE_EMP_AIU_TRG
FOR UPDATE OR INSERT ON employees
   COMPOUND TRIGGER
 ............
.........
  emp_id        employees.employee_id%TYPE;  
AFTER EACH ROW IS
  BEGIN  
    emp_id := :new.employee_id;        
  END AFTER EACH ROW;
  
AFTER STATEMENT IS
  BEGIN
  l_query := 'select ........ from employees where employee_id = '|| emp_id;    
  ch_integration_pck.populate_integration_tab(l_root,l_query,l_msg_family, o_status, o_message);
END AFTER STATEMENT;
END;

 

Podobne pytania

+4 głosów
1 odpowiedź 922 wizyt
pytanie zadane 15 marca 2021 w Nasze poradniki przez Catalonya1992 Mądrala (5,440 p.)
0 głosów
1 odpowiedź 1,376 wizyt
pytanie zadane 9 maja 2019 w SQL, bazy danych przez poldeeek Mądrala (5,980 p.)
0 głosów
1 odpowiedź 647 wizyt
pytanie zadane 30 grudnia 2021 w SQL, bazy danych przez Grzegorzko Obywatel (1,110 p.)

93,439 zapytań

142,431 odpowiedzi

322,674 komentarzy

62,802 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

...