Anda melewatkan beberapa bagian lain dari buku ini. Ya, Steven benar – jika pengecualian terjadi di blok, semua efek DML sebelumnya tetap ada. Namun, harus ada penyebutan lain dalam buku bahwa setiap eksekusi SQL atau PL/SQL tingkat atas (yaitu, blok anonim juga) akan membuka kursor untuk pernyataan itu dan jika ada pengecualian selama eksekusi kursor, semua efek DML selesai selama eksekusi kursor digulung kembali. Mungkin contoh sederhana akan memberi Anda petunjuk...
Dalam contoh asli Anda, Anda mengeksekusi ...
BEGIN
DELETE FROM dml_exception;
raise value_error;
END;
... sebagai pernyataan tingkat atas. Ya, di akhir blok, meskipun masih di dalam, delete
efek tetap di tempatnya. Namun, blok Anda memunculkan pengecualian yang disebarkan sampai ke kursor tingkat atas. Jadi, untuk mematuhi prinsip-prinsip atomicity
, Oracle mengembalikan semua efek tertunda dari kursor yang dibuka.
Jika Anda memanggil blok PL/SQL Anda dari dalam blok PL/SQL tingkat atas lainnya, yang menangani dan tidak menaikkan kembali pengecualian yang muncul di blok PL/SQL tingkat bawah, ...
BEGIN
BEGIN
DELETE FROM dml_exception;
raise value_error;
END;
EXCEPTION
WHEN others THEN NULL;
END;
..., lalu delete
efek akan tetap di tempatnya. (Dan karena tidak ada komit di blok itu, Anda akhirnya memiliki transaksi yang sedang berlangsung.)