Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Contoh Transaksi Otonom Oracle

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

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. ScaleGrid Menambahkan Oracle Cloud untuk Hosting Database Terkelola

  2. Nonaktifkan semua batasan tabel di Oracle

  3. Jumlah baris Oracle tabel dengan count(*) vs NUM_ROWS dari DBA_TABLES

  4. Tidak dapat memvalidasi, dengan opsi novalidate

  5. bagaimana mengganti huruf beraksen di kolom varchar2 di oracle