PL/SQL Packages
Pada pembahasan kali ini kita akan mempelajari bagaimana menyatukan sumber-sumber daya pemrograman PL/SQL ke dalam sebuah package. Sumber daya tersebut bisa mengandung sebuah kumpulan dari procedures atau sebuah kelompok dari definisi-definisi type dan deklarasi-deklarasi variable. Sebagai contoh, sebuah package Human Recource mungkin mengandung procedures hiring dan firing. Sekali ditulis, general-purpose package kita di-compile, lalu disimpan di dalam sebuah Oracle database, dimana isinya dapat digunakan bersama-sama oleh banyak aplikasi.
Pembahasan kali ini mendiskusikan topik-topik berikut:
- Apa Itu PL/SQL Package?
- Keuntungan-keuntungan dari PL/SQL Packages
- Memahamai Package Spec
- Memahami Package Body
- Beberapa Contoh Fitur-fitur Package
- Private Versus Public Items dalam Packages
- Overloading Packaged Subprograms
- Bagaimana Package STANDARD Mendefinisikan PL/SQL Environment
- Pengenalan Product-Specific Packages
9.1. Apa Itu PL/SQL Package?
Package adalah sebuah schema object yang mengelompokkan PL/SQL types, items, dan subprograms, yang terkait secara logikal. Packages biasanya memiliki dua bagian, sebuah specification dan sebuah body, meskipun kadangkala body tersebut tidak diperlukan. Specification (atau spec) merupakan antarmuka terhadap aplikasi-aplikasi kita; ia mendeklarasikan types, variables, constants, exceptions, cursors, dan subprograms yang tersedia untuk digunakan. Body secara penuh mendefinisikan cursors dan subprograms, dan juga mengimplementasikan spec.
Seperti ditunjukkan oleh Gambar 9-1, kita dapat memikirkan sebuah spec sebagai sebuah antarmuka operasional dan body sebagai sebuah “kotak hitam (black box)”. Kita dapat men-debug, meningkatkan, atau menimpa sebuah package body tanpa mengubah antarmuka (package spec) ke package tersebut.

Gambar 9-1 Antarmuka Packages
Untuk menciptakan packages, kita menggunakan perintah CREATE PACKAGE, dimana kita dapat mengeksekusinya secara interaktif dari SQL*Plus. Berikut ini adalah sintaksnya:
CREATE [OR REPLACE] PACKAGE package_name
[AUTHID {CURRENT_USER | DEFINER}]
{IS | AS}
[PRAGMA SERIALLY_REUSABLE;]
[collection_type_definition ...]
[record_type_definition ...]
[subtype_definition ...]
[collection_declaration ...]
[constant_declaration ...]
[exception_declaration ...]
[object_declaration ...]
[record_declaration ...]
[variable_declaration ...]
[cursor_spec ...]
[function_spec ...]
[procedure_spec ...]
[call_spec ...]
[PRAGMA RESTRICT_REFERENCES(assertions) ...]
END [package_name];
[CREATE [OR REPLACE] PACKAGE BODY package_name {IS | AS}
[PRAGMA SERIALLY_REUSABLE;]
[collection_type_definition ...]
[record_type_definition ...]
[subtype_definition ...]
[collection_declaration ...]
[constant_declaration ...]
[exception_declaration ...]
[object_declaration ...]
[record_declaration ...]
[variable_declaration ...]
[cursor_body ...]
[function_spec ...]
[procedure_spec ...]
[call_spec ...]
[BEGIN
sequence_of_statements]
END [package_name];]
Spec menyimpan public declarations, yang terlihat dari aplikasi kita. Kita harus mendeklarasikan subprograms pada akhir dari spec setelah seluruh item-item yang lain (kecuali pragmas yang menamai sebuah function spesifik; seperti halnya pragmas harus mengikuti function spec).
Body menyimpan detil implementasi dan private declarations, yang mana tersembunyi terhadap aplikasi kita. Mengikuti declarative part dari package body adalah optional initialization part, yang secara khusus menyimpan perintah-perintah yang meng-inisialisasi package variables.
Klausa AUTHID menentukan apakah seluruh subprogram-subprogram ter-package dijalankan dengan privileges dari definer (default) atau invoker-nya, dan apakah referensi tak terkualifikasi dari mereka terhadap schema objects ditetapkan di dalam schema dari definer atau invoker tersebut. Untuk informasi lebih, kita dapat membaca kembali pembahasan PL/SQL Subprograms.
Sebuah call spec mengijinkan kita mempublikasikan sebuah Java method atau external C function di dalam Oracle data dictionary. Call spec tersebut mempublikasikan rutin (routine) dengan cara memetakan name, parameter types, dan return type-nya terhadap SQL imbangannya.
9.1.1. Contoh Sebuah PL/SQL Package
Dalam contoh di bawah ini, kita mem-package sebuah record type, sebuah cursor, dan dua procedure kepegawaian. Perlu diingat bahwa procedure hire_employee menggunakan database sequence empno_seq dan function SYSDATE untuk menambahkan sebuah employee number baru dan hire date.
CREATE OR REPLACE PACKAGE emp_actions AS -- spec TYPE EmpRecTyp IS RECORD (emp_id INT, salary REAL); CURSOR desc_salary RETURN EmpRecTyp; PROCEDURE hire_employee ( ename VARCHAR2, job VARCHAR2, mgr NUMBER, sal NUMBER, comm NUMBER, deptno NUMBER); PROCEDURE fire_employee (emp_id NUMBER); END emp_actions; CREATE OR REPLACE PACKAGE BODY emp_actions AS -- body CURSOR desc_salary RETURN EmpRecTyp IS SELECT empno, sal FROM emp ORDER BY sal DESC; PROCEDURE hire_employee ( ename VARCHAR2, job VARCHAR2, mgr NUMBER, sal NUMBER, comm NUMBER, deptno NUMBER) IS BEGIN INSERT INTO emp VALUES (empno_seq.NEXTVAL, ename, job, mgr, SYSDATE, sal, comm, deptno); END hire_employee; PROCEDURE fire_employee (emp_id NUMBER) IS BEGIN DELETE FROM emp WHERE empno = emp_id; END fire_employee; END emp_actions;
Hanya deklarasi di dalam package yang terlihat dan dapat dikses terhadap aplikasi. Detil implementasi di dalam package body disembunyikan dan tidak dapat diakses. Jadi, kita dapat mengubah body (implementation) tanpa harus meng-compile ulang program-program yang memanggilnya.
| 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. |


































