• 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)

0 głosów
63 wizyt
pytanie zadane 11 kwietnia 2018 w SQL, bazy danych przez fusemul Użytkownik (720 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 (720 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

0 głosów
1 odpowiedź 54 wizyt
pytanie zadane 9 maja w SQL, bazy danych przez poldeeek Użytkownik (990 p.)
+1 głos
2 odpowiedzi 441 wizyt
pytanie zadane 18 maja 2017 w SQL, bazy danych przez Marcin_N_97 Stary wyjadacz (10,250 p.)
0 głosów
1 odpowiedź 106 wizyt
pytanie zadane 16 czerwca 2015 w SQL, bazy danych przez CzlowiekSkrypt Nałogowiec (26,810 p.)
Porady nie od parady
Publikując kody źródłowe korzystaj ze specjalnego bloczku koloryzującego składnię (przycisk z napisem code w edytorze). Nie zapomnij o ustawieniu odpowiedniego języka z rozwijanego menu oraz czytelnym formatowaniu kodu.Przycisk code

64,924 zapytań

111,392 odpowiedzi

234,426 komentarzy

46,754 pasjonatów

Przeglądających: 224
Pasjonatów: 11 Gości: 213

Motyw:

Akcja Pajacyk

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

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...