Anda di halaman 1dari 13

PL/SQL

SQL (Structured Query Language) adalah sebuah bahasa yang dipergunakan untuk mengakses data dalam basis data relasional. Bahasa ini secara de facto merupakan bahasa standar yang digunakan dalam manajemen basis data relasional. Khusus bagi oracle, ada istilah PL/SQL. PL/SQL yang merupakan singkatan dari Procedural Language/Structured Query Language merupakan sebuah penggabungan antara bahasa pemrograman prosedural (PL) dan SQL syntax. Jika digambarkan sebagai berikut:

Jadi dengan PL/SQL kita tidak perlu menggunakan sebuah bahasa pemrograman sendiri.fungsi-fungsi standard di bahasa pemrograman sudah ada di sini dan bisa langsung digabung dengan perintah SQL untuk memanipulasi database. Tapi PL/SQL cuma ada di database oracle saja.

Struktur Blok
PL/SQL merupakan bahasa block-structured (berstruktur blok). Yaitu bahwa unit-unit dasar (procedure, function, dan blok tanpa nama (anonymous block)) yang membentuk program PL/SQL merupakan blok logikal, yang mana dapat berisi beberapa sub-sub blok bersarang (nested-blocks). Dengan demikian, PL/SQL mendukung pendekatan divide-andconquer (membagi dan mengatasi) untuk penyelesaian masalah yang disebut dengan stepwise refinement. Blok (atau sub-blok) mengijinkan kita untuk mengelompokkan secara logikal deklarasi-deklarasi dan perintah-perintah yang terkait. Blok PL/SQL memiliki tiga bagian: bagian declarative, bagian executable, dan bagian exception-handling. (Dalam PL/SQL, peringatan dan kondisi error disebut dengan exception). Bagian executable merupakan bagian yang mutlak harus ada pada suatu blok PL/SQL.

Variable dan Konstanta


PL/SQL mengijinkan kita untuk mendeklarasikan konstanta dan variable, lalu menggunakannya di dalam SQL dan perintah-perintah prosedural dimanapun ekspresi dapat digunakan. Namun perlu diingat, forward reference tidak diperbolehkan. Maksudnya, kita harus mendeklarasikan konstanta dan variable sebelum mereferensinya (menggunakannya) di dalam perintah-perintah yang lain, termasuk pada perintah-perintah declarative lainnya.

Mendeklarasikan Variable
Variable dapat memiliki tipe data SQL, seperti CHAR, DATE, atau NUMBER, atau tipe data PL/SQL, seperti BOOLEAN atau BINARY_INTEGER. Sebagai contoh, asumsikan bahwa kita ingin mendeklarasikan variable dengan nama part_no untuk menyimpan 4 digit angka dan variable dengan nama in_stock untuk menyimpan nilai Boolean TRUE atau FALSE. Kita mendeklarasikan variablevariable tersebut dengan cara sebagai berikut: part_no NUMBER(4); in_stock BOOLEAN; Kita dapat pula mendeklarasikan nested tables, variable-size arrays (varrays), serta record dengan menggunakan tipe-tipe data komposit TABLE, VARRAY, dan RECORD.

Memberikan Nilai ke Variable


1. Kita dapat memberikan nilai ke variable dengan tiga cara. Yaitu: Menggunakan assignment operator (:=), yaitu titik dua diikuti dengan sama dengan. Contoh : tax := price * tax_rate; valid_id := FALSE; bonus := current_salary * 0.10; wages := gross_pay(emp_id, st_hrs, ot_hrs) - deductions; Melakukan select (atau fetch) terhadap nilai-nilai yang ada di dalam database ke variable tersebut. Contoh : SELECT sal * 0.10 INTO bonus FROM emp WHERE empno = emp_id; Melewatkannya sebagai parameter OUT atau IN OUT kepada sebuah subprogram. Contoh : parameter IN OUT mengijinkan kita untuk melewatkan nilai awal ke subprogram yang sedang dipanggil dan kemudian mengembalikan nilai perubahannya kepada pemanggilnya: DECLARE my_sal REAL(7,2); PROCEDURE adjust_salary (emp_id INT, salary IN OUT REAL) IS ... BEGIN

2.

3.

SELECT AVG(sal) INTO my_sal FROM emp;

adjust_salary(7788, my_sal); -- assigns a new value to my_sal Mendeklarasikan Konstanta


Mendeklarasikan konstanta sama halnya dengan mendeklarasikan, kecuali bahwa kita harus menambahkan keyword CONSTANT dan segera memberikan nilai ke konstanta tersebut. Setelah itu,tidak diperbolehkan adanya pemberian nilai kembali kepada konstanta tersebut. Contoh : kita mendeklarasikan konstanta dengan nama credit_limit: credit_limit CONSTANT REAL:= 5000.00;

Cursos
Oracle menggunakan area-area kerja (work area) untuk mengeksekusi perintahperintah PL/SQL dan menyimpan informasi yang sedang diproses. Konstruksi PL/SQL yang disebut cursor mengijinkan kita memberi nama sebuah area kerja dan mengakses informasi yang ada di dalamnya. Terdapat dua macam cursor: implisit dan explisit. PL/SQL secara implisit mendeklarasikan cursor untuk seluruh perintah-perintah manipulasi data SQL, termasuk query-query yang hanya menghasilkan satu baris data. Untuk query-query yang menghasilkan lebih dari satu baris data, kita dapat secara eksplisit mendeklarasikan cursor untuk memproses baris-baris data secara individual. DECLARE CURSOR c1 IS SELECT empno, ename, job FROM emp WHERE deptno = 20; Kumpulan baris-baris data yang dihasilkan oleh query yang menghasilkan banyak baris data disebut dengan result set. Besarnya adalah jumlah baris data sesuai dengan kriteria pencarian. Seperti yang ditunjukkan oleh Gambar 1-2, explicit cursor menunjuk kepada current row (baris terkini) di dalam result set.

Gambar 1-2 Query yang menghasilkan banyak baris data mirip dengan pemrosesan file. Sebagai contoh, program COBOL membuka file, memproses records, dan kemudian menutup file.

Demikian pula,program PL/SQL membuka cursor, memproses baris-baris data yang dihasilkan oleh query, kemudian menutup cursor tersebut. Seperti halnya file pointer yang menandai posisi terkini di dalam file yang sedang terbuka, cursor menandai posisi terkini dari result set. Kita menggunakan perintah-perintah OPEN, FETCH dan CLOSE untuk mengontrol cursor. Perintah OPEN mengeksekusi query yang terkait dengan cursor, mengidentifikasi result set, dan memposisikan cursor sebelum baris pertama (first row). Perintah FETCH menampilkan baris data terkini (current row) dan memajukan cursor ke baris berikutnya (next row).Ketika baris terakhir (last row) selesai diproses, perintah CLOSE men-disable cursor.

Cursor FOR Loops


Pada banyak situasi yang membutuhkan explicit cursor, secara sederhana kita dapat melakukan coding dengan menggunakan cursor FOR loop dibanding menggunakan perintah OPEN, FETCH, dan CLOSE. Cursor FOR loop secara implisit mendeklarasikan loop index-nya sebagai record yang merepresentasikan baris data yang didapat database. Kemudian, ia membuka cursor, secara berulangkali mengambil nilai-nilai baris data dari result set ke field-field pada record, kemudian menutup cursor ketika seluruh baris data telah selesai diproses. Pada contoh berikut ini, cursor FOR loop secara implisit mendeklarasikan emp_rec sebagai sebuah recordUntuk mereferensi field-field tunggal di dalam record, kita menggunakan dot notation, dimana dot (.) berlaku sebagai penyeleksi komponen.

Cursor Variable
Seperti halnya cursor, cursor variable menunjuk kepada baris terkini (current row) di dalam result set dari multi-row query. Tetapi, tidak seperti cursor, cursor variable dapat dibuka untuk type-compatible query.Ia tidak terikat dengan kepada query tertentu. Cursor variable benar-benar merupakan variable PL/SQL, diaman kita dapat memberikan nilai baru dan melewatkannya ke subprogram-subprogram didalam database Oracle. Hal ini memberikan kita fleksibilitas lebih dan cara yang tepat untuk memusatkan proses menampilkan data.Biasanya, kita membuka cursor variable dengan melewatkannya ke stored procedure yang mendeklarasikan cursor variable sebagai satu dari parameterparameter formalnya. Procedure berikut ini membuka cursor variable yang bernama generic_cv untuk query yang dipilih.

Attributes
Variable dan cursor PL/SQL memiliki attributes, yang merupakan property yang mengijinkan kita mereferensi tipe data dan struktur dari item tanpa mengulangi definisinya. Column-column dan table-table database memiliki attribute yang serupa, dimana kita dapat menggunakannya untuk kemudahan pemeliharaan. Tanda persen (%) bertindak sebagai indikator attribute.

% TYPE
Attribute %TYPE menyediakan tipe data untuk variable atau kolom database. Hal ini khususnya berguna ketika mendeklarasikan variable-variable yang akan menyimpan nilai-nilai database. Sebagai contoh, asumsikan bahwa ada kolom dengan nama title di dalam table books. Untuk mendeklarasikan variable bernama my_title yang memiliki tipe data sama dengan kolom title, gunakan dot notation (.) dan attribute %TYPE, seperti berikut ini: my_title books.title%TYPE; Mendeklarasikan my_title dengan %TYPE memiliki dua keuntungan.Pertama, kita tidak perlu tahu tipe data sebenarnya dari kolom title.Kedua, jika kita mengubah definisi database untuk title (misalnya memanjangkan nilai string-nya), tipe data my_title berubah secara otomatis mengikuti perubahan tipe data kolom title.

%ROWTYPE
Di dalam PL/SQL, record digunakan untuk mengelompokkan data. Record terdiri dari sejumlah field-field terkait dimana nilai-nilai data disimpan. Attribute %ROWTYPE menyediakan tipe record yang merepresentasikan baris data pada table. Record dapat menyimpan seluruh baris data yang di-select dari table atau dihasilkan dari cursor atau cursor variable.Kolom di dalam baris data dan fieldfield yang terkait dengannya di dalam record memiliki nama dan tipe data yang sama. Di dalam contoh di bawah ini, kita mendeklarasikan record bernama dept_rec. Field-field-nya memiliki nama-nama dan tipe-tipe data yang sama dengan kolom-kolom pada table dept. DECLARE dept_rec dept%ROWTYPE; declare record variable Gunakan tanda titik (.) untuk mereferensi field-field, seperti ditunjukkan oleh contoh berikut ini: my_deptno := dept_rec.deptno; Jika kita mendeklarasikan cursor yang menampilkan last name, salary, hire date dan job title dari employee, kita dapat menggunakan %ROWTYPE untuk mendeklarasikan record yang menyimpan informasi yang sama, seperti berikut ini: DECLARE CURSOR c1 IS SELECT ename, sal, hiredate, job FROM emp; emp_rec c1%ROWTYPE; declare record variable that represents a row fetched from the emp table Ketika kita mengeksekusi perintah: FETCH c1 INTO emp_rec; nilai di dalam kolom ename dari table emp diberikan ke field ename dari emp_rec, nilai dari kolom sal diberikan ke field sal, dan begitu seterusnya.

Gambar 1 - 3

Control Structures
Control structures merupakan perluasan paling penting PL/SQL untuk SQL. Tidak hanya PL/SQL mengijinkan kita untuk memanipulasi data Oracle, ia juga mengijinkan kita untuk memproses data menggunakan perintah conditional, iterative, dan sequential flow-ofcontrol seperti IF-THEN-ELSE, CASE, FOR-LOOP, WHILE-LOOP, EXIT-WHEN, dan GOTO. Secara bersama-sama, perintah ini dapat menangani berbagai situasi permasalahan.

Conditional Control
Seringkali, penting untuk melakukan aksi alternatif bergantung kepada kondisi permasalahannya.Perintah IF-THEN-ELSE mengijinkan kita untuk memproses perintah secara kondisional. Klausa IF mengecek kondisi; klausa THEN mendefinisikan apa yang akan dilakukan jika kondisi benar (TRUE); klausa ELSE mendefinisikan apa yang akan dilakukan jika kondisi salah (FALSE) atau null.Pertimbangkan program berikut ini, yang memproses transaksi bank. Sebelum mengijinkan kita untuk menarik dana $500 dari rekening 3, program akan memastikan apakah rekening tersebut memiliki dana yang cukup untuk ditarik. Jika dana cukup, program akan men-debit rekening. Sebaliknya, jika tidak, program akan mencatatnya ke dalam audit table.Untuk memilih diantara beberapa nilai atau rangkaian aksi, kita dapat menggunakan konstruksi CASE.Ekspresi CASE mengevaluasi kondisi dan menghasilkan nilai untuk setiap kasus (case). Perintah case mengevaluasi kondisi dan melakukan aksi (mungkin dapat berupa seluruh blok PL/SQL) untuk setiap kasus. Rangkaian perintah yang menggunakan hasil-hasil query untuk memilih alternatif aksi adalah umum di dalam aplikasi-aplikasi database. Rangkaian umum lainnya menambahkan atau menghapus baris data hanya jika entry terkait ditemukan di dalam table lain. Kita dapat mengikat rangkaian-rangkaian umum ini ke dalam blok PL/SQL dengan menggunakan logika kondisional.

Iterative Control
Perintah-perintah LOOP mengijinkan kita untuk mengeksekusi perintahperintah hingga beberapa kali.Kita meletakkan keyword LOOP sebelum perintah pertama di dalam rangkaian perintah dan keyword END LOOP setelah perintah terakhir dalam rangkaian perintah tersebut. Contoh berikut ini menunjukkan

kepada kita bentuk loop sederhana, dimana mengulang rangkaian perintahperintah secara terus kontinyu: LOOP -- sequence of statements END LOOP; Perintah-perintah FOR-LOOP mengijinkan kita untuk menentukan jangkauan integer, lalu mengeksekusi rangkaian perintah-perintah sekali untuk setiap integer di dalam jangkauan tersebut.Contoh: Loop berikut ini menambahkan 500 angka beserta nilai kuadratnya ke dalam database table: FOR num IN 1..500 LOOP INSERT INTO roots VALUES (num, SQRT(num)); Perintah WHILE-LOOP menghubungkan kondisi dengan rangkaian perintah-perintah. Sebelum setiap perulangan di dalam loop, kondisi dievaluasi. Jika kondisi benar (true), rangkaian perintah-perintah akan dieksekusi, lalu kontrol akan mulai lagi dari puncak loop. Jika kondisi salah (false) atau null, loop dilewati dan kontrol menuju kepada perintah selanjutnya. Perintah EXIT-WHEN mengijinkan kita untuk menyelesaikan loop jika perintah selanjutnya tidak mungkin atau tidak diinginkan. Ketika perintah EXIT ditemui, kondisi di dalam klausa WHEN dievaluasi. Jika kondisi benar (true), loop diselesaikan dan kontrol menuju kepada perintah selanjutnya. END LOOP;

Sequential Control
Perintah GOTO mengijinkan kita untuk mencabangkan label secara tidak terkondisi. Label, identifier yang tidak terdeklarasikan, ditutup dengan tanda kurung persegi ganda, harus mendahului perintah executable atau blok PL/SQL. Ketika dieksekusi, perintah GOTO mentransfer kontrol kepada perintah atau blok berlabel

Modularity
Mengijinkan kita untuk memecah aplikasi menjadi modul-modul yang mudah dimanage, dan didefinisikan dengan baik. Selama proses penyaringan, kita dapat mengurangi problem yang kompleks menjadi kumpulan problem-problem sederhana yang memiliki solusi-solusi mudah untuk diimplementasikan. PL/SQL menjawab kebutuhan ini dengan program units, yang mengandung blok- blok, subprogram-subprogram, dan package-package.

Subprogram
PL/SQL memiliki dua tipe subprogram yang dinamakan procedure dan function, yang mana mengambil parameter dan dipanggil. Seperti contoh berikut ini, subprogram seperti program kecil (miniature program), yang diawali dengan header dan diikuti dengan bagian opsional declarative, bagian executable, dan bagian opsional exception-handling.

Ketika dipanggil, procedure ini menerima kode karyawan. Kode tersebut digunakan untuk mendapatkan komisi karyawan dari database table, dan, pada saat yang sama, menghitung bonus 15%.Lalu, procedure akan mengecek total bonus. Jika bonus adalah null, exception akan tampil; sebaliknya, data penggajian karyawan akan di-update.

Packages
PL/SQL mengijinkan kita untuk mem-bundle secara logikal terhadap tipetipe, variable-variable, cursor-cursor, dan subprogram-subprogram yang saling terkait ke dalam sebuah package. Package biasanya memiliki dua bagian: yaitu spesification dan body. Specification merupakan antarmuka untuk aplikasi-aplikasi kita; ia mendeklarasikan tipe, konstanta, variable, exception, cursor, dan subprogram yang tersedia untuk digunakan. Body mendefinisikan cursors dan subprogram dan kemudian mengimplementasikan spesification.Hanya deklarasi di dalam package yang terlihat dan dapat diakses oleh aplikasi. Detail implementasi di dalam package body tersembunyi dan tidak dapat diakses. Package dapat di-compile dan disimpan di dalam database Oracle, dimana isinya dapat digunakan secara bersama-sama oleh banyak aplikasi. Ketika kita memanggil subprogram yang terpackaged untuk pertama kalinya, seluruh package akan di-load ke memory. Selanjutnya, pemanggilan berikutnya terhadap subprogram-subprogram yang terdapat di dalam package tersebut tidak lagi memerlukan disk I/O. Dengan demikian, package dapat meningkatkan produktifitas dan meningkatkan performa.

Data Abstraction
Data abstraction mengijinkan kita untuk mengekstrak property-property penting dari data sambil mengabaikan detil-detil yang tidak perlu. Sekali kita mendesain struktur data, kita dapat melupakan detilnya dan fokus terhadap algoritma desain yang memanipulasi struktur data tersebut.

Collection
Tipe-tipe collection yaitu TABLE dan VARRAY membolehkan kita untuk mendeklarasikan index berdasarkan table (index-by tables), table bersarang (nested tables), dan array berukuran fleksibel (variable-size arrays). Collection merupakan kelompok elemenelemen terurut, yang seluruhnya memiliki tipe sama. Setiap elemen memiliki subscript unik yang menentukan posisinya di dalam collection.Untuk mereferensi elemen, gunakan sintaks subscripting standar. Contoh, pemanggilan berikut mereferensi elemen kelima di dalam table bersarang / nested table (dengan tipe Staff) yang dihasilkan oleh function new_hiresCollections bekerja seperti array yang dapat kita temui pada bahasa pemrograman generasi ke 4. Juga, collections dapat dilewatkan sebagai parameter. Sehingga, kita dapat menggunakannya untuk memindahkan kolom-kolom dari data ke dalam dan keluar dari tabletable database atau diantara aplikasi-aplikasi client-side dan stored subprograms.

Record
Kita dapat menggunakan attribute %ROWTYPE untuk mendeklarasikan record yang merepresentasikan baris data di dalam table atau baris data yang dihasilkan dari sebuah cursor. Tetapi, dengan record yang didefinisikan oleh user (user-defined record), kita dapat mendeklarasikan field-field milik kita. Records mengandung field-field bernama yang unik, yang mana dapat memiliki tipetipe data yang berbeda. Bayangkan kita memiliki berbagai macam data employee, seperti name, salary, dan hire date. Item-item ini tidak sama tetapi secara logikal saling terkait. Record yang mengandung field untuk setiap item mengijinkan kita untuk memperlakukan data sebagai unit logikal. Perhatikan bahwa kita dapat menyarangkan records. Sehingga, sebuah record dapat menjadi komponen dari record yang lain.

Object Types
Di dalam PL/SQL, object-oriented programming adalah berbasiskan pada object types. Object type meng-enkapsulasi struktur data yang berhubungan dengan functions dan procedures yang diperlukan untuk memanipulasi data tersebut. Variable-variable yang membentuk struktur data disebut attributes. Functions dan procedures yang mengkaraktersisasi kelakuan (behavior) dari object type dinamakan methods. Object type menekan kompleksitas dengan memecah sistem yang besar ke dalam entity-entity logikal. Hal ini mengijinkan kita untuk menciptakan komponen-komponen software yang modular, maintainable, dan reusable.Ketika kita mendefinisikan object type menggunakan perintah CREATE TYPE (di dalam SQL*Plus sebagai contoh), kita menciptakan template yang abstrak untuk sebuah objek di dunia nyata (real-word object). Contoh tentang rekening bank berikut ini, template menentukan hanya attributes dan behaviors yang akan dibutuhkan oleh objek di dalam lingkungan aplikasi. Pada saat runtime, ketika struktur data diisi dengan nilai, kita harus menciptakan instance dari rekening bank yang abstrak. Kita dapat menciptakan instances (disebut objects) sebanyak yang kita butuhkan. Setiap object memiliki nomor, saldo dan status dari rekening bank sesungguhnya.

Information Hiding
Dengan information hiding, kita hanya melihat detil yang relevan pada suatu level desain algoritma dan struktur data. Information hiding menjaga keputusan desain high-level tetap terpisah dengan detil desain low-level, yang mana lebih sering untuk diubah.

Algorithms
Kita menerapkan information hiding untuk algoritma melalui top-down design. Sekali kita mendefinisikan spesifikasi tujuan dan antarmuka dari low-level procedure, kita dapat mengabaikan detil-detil implementasi. Mereka disembunyikan pada level-level yang lebih tinggi. Contoh, implementasi dari procedure dengan nama raise_salary disembunyikan. Seluruh yang perlu kita ketahui adalah procedure akan menambah gaji karyawan dengan nilai tertentu. Perubahan-perubahan terhadap definisi raise_salary adalah jelas untuk aplikasiaplikasi yang memanggilnya.

Data Structures
Kita menerapkan information hiding untuk data structures melalui data encapsulation. Dengan membagun kumpulan dari subprogram-subprogram utility untuk struktur data, kita mengisolasinya dari user-user dan developer-developer yang lain. Dengan cara itu, para developer mengetahui bagaimana menggunakan subprogram-subprogram yang mengoperasikan data structure namun tidak mengetahui bagaimana struktur tersebut direpresentasikan. Dengan package-package PL/SQL, kita dapat menentukan apakah subprogramsubprogram bersifat public atau private. Sehingga, package menjalankan data encapsulation dengan membiarkan kita meletakkan definisi subprogram di dalam kotak hitam. Definisi private adalah tersembunyi dan tidak dapat diakses. Hanya package, bukannya aplikasi kita, yang terpengaruh jika definisi tersebut berubah. Hal ini menyederhanakan pemeliharaan dan pengembangannya.

Error Handling
PL/SQL membuatnya mudah untuk mendeteksi dan memproses kondisi-kondisi yang telah didefinisikan terlebih dahulu atau yang didefinisikan oleh user, yang dinamakan dengan exceptions. Ketika error muncul, exception akan ditampilkan. Sehingga, eksekusi normal akan menghentikan dan mengontrol transfer ke bagian exception-handling (penanganan kesalahan) dari blok atau subprogram PL/SQL kita. Untuk menangani exception yang muncul, kita menulis rutin terpisah yang dinamakan dengan exception handlers. Eksepsi-eksepsi yang telah didefinisikan sebelumnya tampil secara implisit bersamaan dengan berjalannya sistem. Sebagai contoh, jika kita berusaha membagi sebuah angka dengan nol, PL/SQL akan memunculkan predefined exception ZERO_DEVIDE secara otomatis. Kita harus menampilkan eksepsi yang kita definisikan (user-defined exceptions) secara eksplisit dengan perintah RAISE. Kita dapat mendefinisikan exceptions kita sendiri pada bagian declarative dari setiap blok PL/SQL atau subprogram. Di dalam bagian executable, kita mengecek kondisi yang membutuhkan perhatian khusus. Jika kita menemukan bahwa kondisi tersebut ada, kita mengeksekusi perintah RAISE. Contoh, kita menghitung bonus yang diperoleh oleh tenaga penjualan. Bonus tersebut berdasarkan gaji dan komisi. Sehingga, jika komisi tersebut adalah null, kita menampilkan eksepsi

PL/SQL Architecture
Kompilasi dan sistem runtime dari PL/SQL adalah teknologi, bukan produk yang berdiri sendiri.Pikirkan teknologi ini sebagai engine yang meng-compile dan mengeksekusi blok-blok PL/SQL dan subprogram. Engine dapat diinstall di dalam Oracle server atau di dalam aplication development tool seperti Oracle Forms atau Oracle Reports. Sehingga, PL/SQL dapat berada di dua lingkungan: Oracle database server Oracle tools Dua lingkungan ini adalah independen. PL/SQL di-bundle dengan Oracle server tetapi mungkin tidak tersedia di beberapa tool. Pada salah satu lingkungan tersebut, engine PL/SQL menerima sebagai input untuk setiap blok PL/SQL dan subprogram yang valid. Gambar 1-4

menunjukkan engine PL/SQL sedang memproses blok tanpa nama (anonymous block). Engine mengeksekusi perintah-perintah procedural tetapi mengirimkan perintah-perintah SQL ke SQL Statement Executor di dalam Oracle server.

Gambar 1-4

Manfaat PL/SQL Mendukung SQL


SQL telah menjadi bahasa basis data standar karena ia fleksibel, powerful, dan mudah dipelajari. Beberapa perintah-perintah seperti bahasa Inggris seperti SELECT, INSERT, UPDATE, dan DELETE membuatnya mudah untuk memanipulasi data yang tersimpan di dalam basis data relasional (relational database). SQL adalah non-prosedural, yang berarti bahwa kita dapat menetapkan apa yang ingin kita lakukan tanpa menentukan bagaimana melakukannya. Oracle yang akan menentukan cara terbaik untuk melayani permintaan kita. Tidak ada koneksi yang tidak perlu antara perintah-perintah yang berurutan karena Oracle mengeksekusi perintah SQL sekali pada satu waktu. PL/SQL mengijinkan kita untuk menggunakan seluruh perintah-perintah data manipulation, cursor control, dan transaction control SQL begitu pula dengan functions, operators, dan pseudocolumns. Sehingga, kita dapat memanipulasi data secara lebih fleksibel dan aman. Juga, PL/SQL mendukung penuh tipe-tipe data SQL. Hal ini mengurangi perlunya mengkonversi data yang dilewatkan diantara aplikasi-aplikasi kita dan database. PL/SQL juga mendukung SQL dinamis (dynamic SQL), sebuah teknik pemrograman tingkat lanjut yang membuat aplikasi-aplikasi kita lebih fleksibel dan serbaguna. Program-program kita dapat memproses perintah-perintah data definition, data control, dan session control SQL secara on the fly saat runtime.

Mendukung Object-Oriented Programming


Object types merupakan tool pemodelan berorientasi objek yang ideal, dimana kita dapat menggunakannya untuk mengurangi biaya dan waktu yang dibutuhkan untuk membangun aplikasi-aplikasi kompleks. Disamping juga

membolehkan kita untuk menciptakan komponen-komponen software yang modular, maintainable, dan reusable, object types membolehkan juga tim-tim programmer yang berbeda untuk membangun komponen-komponen software secara berkelanjutan. Dengan mengenkapsulasi operasi-operasi dengan data, object types mengijinkan kita untuk memindahkan kode-kode pemeliharaan data keluar dari script-script SQL dan blok-blok PL/SQL menuju kepada methods. Object types juga menyembunyikan detil-detil implementasi, sehingga kita dapat mengubah detil-detil tanpa mempengaruhi program-program pada sisi klien.Sebagai tambahan, object types memperbolehkan pemodelan data yang realistis. Entitasentitas kompleks pada dunia nyata beserta relasi-relasinya dipetakan secara langsung ke dalam object types. Hal ini membantu program-program kita secara lebih baik merefleksikan dunia yang berusaha disimulasikannya.

Gambar 1-5 PL/SQL Meningkatkan Performa PL/SQL juga meningkatkan performa dengan menambahkan kekuatan pemrosesan prosedural kepada tool-tool Oracle. Dengan menggunakan PL/SQL, tool tersebut dapat melakukan suatu perhitungan secara lebih cepat dan efisien tanpa memanggil Oracle server.

Produktifitas Lebih Tinggi


PL/SQL menambahkan fungsionalitas untuk tool-tool non-prosedural seperti Oracle Forms dan Oracle Reports.Dengan PL/SQL di dalam tool-tool ini, kita dapat menggunakan konstruksi prosedural yang sudah lazim untuk membangun aplikasi.Contoh, kita dapat menggunakan seluruh blok PL/SQL di dalam trigger pada Oracle Forms. Kita tidak perlu lagi menggunakan langkahlangkah trigger yang banyak, macros, atau user exits.Sehingga, PL/SQL meningkatkan produktifitas dengan meletakkan tool-tool yang lebih baik di tangan kita.

PL/SQL memiliki bentuk yang sama pada seluruh lingkungan. Segera setelah kita memahami PL/SQL dengan suatu tool Oracle, kita dapat menggunakan pengetahuan itu pada tool-tool yang lain, sehingga menggandakan keuntungan-keuntungan produktifitas. Contoh, script-script yang ditulis dengan satu tool dapat digunakan oleh tool-tool yang lain

Portabilitas Penuh
Aplikasi-aplikasi yang ditulis dengan PL/SQL portabel untuk setiap sistem operasi dan platform dimana Oracle berjalan. Dengan kata lain, program-program PL/SQL dapat berjalan dimanapun Oracle dapat berjalan; kita tidak perlu memodifikasinya lagi untuk setiap lingkungan yang baru. Hal ini berarti kita dapat menulis library-library program yang portabel, yang mana dapat digunakan di dalam lingkungan-lingkungan yang berbeda.

Integritas dengan SQL


Bahasa-bahasa PL/SQL dan SQL terintegrasi penuh satu sama lain. PL/SQL mendukung seluruh tipe-tipe data SQL dan nilai NULL. Hal ini memperbolehkan kita memanipulasi data Oracle secara lebih mudah dan efisien.Sehingga juga membantu kita untuk menulis kode program yang memiliki performa tinggi. Attribute-attribute %TYPE dan %ROWTYPE selanjutnya mengintegrasikan PL/SQL dengan SQL. Sebagai contoh, kita dapat menggunakan attribute %TYPE untuk mendeklarasikan variable-variable, berdasarkan deklarasi-deklarasi pada definisi-definisi kolom-kolom database. Jika definisi berubah, deklarasi variable akan menyesuakan dengan perubahan tersebut. Definisi baru akan mengalami perubahan tanpa campur tangan kita. Hal ini menyediakan data independence, mengurangi biaya-biaya maintenance, dan mengijinkan program-program untuk beradaptasi dengan perubahan database untuk menyesuaikan dengan kebutuhan-kebutuhan bisnis.

Keamanan yang baik


Stored procedures PL/SQL memungkinkan kita untuk menyekat logika aplikasi diantara client dan server. Dengan cara itu, kita dapat mencegah aplikasiaplikasi client agar tidak memanipulasi data yang sensitif. Database triggers yang ditulis dengan PL/SQL dapat men-disable proses update oleh aplikasi secara selektif dan melakukan audit berdasarkan konten terhadap proses insert data yang dilakukan oleh user.Selanjutnya, kita dapat membatasi akses ke data Oracle dengan mengijinkan user untuk memanipulasi data hanyak melalui stored procedures yang dieksekusi dengan hak pendefinisinya. Contoh, kita dapat memberikan akses kepada user untuk procedure yang meng-update table,tetapi tidak mengijinkan mereka untuk mengakses table tersebut secara langsung.