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:

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;

 

Pages: 1 2 3 4 5 6 7

 

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)

 

Related Articles

 

Comments

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

[…] PL/SQL PackagesPL/SQL Object TypesNative Dynamic SQLMenangani PL/SQL ErrorsInteraksi PL/SQL dengan Oracle […]

wah, dapet materi lagi soal package pl sql..

Leave a comment

(required)

(required)


*
To prove you're a person (not a spam script), type the security word shown in the picture. Click on the picture to hear an audio file of the word.
Click to hear an audio file of the anti-spam word