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
| 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. |


































