PL/SQL Packages
9.4. Memahami Package Body
Package body mengimplementasikan package spec. Yaitu, bahwa package body mengandung implementasi dari setiap cursor dan subprogram yang dideklarasikan di dalam package spec. Perlu kita ingat bahwa subprograms yang didefinisikan di dalam sebuah package body dapat diakses diluar package tersebut hanya jika specs mereka juga muncul di dalam package spec tersebut.
Untuk menyesuaikan subprogram specs dan bodies, PL/SQL melakukan sebuah perbandingan token-by-token dari headers mereka. Sehingga, kecuali untuk white space, headers harus sesuai kata demi kata. Jika tidak, PL/SQL akan memunculkan sebuah exception, seperti yang ditunjukkan oleh contoh berikut ini:
CREATE PACKAGE emp_actions AS ... PROCEDURE calc_bonus (date_hired emp.hiredate%TYPE, ...); END emp_actions; CREATE PACKAGE BODY emp_actions AS ... PROCEDURE calc_bonus (date_hired DATE, ...) IS -- deklarasi parameter menyebabkan munculnya sebuah exception karena ‘DATE’ -- tidak sesuai dengan ‘emp.hiredate%TYPE’ kata demi kata BEGIN ... END; END emp_actions;
Package body dapat juga mengandung deklarasi-deklarasi private, yang mana mendefinisikan types dan items yang diperlukan untuk kerja internal dari package tersebut. Jangkauan dari deklarasi-deklarasi ini lokal terhadap package body tersebut. Dengan demikian, types dan items yang dideklarasikan tidak dapat diakses kecuali di dalam package body. Tidak seperti package spec, bagian deklaratif dari sebuah package body dapat mengandung subprogram bodies.
Mengikuti declarative part dari sebuah package body adalah optional initialization part, yang mana biasanya menyimpan perintah-perintah yang menginisialisasi beberapa variables yang sebelumnya dideklarasikan di dalam package.
Initialization part dari sebuah package memainkan sebuah peran minor karena, tidak seperti subprograms, sebuah package tidak dapat dipanggil atau dilewati parameter. Sebagai hasilnya, initialization part dari sebuah package hanya berjalan sekali, yaitu pertama kali ketika kita mereferensi package tersebut.
Perlu kita ingat bersama, jika sebuah package spec hanya mendeklarasikan types, constants, variables, exceptions, dan call specs, maka package body tidak diperlukan lagi. Namun, body dapat tetap digunakan untuk menginisialisasi item-item yang dideklarasikan di dalam package spec.
9.5. Beberapa Contoh Fitur-fitur Package
Mari kita perhatikan package dengan nama emp_actions di bawah ini. Package spec-nya mendeklarasikan types, items dan subprograms berikut ini:
- Types EmpRecTyp dan DeptRecTyp
- Cursor desc_salary
- Exception invalid_salary
- Functions hire_employee dan nth_highest_salary
- Procedures fire_employee dan raise_salary
Setelah menulis package tersebut, kita dapat membangun aplikasi-aplikasi yang mereferensi terhadap types-nya, memanggil subprograms-nya, menggunakan cursor-nya, dan memunculkan exception-nya. Ketika kita menciptakan package tersebut, ia tersimpan di dalam Oracle database untuk penggunaan umum.
CREATE PACKAGE emp_actions AS /* Declare externally visible types, cursor, exception. */ TYPE EmpRecTyp IS RECORD (emp_id INT, salary REAL); TYPE DeptRecTyp IS RECORD (dept_id INT, location VARCHAR2); CURSOR desc_salary RETURN EmpRecTyp; invalid_salary EXCEPTION; /* Declare externally callable subprograms. */ FUNCTION hire_employee ( ename VARCHAR2, job VARCHAR2, mgr REAL, sal REAL, comm REAL, deptno REAL) RETURN INT; PROCEDURE fire_employee (emp_id INT); PROCEDURE raise_salary (emp_id INT, grade INT, amount REAL); FUNCTION nth_highest_salary (n INT) RETURN EmpRecTyp; END emp_actions;
CREATE PACKAGE BODY emp_actions AS number_hired INT; -- visible only in this package /* Fully define cursor specified in package. */ CURSOR desc_salary RETURN EmpRecTyp IS SELECT empno, sal FROM emp ORDER BY sal DESC; /* Fully define subprograms specified in package. */ FUNCTION hire_employee ( ename VARCHAR2, job VARCHAR2, mgr REAL, sal REAL, comm REAL, deptno REAL) RETURN INT IS new_empno INT; BEGIN SELECT empno_seq.NEXTVAL INTO new_empno FROM dual; INSERT INTO emp VALUES (new_empno, ename, job, mgr, SYSDATE, sal, comm, deptno); number_hired := number_hired + 1; RETURN new_empno; END hire_employee;
PROCEDURE fire_employee (emp_id INT) IS BEGIN DELETE FROM emp WHERE empno = emp_id; END fire_employee;
/* Define local function, available only inside package. */ FUNCTION sal_ok (rank INT, salary REAL) RETURN BOOLEAN IS min_sal REAL; max_sal REAL; BEGIN SELECT losal, hisal INTO min_sal, max_sal FROM salgrade WHERE grade = rank; RETURN (salary >= min_sal) AND (salary <= max_sal); END sal_ok;
PROCEDURE raise_salary (emp_id INT, grade INT, amount REAL) IS
salary REAL;
BEGIN
SELECT sal INTO salary FROM emp WHERE empno = emp_id;
IF sal_ok(grade, salary + amount) THEN
UPDATE emp SET sal = sal + amount WHERE empno = emp_id;
ELSE
RAISE invalid_salary;
END IF;
END raise_salary;
FUNCTION nth_highest_salary (n INT) RETURN EmpRecTyp IS
emp_rec EmpRecTyp;
BEGIN
OPEN desc_salary;
FOR i IN 1..n LOOP
FETCH desc_salary INTO emp_rec;
END LOOP;
CLOSE desc_salary;
RETURN emp_rec;
END nth_highest_salary; BEGIN -- initialization part starts here INSERT INTO emp_audit VALUES (SYSDATE, USER, 'EMP_ACTIONS'); number_hired := 0; END emp_actions;
| 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 dsb. Harga Rp. 24.800,- (157 halaman) |


[…] Silahkan melanjutkan membaca pembahasan PL/SQL Packages […]