Apakah komit diperlukan setelah operasi DML dalam Fungsi / Prosedur?

20

Saya ingin tahu apakah perlu untuk menulis komit setelah memasukkan / menghapus / memperbarui fungsi / prosedur?

Contoh:

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

atau prosedur

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

apakah perlu komit setelah dihapus?

Tidak dapat memahami situasi berikut:

  1. Jika saya memanggil fungsi / prosedur dari jendela SQL maka memerlukan komit

    tapi

  2. Jika saya menjadwalkan fungsi / prosedur menggunakan dbms_scheduler dan menjalankan pekerjaan, menghapus pernyataan secara otomatis dilakukan.

    MENGAPA?

kupa
sumber

Jawaban:

24

Secara umum, prosedur tidak boleh dilakukan. Keputusan kontrol transaksi semacam itu harus diserahkan pada kode tingkat yang lebih tinggi yang tahu kapan transaksi logis benar-benar selesai. Jika Anda melakukan di dalam prosedur tersimpan, Anda membatasi penggunaannya kembali karena penelepon yang menginginkan perubahan prosedur menjadi bagian dari transaksi yang lebih besar tidak bisa begitu saja memanggil prosedur secara langsung.

Jika Anda memanggil prosedur secara interaktif, Anda harus secara eksplisit melakukan atau mengembalikan transaksi karena Oracle tidak tahu apakah Anda ingin panggilan prosedur menjadi transaksi logis atau jika Anda ingin membuat transaksi yang lebih besar yang melibatkan beberapa panggilan prosedur. Jika Anda menggunakan dbms_scheduler, dbms_scheduleranggaplah bahwa suatu pekerjaan adalah transaksi yang logis dan dilakukan pada akhir pekerjaan dengan asumsi itu berhasil ( dbms_jobmelakukan hal yang sama).

Fungsi tidak boleh memanipulasi data sejak awal. Fungsi yang memanipulasi data tidak dapat dipanggil dari pernyataan SQL (kecuali kasus sudut di mana fungsi itu sendiri dinyatakan menggunakan transaksi otonom yang hampir tidak pernah sesuai). Inti dari memiliki kedua fungsi dan prosedur adalah bahwa fungsi dapat tertanam dalam pernyataan SQL dan dapat lebih bebas diberikan kepada pengguna karena mereka tidak mengubah data apa pun.

Gua Justin
sumber
1
Apakah tidak mungkin di Oracle bagi penelepon untuk memulai transaksi yang mengikat panggilan prosedur? Dalam SQL Server Anda dapat melakukan di dalam prosedur, tetapi jika pemanggil membuka transaksi sebelum memanggil prosedur itu, tidak ada yang dilakukan sampai pemanggil melakukan juga.
Nick Chammas
4
@NickChammas - Oracle tidak memiliki konsep transaksi bersarang, tidak. Jika prosedur tersebut dilakukan, semua yang dilakukan oleh penelepon hingga saat itu akan dilakukan. Penelepon selalu memulai transaksi secara implisit dengan pernyataan pertama (apakah itu panggilan prosedur atau sesuatu yang lain) sehingga penelepon harus selalu memutuskan untuk mengakhiri transaksi.
Justin Cave
@JustinCave Sementara itu benar, jangan lupa tentang transaksi otonom.
Philᵀᴹ
@ Phil - Benar, tapi itu binatang yang sangat berbeda. Transaksi otonom tidak dapat melihat perubahan yang tidak dikomit dilakukan oleh penelepon dan tidak dapat dibatalkan oleh penelepon sehingga sangat tidak mungkin bahwa selain prosedur logging harus dinyatakan untuk menggunakan transaksi otonom.
Justin Cave
4

Untuk menjawab pertanyaan Anda; MENGAPA?

Anda mungkin sudah mengetahui hal ini sekarang karena pos sudah berusia 2 tahun. Tapi saya akan merespons hanya untuk catatan.

Alasan # 1 memerlukan komit dan # 2 tidak karena pengaturan database default di Oracle adalah untuk melakukan transaksi ketika sesi berakhir. Jika Anda menggunakan sqlplus dan menjalankan kode Anda secara manual, itu tidak akan langsung melakukan transaksi. Jika Anda mengeluarkan komit eksplisit ATAU Anda logout dari sqlpus, maka transaksi akan komit.

Alasan mengapa Anda mendapatkan komit otomatis pada # 2 adalah karena membuat sesi untuk menjalankan skrip Anda. Ketika selesai, secara otomatis logout, yang akan menyebabkan komit otomatis.

Steve Cunningham
sumber