Di Oracle, transaksi otonom dapat melakukan atau mengembalikan data dalam sesi yang sama tanpa melakukan atau memutar kembali dalam transaksi utama. Pernyataan PRAGMA (compiler directive) digunakan untuk mendefinisikan transaksi otonom di Oracle. Berikut ini adalah contoh transaksi otonom Oracle.
Sintaks untuk Mendefinisikan Transaksi Otonom di Oracle
PRAGMA AUTONOMOUS_TRANSACTION; /* in the declaration section of PL/SQL Block */
Contoh Prosedur Tersimpan Oracle untuk Transaksi Otonom
Prosedur tersimpan Oracle berikut untuk transaksi otonom adalah mencatat kesalahan yang terjadi dalam program PL/SQL (Prosedur, paket, atau fungsi, dll.). Ini akan memasukkan informasi kesalahan ke dalam tabel error_log dan akan melakukan data tanpa mempengaruhi transaksi utama dalam program PL/SQL. Anda dapat memanggil prosedur ini dari program PL/SQL mana pun untuk mencatat informasi kesalahan. Di bawah ini saya akan menunjukkan caranya. Buat objek berikut untuk diuji di sistem Anda:
Buat Tabel Error_Log
CREATE TABLE error_log ( error_code VARCHAR2 (100), error_msg VARCHAR2 (4000), date_occurred DATE, plsql_program_ref VARCHAR2 (100) ) /
Prosedur Tersimpan Oracle untuk Transaksi Otonom untuk Mencatat Kesalahan
Prosedur di bawah ini membutuhkan tiga parameter, yang harus Anda lewati pada saat memanggil prosedur dari prosedur atau fungsi tersimpan lainnya pada saat kesalahan.
CREATE OR REPLACE PROCEDURE prc_log_errors (v_error_code IN VARCHAR2, v_error_msg IN VARCHAR2, v_plsql_program IN VARCHAR2) AS PRAGMA AUTONOMOUS_TRANSACTION; BEGIN INSERT INTO error_log (ERROR_CODE, ERROR_MSG, DATE_OCCURRED, PLSQL_PROGRAM_REF) VALUES (v_error_code, v_error_msg, SYSDATE, v_plsql_program); COMMIT; END; /
Sekarang Anda dapat memanggil prosedur tersimpan prc_log_errors dari bagian penanganan pengecualian program PL/SQL lainnya untuk mencatat informasi kesalahan. Ini contohnya:
Buat Tabel test_data
CREATE TABLE test_data (some_data VARCHAR2 (100)) /
Buat Fungsi fnc_test
Fungsi berikut akan memasukkan beberapa data ke dalam test_data tabel, dan setelah itu akan menghasilkan kesalahan karena membagi dengan 0 di baris berikutnya. Pada kesalahan, di bagian pengecualian, ia memanggil prosedur prc_log_errors untuk mencatat kesalahan. Jika fungsi dijalankan tanpa kesalahan, maka akan mengembalikan TRUE jika tidak maka akan mengembalikan FALSE. Dalam kasus di bawah ini, ini akan mengembalikan FALSE setelah mencatat kesalahan.
CREATE OR REPLACE FUNCTION fnc_test RETURN BOOLEAN IS n NUMBER; BEGIN INSERT INTO test_data VALUES ('abc'); /* generate error */ n := 2 / 0; RETURN TRUE; EXCEPTION WHEN OTHERS THEN prc_log_errors (TO_CHAR (SQLCODE), SQLERRM, 'FNC_TEST'); RETURN FALSE; END fnc_test; /
Uji
Panggil fungsi di atas fnc_test .
BEGIN IF fnc_test THEN COMMIT; ELSE ROLLBACK; END IF; EXCEPTION WHEN OTHERS THEN ROLLBACK; END; /
Meski rolling back gagal, tapi tetap saja data akan tersimpan di tabel error_log, karena prosedur prc_log_errors menggunakan PRAGMA AUTONOMOUS_TRANSACTION .
Periksa tabel test_data, seharusnya tidak ada catatan.
SELECT * FROM test_data;
Keluaran
no rows selected.
Periksa data di tabel error_log
SELECT * FROM error_log;
Keluaran
ERROR_CODE ERROR_MSG DATE_OCCURRED PLSQL_PROGRAM_REF -1476 ORA-01476: divisor is equal to zero 27/03/2019 15:43:12 FNC_TEST
Lihat juga:
- Contoh Pengumpulan Massal Oracle PL/SQL Dengan Simpan Pengecualian