Czy zatwierdzanie jest konieczne po operacji DML w funkcji / procedurze?

20

Zastanawiam się, czy konieczne jest zapisanie zatwierdzenia po wstawieniu / usunięciu / aktualizacji w funkcji / procedurze?

Przykład:

create or replace function test_fun
return number is
begin
   delete from a;
   return 0;
end;

lub procedura

create or replace procedure aud_clear_pro
as
begin
   delete from a;
end;

czy wymaga zatwierdzenia po usunięciu?

Nie można zrozumieć następującej sytuacji:

  1. Jeśli wywołam funkcję / procedurę z okna SQL, to wymaga zatwierdzenia

    ale

  2. Jeśli zaplanuję funkcję / procedurę za pomocą dbms_scheduler i uruchomię zadanie, instrukcja delete zostanie zatwierdzona automatycznie.

    DLACZEGO?

kupa
źródło

Odpowiedzi:

24

Zasadniczo procedury nie powinny się zgadzać. Tego rodzaju decyzje dotyczące kontroli transakcji należy pozostawić kodowi wyższego poziomu, który wie, kiedy transakcja logiczna jest faktycznie zakończona. Jeśli popełniasz wewnątrz procedury przechowywanej, ograniczasz jej możliwość ponownego użycia, ponieważ osoba dzwoniąca, która chce, aby zmiany wprowadzone w procedurze były częścią większej transakcji, nie może po prostu bezpośrednio wywołać procedury.

Jeśli wywołasz procedurę interaktywnie, będziesz musiał jawnie zatwierdzić lub wycofać transakcję, ponieważ Oracle nie ma pojęcia, czy zamierzasz wywołać procedurę jako transakcję logiczną, czy też zamierzasz utworzyć większą transakcję obejmującą wiele wywołań procedur. Jeśli używasz dbms_scheduler, dbms_schedulerzakłada się, że zadanie jest logiczną transakcją i zatwierdza na końcu zadania, zakładając, że zakończyło się ono sukcesem ( dbms_jobrobi to samo).

Funkcje nie powinny przede wszystkim manipulować danymi. Funkcja, która manipuluje danymi, nie może zostać wywołana z instrukcji SQL (z wyjątkiem przypadku, w którym sama funkcja deklaruje użycie autonomicznej transakcji, która prawie nigdy nie jest odpowiednia). Cały sens posiadania zarówno funkcji, jak i procedur polega na tym, że funkcje mogą być osadzone w instrukcjach SQL i mogą być swobodniej przyznawane użytkownikom, ponieważ nie zmieniają żadnych danych.

Justin Cave
źródło
1
Czy w Oracle nie ma możliwości, aby osoba dzwoniąca rozpoczęła transakcję, która wiąże wywołania procedur? W SQL Server można zatwierdzić w ramach procedury, ale jeśli program wywołujący otworzył transakcję przed wywołaniem tej procedury, nic nie zostanie zatwierdzone, dopóki program wywołujący również się nie zatwierdzi.
Nick Chammas
4
@NickChammas - Oracle nie ma pojęcia transakcji zagnieżdżonej, nie. Jeśli procedura się powiedzie, wszystko, co dzwoniący zrobił do tego momentu, zostanie zatwierdzone. Osoba wywołująca zawsze rozpoczyna transakcję niejawnie od pierwszego polecenia (niezależnie od tego, czy jest to wywołanie procedury, czy coś innego), więc zawsze musi to być osoba dzwoniąca, aby zakończyć transakcję.
Justin Cave
@JustinCave Chociaż to prawda, nie zapomnij o transakcjach autonomicznych.
Philᵀᴹ
@Phil - To prawda, ale to zupełnie inne zwierzę. Autonomiczna transakcja nie widzi niezatwierdzonych zmian dokonanych przez osobę dzwoniącą i nie może zostać cofnięta przez osobę dzwoniącą, więc jest bardzo mało prawdopodobne, aby coś innego niż procedura rejestrowania wymagała zadeklarowania użycia autonomicznej transakcji.
Justin Cave
4

Odpowiedzieć na Twoje pytanie; DLACZEGO?

Prawdopodobnie już to wiesz, ponieważ post ma 2 lata. Ale odpowiem tylko dla nagrania.

Powód nr 1 wymaga zatwierdzenia, a nr 2 nie dlatego, że domyślnym ustawieniem bazy danych w Oracle jest zatwierdzanie transakcji po zakończeniu sesji. Jeśli korzystasz z narzędzia sqlplus i uruchamiasz kod ręcznie, transakcja nie zostanie natychmiast zatwierdzona. Jeśli wydasz wyraźne zatwierdzenie LUB wylogujesz się z SQL, transakcja zostanie zatwierdzona.

Powodem, dla którego otrzymujesz automatyczne zatwierdzenie nr 2, jest to, że tworzy ono sesję do uruchomienia skryptu. Po zakończeniu automatycznie się wylogowuje, co spowoduje automatyczne zatwierdzenie.

Steve Cunningham
źródło