Interaksi PL/SQL dengan Oracle

6.9.4. Menggunakan Autonomous Triggers

Diantara hal-hal yang lain, kita dapat menggunakan database triggers untuk mencatat kejadian-kejadian secara transparan. Misalkan kita ingin mengikuti seluruh penambahan data ke dalam suatu table, bahkan yang di-rollback. Dalam contoh di bawah ini, kita menggunakan trigger untuk menambahkan nilai-nilai dobel ke dalam table bayangan.

Karena ia adalah autonomous, suatu trigger dapat meng-commit penambahan-penambahan data tersebut ke dalam table bayangan meskipun kita melakukan commit atau tidak terhadap penambahan-penambahan ke dalam table utama.

-- menciptakan table utama dan table bayangannya
CREATE TABLE parts (pnum NUMBER(4), pname VARCHAR2(15));
CREATE TABLE parts_log (pnum NUMBER(4), pname VARCHAR2(15));
-- menciptakan sebuah autonomous trigger yang menambahkan data ke dalam
-- table bayangan sebelum setiap penambahan data ke dalam table utama
CREATE TRIGGER parts_trig
BEFORE INSERT ON parts FOR EACH ROW
DECLARE
  PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
  INSERT INTO parts_log VALUES(:new.pnum, :new.pname);
  COMMIT;
END;
-- menambahkan sebuah baris data kedalam table utama, dan lalu meng-commit-nya
INSERT INTO parts VALUES (1040, 'Head Gasket');
COMMIT;
-- menambahkan baris data lain, namun kemudian me-rollback penambahan tersebut
INSERT INTO parts VALUES (2075, 'Oil Pan');
ROLLBACK;
-- menunjukkan bahwa hanya penambahan-penambahan yang telah di-commit
-- menambahkan baris-baris data kedalam table utama
SELECT * FROM parts ORDER BY pnum;

PNUM    PNAME
------- ---------------
1040    Head Gasket

-- menunjukkan bahwa penambahan-penambahan yang telah di-commit dan di-rollback
-- ke dalam table bayangan
SELECT * FROM parts_log ORDER BY pnum;
PNUM    PNAME
------- ---------------
1040    Head Gasket
2075    Oil Pan

Tidak seperti trigger-trigger pada umumnya, automous triggers dapat mengeksekusi perintah-perintah DDL menggunakan native dynamic SQL (akan kita diskusikan pada pembahasan tentang Native Dynamic SQL). Dalam contoh berikut ini, trigger bonus_trig menghapus table sementara pada database setelah table bonus diubah:

CREATE TRIGGER bonus_trig
AFTER UPDATE ON bonus
DECLARE
  PRAGMA AUTONOMOUS_TRANSACTION; -- meng-enable-kan trigger untuk melakukan DDL
BEGIN
  EXECUTE IMMEDIATE 'DROP TABLE temp_bonus';
END;

 

6.9.5. Memanggil Autonomous Functions dari SQL

Function yang dipanggil dari perintah-perintah SQL harus mentaati aturan-aturan tertentu yang dimaksudkan untuk mengontrol efek-efek samping. Untuk mengecek pelanggaran-pelanggaran terhadap aturan-aturan tersebut, kita dapat menggunakan pragma RESTRICT_REFERENCES. Pragma tersebut menyatakan bahwa sebuah function tidak membaca atau menulis table-table pada database atau variable-variable package.

Namun, berdasarkan definisi, autonomous routines tidak pernah melanggar aturan-aturan “read no database state” (RNDS) dan “write no database state” (WNDS) tidak peduli apa yang mereka lakukan. Hal ini dapat berguna, seperti ditunjukkan oleh contoh di bawah ini. Ketika kita memanggil function ter-package log_msg dari sebuah query, ia menambahkan pesan ke dalam database table debug_output tanpa melanggar aturan “write no database state.”

-- menciptakan debug table
CREATE TABLE debug_output (msg VARCHAR2(200));

-- menciptakan package spec
CREATE PACKAGE debugging AS
  FUNCTION log_msg (msg VARCHAR2) RETURN VARCHAR2;
  PRAGMA RESTRICT_REFERENCES(log_msg, WNDS, RNDS);
END debugging;

-- menciptakan package body
CREATE PACKAGE BODY debugging AS
FUNCTION log_msg (msg VARCHAR2) RETURN VARCHAR2 IS
PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
  -- penambahan data berikut ini tidak melanggar constraint
  -- WNDS karena hal ini adalah sebuah autonomous routine
  INSERT INTO debug_output VALUES (msg);
  COMMIT;
  RETURN msg;
END;
END debugging;

-- memanggil function ter-package dari sebuah query
DECLARE
  my_empno NUMBER(4);
  my_ename VARCHAR2(15);
BEGIN
  ...
  SELECT debugging.log_msg(ename)
  INTO my_ename
  FROM emp
  WHERE empno = my_empno;
  -- bahkan jika kita melakukan rollback dalam jangkauan ini, penambahan data
  -- ke dalam 'debug_output' tetap di-commit karena
  -- ia adalah bagian dari autonomous transaction
  IF ... THEN
    ROLLBACK;
  END IF;
END;

6.10. Memastikan Kompatibilitas Kebelakang Program-program PL/SQL

PL/SQL Versi 2 mengijinkan beberapa kelakuan-kelakuan abnormal yang tidak lagi diperbolehkan. Secara spesifik, Versi 2 mengijinkan kita:

  • Membuat referensi kedepan terhadap tipe-tipe RECORD dan TABLE ketika mendeklarasikan variable-variable
  • Menentukan nama sebuah variable (tidak tipe datanya) di dalam klausa RETURN dari function spec
  • Memberikan nilai terhadap elemen-elemen dari parameter IN pada index-by table
  • Melewatkan field-field dari parameter IN dari record ke subprogram lain sebagai parameter-parameter OUT
  • Menggunakan field-field dari parameter OUT dari record pada sisi sebelah kanan dari perintah pemberian nilai
  • Menggunakan parameter-parameter OUT di dalam daftar FROM dari perintah SELECT

Untuk kompatibilitas ke belakang, kita mungkin ingin tetap memegang kelakuan khusus  Versi 2 ini. Kita dapat melakukannya dengan mengeset flag PLSQL_V2_COMPATIBILITY. Pada sisi server, kita dapat mengeset flag tersebut dalam dua cara:

  • Menambahkan baris berikut ini pada file initialization Oracle:

PLSQL_V2_COMPATIBILITY=TRUE
PLSQL_V2_COMPATIBILITY=TRUE

  • Mengeksekusi satu dari perintah-perintah SQL di bawah ini:

ALTER SESSION SET PLSQL_V2_COMPATIBILITY = TRUE;
ALTER SYSTEM SET PLSQL_V2_COMPATIBILITY = TRUE;

Jika kita menentukan FALSE (nilai default), hanya kelakuan-kelakuan default terkini yang diperbolehkan.

Pada sisi client, opsi comand-line mengatur flag tersebut. Sebagai contoh, dengan Oracle Precompilers, kita menentukan opsi run-time DBMS pada command line.

Silahkan melanjutkan membaca pembahasan Menangani PL/SQL Errors

 

 

Pages: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19


Bookmark and Share

 

Buku ini membahas berbagai macam tip dan trik yang sangat berguna bagi Anda pembaca pengguna database Oracle. Pemula, mahasiswa, programmer, maupun database administrator yang mengharapkan solusi cepat dalam menangani permasalahan-permasalahan dalam penggunaan database Oracle dapat membaca buku ini. Anda tidak harus membaca buku ini secara urut karena buku ini di susun berdasarkan topik permasalahan, dan Anda dapat membaca topik-topik yang sesuai dengan permasalahan yang Anda hadapi.
Dapat di beli di toko buku Gramedia, Gunung Agung, Uranus, Karisma, Uranus dsb.

 

Find Related articles