2013-08-04 21 views
5

Jestem bardzo nowy w programowaniu PL/SQL. Próbowałem napisać procedurę pl/sql z niektórymi instrukcjami DML (insert) wewnątrz kodu. Nie wykonuję żadnych wyraźnych zatwierdzeń po wykonaniu operacji wstawiania w kodzie pl/sql. Ale transakcja jest podejmowana po wykonaniu procedury pl/sql.PL SQL Auto Commit przy wykonywaniu

czy to jest domyślne zachowanie?

Jak mogę to kontrolować?

+1

dużym stopniu zależy od klienta, którego używasz. Które to? Sql * Plus? Oracle DB na własną rękę nie ma automatycznego zatwierdzania dla DML – Slartibartfast

+0

Używam sql * plus i perl dbi do uruchamiania procedur pl/sql – Mohan

Odpowiedz

5

Instrukcje DML (INSERT/DELETE/UPDATE/MERGE) nie powodują automatycznego zatwierdzania w PL/SQL. Instrukcje DDL zatwierdzają (ALTER/CREATE itd.), A to się stanie, nawet jeśli coś nie powiedzie się. Jeśli używasz polecenia WYKONAJ NATYCHMIAST, podobnie jak instrukcja dynamiczna, która uruchamia DDL, spowoduje to również zatwierdzenie transakcji. I tak było [i pozostanie] od 2000

Interfejsy klienckie, takie jak SQL * Plus, mają funkcję automatycznego zatwierdzania, którą można wyłączyć/włączyć, poszukaj w dokumentacji klienta. Coś jak

SET AUTOCOMMIT OFF 

można zobaczyć aktualny stan tej zmiennej

SHOW AUTCOMMIT 

i że powie Ci, czy jego włączania/wyłączania.

Przejdź przez this wiecej odmian AUTOCOMMIT

+0

Więc jeśli mamy jakieś instrukcje DML w procedurze pl/sql i jeśli nie wyrażam tego wprost w procedurze pl/sql transakcje nie zostaną zatwierdzone. Wszystkie transakcje zostaną wycofane po zakończeniu wykonywania procedury. Czy to jest poprawne? – Mohan

+1

Tak, ale upewnij się, że funkcja automatycznego zatwierdzania SQL * plus jest wyłączona. Istnieje również kilka pakietów DBMS, które automatycznie zatwierdzają. Na przykład, jeśli zbierasz statystyki za pomocą DBMS_STATS po uruchomieniu procedury, istnieje niejawne zatwierdzenie w tym pakiecie. Również Google Savepoints, autonomous_transaction i spójrz na http://stackoverflow.com/questions/11966020/begin-end-block-atomic-transactions-in-pl-sql, aby uzyskać więcej informacji na ten temat. Ale najlepszą praktyką jest wydawanie zatwierdzeń przez funkcję wywołującą dla proc, gdy jest to skuteczne i wycofanie na wyjątkach. – Slartibartfast

+6

@mohan - transakcja NIE zostanie wycofana po zakończeniu wykonywania procedury. Transakcja pozostanie otwarta do czasu, aż albo A) ją zatwierdzisz, B) wycofasz, albo C) rozłączysz, w którym to czasie niezatrzymane transakcje zostaną wycofane. Ponadto, jeśli masz otwartą transakcję i wykonujesz instrukcję DDL (CREATE TABLE, DROP INDEX, itp.), Otwarta transakcja zostanie zatwierdzona. Udostępnij i ciesz się. –

2

W kliencie PL/SQL Developer, można kontrolować trybu automatycznego transakcji okienne SQL za pomocą preferencji.

enter image description here