2013-08-04 11 views
5

Sono molto nuovo alla programmazione PL/SQL. Ho provato a scrivere una procedura pl/sql con alcune istruzioni DML (inserire) all'interno del codice. Non eseguo alcun commit esplicito dopo aver eseguito operazioni di inserimento nel codice pl/sql. Ma la transazione sta diventando impegnata dopo l'esecuzione della procedura pl/sql.PL SQL Auto Commit in esecuzione

è questo il comportamento predefinito?

Come posso controllare questo?

+1

fortemente dipendente dal client che si sta utilizzando. Che è quello? SQL * Plus? Oracle DB da solo non ha auto commit per DML – Slartibartfast

+0

Sto usando sql * plus e perl dbi per eseguire le procedure pl/sql – Mohan

risposta

5

Le istruzioni DML (INSERT/DELETE/UPDATE/MERGE) non eseguono un commit automatico in PL/SQL. Le istruzioni DDL si impegnano (ALTER/CREATE, ecc.) E ciò accadrà anche se qualcosa non funziona. Se stai eseguendo EXECUTE IMMEDIATE come una dichiarazione dinamica che esegue un DDL, anche questo eseguirà il commit della transazione. Ed è stato così [e rimarrà] dal 2000

Le interfacce client come SQL * Plus hanno una funzione di auto commit che può essere attivata/disattivata, cercarla nei documenti del cliente. Qualcosa di simile

SET AUTOCOMMIT OFF 

È possibile visualizzare lo stato corrente di questa variabile

SHOW AUTCOMMIT 

e che vi dirà se la sua on/off.

Attraversa this per ulteriori varianti di autocommit

+0

Quindi, se abbiamo delle istruzioni DML all'interno della procedura pl/sql e se non lo sto esplicitamente eseguendo all'interno della procedura pl/sql, le transazioni non saranno commesse. E tutte le transazioni verranno ripristinate al termine dell'esecuzione della procedura. È corretto? – Mohan

+1

Sì, ma assicurarsi che la funzione di commit automatico di SQL * plus sia disattivata. Inoltre ci sono alcuni pacchetti DBMS che eseguono il commit automatico. Ad esempio, se stai raccogliendo statistiche usando DBMS_STATS dopo aver eseguito la procedura, allora c'è un commit implicito all'interno di quel pacchetto. Anche google savepoints, autonomous_transaction e guarda http://stackoverflow.com/questions/11966020/begin-end-block-atomic-transactions-in-pl-sql per ulteriori informazioni su questo argomento. Ma la migliore pratica è quella di emettere commit attraverso una funzione di chiamata per il proc quando ha successo e il rollback sulle eccezioni. – Slartibartfast

+6

@mohan: la transazione NON verrà ripristinata al termine dell'esecuzione della procedura. La transazione rimarrà aperta fino al momento in cui A) la eseguirà, B) eseguirà il rollback o C) si disconnetterà, a quel punto verrà eseguito il rollback delle transazioni non eseguite. Inoltre, se si dispone di una transazione aperta ed è in esecuzione un'istruzione DDL (CREATE TABLE, DROP INDEX, ecc.) Verrà eseguita la transazione aperta. Condividi e divertiti. –

2

Nel client PL/SQL Developer, è possibile controllare l'autocommit delle transazioni finestra SQL tramite Preferenze.

enter image description here