PL/SQL
Pendahuluan
Definisi
PL/SQL (Procedural
Language/Structured Query Language)
merupakan sebuah
penggabungan
antara bahasa pemrograman prosedural (PL) dan SQL syntax. PL/SQL adalah
fasilitas yang
disediakan Oracle sehingga
pengguna dapat memanfaatkan
konsep
pemrograman.
Dalam PL/SQL dapat digunakan perintah untuk memanipulasi data yang ada
dalam
database Oracle. PL/SQL membentuk pemrograman terstruktur dalam memproses
data.
Karena pada SQL tidak mendukung pemrograman secara prosedural, maka
dikembangkanlah PL/SQL. PL merupakan kependekan dari Procedural Language.
PL/SQL mengkombinasikan kekuatan dan kefleksibilitasan SQL dengan pemrograman
prosedural. PL/SQL memiliki keistimewaan sebagai berikut:
·
Programmer dapat mendeklarasikan variable untuk digunakan selama pemrosesan
statement.
·
Programmer dapat menggunakan penanganan kesalahan untuk mencegah kegagalan
program.
·
Programmer dapat menulis program yang interaktif yang menerima input dari user.
·
Programmer dapat membagi fungsi-fungsi ke dalam blok-blok lojik dari kode.
Teknik pemrograman secara modular ini mendukung fleksibilitas selama
pengembangan aplikasi.
·
Statement SQL dapat diproses secara simultan untuk performansi keseluruhan yang
lebih baik.
Beberapa
kelebihan PL/SQL dalam database Oracle :
-
PL/SQL dapat
digunakan di server sehingga client hanya dapat mengakses didalam server.
-
Penggunaan PL/SQL
mudah dimengerti oleh setiap pengguna.
-
PL/SQL dapat
didesain khusus untuk database Oracle dalam menggunakan program aplikasi.
Structured Query Language (SQL) merupakan bahasa untuk
berkomunikasi dengan database relasional yang bersifat deklaratif (bukan
procedural) dengan menyatakan hasil (bukan cara memperoleh hasil).
Statement
SQL akan diperiksa pada saat kompilasi dan jika terjadi kesalahan referensi,
pesan kesalahan segera ditampilkan. Apabila SQL static berhasil dikompilasi
berarti statement itu telah mereferensi objek yang valid.
Ada dua
cara menggunakan SQL dinamik dalam PL/SQL yaitu SQL dinamik native dan paket
DBMS_SQL. SQL dinamik native dapat diletakkan secara langsung di dalam PL/SQL
seperti perintah create table log_error yang dijalankan melalui statement
EXECUTE IMMEDIATE. Selain statement DDL untuk mereferensi objek yang belum
tersedia pada saat kompilasi, SQL dinamik juga dapat menggunakan statement
control transaksi , SQL dinamik session, control system, dan statement DML. SQL
dinamik insert into log_error
dikerjakan dengan paket DBMS_SQL. Paket PL/SQL ini memiliki beberapa prosedur
seperti untuk membuka, parsing, dan mengeksekusi cursor.
SQL
dinamik lebih mudah digunakan dan kecepatannya lebih baik dibandingkan
penggunaan paket DBMS_SQL. Selain mendukung penggunaan semua tipe data termasuk
yang user-defined, SQL dinamik native dapat mengambil baris data ke dalam
record PL/SQL (fetch)
PL/SQL
mengkombinasikan kemampuan manipulasi data SQL dengan kemampuan bahasa
procedural, dengan kata lain PL/SQL adalah SQL ditambah Procedural Language.
PL/SQL merupakan bahasa berstruktur blok yang berupa fungsi, prosedur, dan blok
anonym. Suatu blok biasanyaditujukan untuk menyelesaikan suatu tugas tertentu
dan suatu blok boleh memiliki subblok (nexted).
Struktur blok PL/SQL itu terdiri dari bagian deklarasi, bagian kode program,
dan bagian eksepsi untuk penanganan error.
Syntaks
Struktur Blok PL/SQL
[DECLARE
Deklarasi variable ]
BEGIN
Kode program
[EXCEPTION
Penanganan error]
END;
Selain
membuat fungsi prosedur, PL/SQL juga digunakan untuk manghasilkan paket untuk
mengelompokkan fungsi dan prosedur, serta untuk pembuatan kode program dalam
trigger. Tentu saja developer akan sering memanfaatkan PL/SQL untuk membuat
modul atau subprogram baik yang dilakukan melalui SQL*Plus, From Builder, Procedural Builder, maupun Oracle Portal.
2.1 Blok PL/SQL Anonim
Blok
PL/SQL Anonim adalah blok PL/SQL tanpa nama dan tidak menggunakan parameter.
Blok anonym tidak disimpan dalam database sehingga tidak bisa direferensi oleh
blok PL/SQL lain.
Pada
saat blok ini dijalankan pertama kali, penempatannya ke shared pool harus
didahului dengan proses parsing dan kompilasi.Proses reparsing dan rekompilasi
tidak dilakukan jika blok telah berada di shared pool. Apabila blok PL/SQL itu
telah dikeluarkan dari shared pool, eksekusi ulang terhadap blok PL/SQL tadi
harus melalui tahapan parsing dan kompilasi. Ini disebabkan blok PL/SQL tidak
disimpan di databse meskipun blok itu bisa disimpan pada file system operasi.
Dalam pemograman modular, blok-blok
PL/SQL anonym itu dapat diubah menjadi fungsi, prosedur, atau paket sehingga
blok PL/SQL bisa direferensi melalui namanya dan menghindar duplikasi pembuatan
kode program.
2.1.1 Parameter
Subprogram
dipanggil dengan melewatkan nilai, variable, atau ekspresi susuai parameter
yang ada. Variabel yang bersada pada statement pemanggikl subprogram atau yang
disebut parameter actual akan dikirimkan ke parameter formal, yaitu variable
yang dideklarasikan pada fungsi atau prosedur yang dipanggil. Parameter formal
dan actual itu harus memiliki tipe data yang sama atau kompatibel.
Pemanggilan
subprogram untuk melewatkan parameter actual dapat dilakukan dengan cara notasi posisi parameter, notasi nama parameter, dan notasi kombinasi. Penerapan notasi
posisi melakukan pemanggilan subprogram berdasarkan posisi atau urutan
parameter formal. Notasi nama parameter melakukan pengiriman parameter actual
dengan cara menyertakan nama parameter formal diikuti tanda panah ‘=>’ dan
nilai atau variabelnya. Pada notasi kombinasi pemanggilan subprogram dapat menyertakan notasi posisi dan notasi
nama parameter dengan ketentuan bahwa notasi posisi dan mandahului notasi nama
pada parameter actual.
2.1.2Mode Parameter
Parameter
formal menerima nilai atau variable dari parameter actual. Subprogram dapat
menggunakan parameter formal sesuai mode parameter yang ditetapkan yaitu IN,
OUT, dan IN OUT. Secara default setiap parameter formal menggunakan mode In
yang berarti bahwa parameter itu hanya dapat dibaca atau direfernsi dalam body
subprogram. Mode OUT berarti parameter formal hanya dapat ditulis atau
diberikan nilai, sedangkan mode IN OUT memungkinkan parameter formal untuk
dibaca dan ditulis. Jadi untuk dapat mengmbalikan berbagai nilai maka
subprogram harus menggunakan mode OUT atau mode IN OUT, sedangkan mode IN
bersifat seperti konstanta yang tidak dapat dimodifikasikan dalam body prosedur
yang dipanggil.
2.1.3 Compiler Hint
Nocopy
Proses
pengiriman parameter actual dilakukan dengan dua cara yaitu by reference dan by
value. Pangiriman parameter actual secara by reference dilakukan dengan
melewatkan pointer parameter actual ke parameter formal sehingga kedua
parameter mereferensi lokasi memori yang sama. Mekanisme itu berlangsung pada
parameter formal dengan mode IN.
Secara
default, pengiriman parameter actual pada subprogram yang menggunakan mode OUT
dan mode IN OUT dilakukan secara by value yaitu nilai parameter actual
di-copy-kan ke parameter formal. Setelah eksekusi subprogram diakhiri, nilai
parameter formal akan di-copy-kan ke parameter actual sehingga nilai parameter
actual berubah. Untuk mengubah pola pengiriman by value menjadi by reference
gunakan hint compiler NOCOPY sehingga copy nilai datadapat dihindari.
Penggunaan copy nilai data antara kedua parameter itu dapat meurunkan kecepatan
eksekusi dan meningkatkan penggunaan memori terutama pada parameter yang menangani data berukuran besar seperti
record, collection dan tipe objek.
Nocopy menyebabkan perubahan nilai pada
parameter formal segera mempengaruhi nilai parameter actual. Ini berbeda dengan
kondisi defaultnya dimana jika subprogram berakhir secara tidak normal maka
parameter formal tidak akan dicopy pada parameter actual. Sebagai suatu hint compiler, nocopy melakukan pengiriman parameter by reference, sebaliknya parameter actual dilakukan secara by value.
Hint
ini memungkinkan terjadinya parameter
aliasing yaitu suatu kondisi di mana beberapa nama variable atau parameter
mengacu pada lokasi memori yang sama. Ini bisa terjadi jika variable global
digunakan sebagai parameter actual dan variable global itu direferensi dalam
subprogram. Situasi itu bisa menimbulkan masalah kesalahan logika. Oleh karena
itu dalam pemrograman perlu diperhatikan scope atau duraasi pengguanaan
variable.
2.2 PL/SQL Server Page
PL/SQL
Page (PSP) digunakan untuk membuat web page dengan content dinamik. Jika PSP
dibuat menggunakan tag maka script PL/SQL akan disisipkan dalam file HTML
sehingga ada bagian static yaitu tag HTML dan bagian dinamik yang berisi script
PL/SQL. Bagian static ini merupakan template untuk menampung data dari bagian
PL/SQL.
Isi web
page akan ditampilkan secara dinamik dengan membaca [kode PL/SQL yang
disisipkan melalui tag khusus dan sudah diloading ke databse atau dikompilasi
sebagai PSP. Web page dinamik itu juga bisa dihasilkan dengan secara langsung
membuat stored procedure dalam databse yang mengakses paket owa atau paket htp
dan htf dari PL/SQL Web Toolkit.
2.2.1 Konfigurasi
PL/SQL Gateway
Setiap
PL/SQL gateway dikaitkan dengan database access descriptor (DAD) yang terdiri
dari kumpulan konfigurasi untuk mengakses database seperti Net8 service atau
nama database dan string koneksi. Untuk membuat DAD, jalanakn pada web browser
alamat http://oms/pls/admin_/gateway/.htm hingga ditampilkan Gateway
Configurasi Menu. Kemudian klik gateway databse acces descriptor setting dan
isi karakteristik DAD yang baru.
Hasil
konfigurasi itu akan memperbaharui file wdbsvr.app yang terdapat di folder
oracle_home\Apache\ modplsq\cfg. Meskipun Anda bisa mengubah file konfigurasi
ini , sebaiknya lakukan perbahan melalui web browser.
Penggunaan PL/SQL gateway pada web
browser dilakukan dengan format :
2.2.2 Instalasi PL/SQL
Web Toolkit
Instalasi paket PL/SQL Web toolkit
dibuat dengan cara berikut :
SQL> conn
sys/change_on_install@dbcom as sysdba
SQL>
@D:\oracle\ora90\Apache\modplsql\owa\owaload.sql
SQL> conn
hr/hr
2.2.3 LOADPSP
Loadpsp
adalah tool untuk menyimpan file PL/SQL Server Page yang berekstensi.psp ke
dalam database sebagai stored procedure. Tool itu dijalankan dari command
prompt dengan bentuk eksekusi loadpsp
[-replace] –user nama/pwd@namadb file_psp. Beberapa file psps dapat
di-loading sekaligus ke database dimana sati file psp merupakan satu stored
procedure. Kompilasi stored procedure itu segera dilakukan pada saat loading
stored procedure ke database.
2.2.4 Membuat file PSP
Pembuatan
file psp pada script di bawah menggunakan tag dinamik untuk mengakses kode
PL/SQL dan tag static HTML sebagai template. Buatlah file psp itu dengan teks
atau html editor.
Kemudian
loading file psp itu ke server dengan tool loadpsp misalnya D:>loadpsp –replace –user hr/hr@dbcom
d:\emp.psp. Perintah tersebut akan menghasilkan prosedur top10_gaji pada
schema user hr dengan contoh script.
2.2.5 Menjalankan PSP
Stelah PSP loading sebagai stored
procedure database, eksekusinya dilakukan melalui web browser sesuai
konfigurasi PL/SQL atau Web gateway, misalnya alamat http://omspls/hr9i/top10_gaji
Jika prosedur http://omspls/hr9i/tampil_all_emp dipanggil maka data tabel employees
segera ditampilkan menggunakan paket PL/SQL Web Toolkit.
2.2.6 Mengirim
Parameter Form
Untuk
membuat web page lebih interaktif, pada stored procedure yang menghasilkan
(generate) web page bisa dikirimkan parameter untuk membuat out yang
bervariasi.
Parameter
ke stored procedure dilewatkan dengan mekanisme Common Gateway Interface (CGI)
baik dengan metode POST maupun GET. Metode post melewatkan parameter secara
langsung dari form sehingga tidak tampak pada alamat URL. Sedangkan metode GET
mengirim parameter melalui query string di URL yang dipisahkan dengan karakter
‘&’, sedangkan karakter yang non-alphanumeric akan di-encode misalnya GET
adalah http://host/pls/DAD/schema/namapsp?parmname1=value1&parmname2=value2
sedangkan metode POST berupa http://host/pls/DAD/schema/namapsp
.
Prosedur
frm_get menerima parameter melalui argument pdep yang selanjutnya digunakan
untuk meng-query tabel employees melalui penerapan cursor. Pada web browser
jalankan prosedur frm_get sehingga akan tampil tabel yang sesuai.
PSP
juga dapat digunakan pada Oracle Portal untuk membuat web dinamik. Oracle
Portal adalah komponen dari Oracle9iAS untuk membuat web secara cepat melalui
penggunaan portlet dan komponen pemrograman seperti Form dan Report. Oracle
Portal juga menyediakan fasilitas customize web page sehingga setiap user bisa
membuat preferensi web page-nya masing-masing.
Struktur
PL/SQL
Struktur
PL/SQL mirip dengan struktur bahasa pascal atau delphi yang menggunakan
struktur blok, sehingga akan mempermudah pengertian dalam pemrograman dengan
PL/SQL. Struktur Blok berisi perintah SQL dengan kondisi yang
berbeda. Perintah PL/SQL dapat
menangani kesalahan saat dijalankan. Setiap pengetikan dengan
menggunakan PL/SQL dalam SQL*Plus selalu
diakhiri dengan tanda /(slash). Sintaks penggunaan PL/SQL adalah sebagai
berikut :
- Declare
- Begin
- Exception
- End
Pemanggilan
PL/SQL :
-
Langsung dari SQL Plus
-
Dari Aplikasi
-
Dari PL/SQL lainnya
Aturan
penulisan:
-
Dapat ditulis dalam beberapa baris (tidak
harus dalam satu baris perintah)
-
Dapat berupa
nested blok
-
Karakter dan literal diapit oleh tanda kutip
-
Setiap perintah/blok diakhiri dengan titik
koma(;)
-
Komentar diawali dengan tanda min dua kali(--)
atau diapit dengan tanda /*…*/
-
Pemberian nilai menggunakan :=
-
Dapat menggunakan Bind Variable
-
Tanda garis miring(/) berarti “run”
Deklarasi Variabel dan Tipe Data
Bagian deklarasi variabel di antara kata kunci DECLARE dan BEGIN. Penamaan
variabel tidal bersifat case sensitive. Tipe data variabel dapat berupa salah
satu tipe data database Oracle atau tipe data built in PL/SQL.
Sintaks:
Identifier typedata
[(presisi, skala)] [NOT NULL] [:=iekspresi];
|
Dimana ekspresi bisa merupakan literal, variabel yang lain atau sebuah
ekspresi yang terdiri atas operator dan fungsi. Jika nilai inisial/awal tidak
diberikan, maka suatu variabel akan diberikan nilai NULL untuk nilai inisialnya.
Contoh untuk data karakter:
alamat VARCHAR2(20);
kodepos CHAR(5) := ‘40257’;
|
Contoh untuk tipe data number:
gaji
NUMBER(7,2);
jumlah NUMBER
NOT NULL := 0;
|
Contoh untuk tipe data tanggal:
alamat VARCHAR2(20);
kodepos CHAR(5) := ‘40257’;
|
Tanda := dipakai untuk menugaskan (assign) nilai kepada suatu
variabel. Nilai inisial/awal atau disebut juga nilai default adalah nilai yang
diberikan pada saat awal variabel tersebut dideklarasikan.
Tipe Data pada PL/SQL
Selain tipe data yang ada di Oracle SQL, PL/SQL menyediakan beberapa
tambahan tipe data yang dapat dideklarasikan sebagai berikut:
Tipe Data
|
Keterangan
|
BOOLEAN
|
Data lojikal dengan nilai TRUE atau FALSE.
|
DATE
|
Data tanggal waktu. Nilai yang valid adalah antara 1 Januari 4712 SM
sampai dengan 31 Desember 9999.
|
NUMBER [(p [,s])]
|
Tipe data numerik dengan p angka penting dan sejumlah s
angka penting di belakang koma. Nilai p adalah integer dengan nilai
maksimal 38 dan nilai s berada pada rentang -84 sampai dengan 127.
Nilai s negatif berarti pembulatan sampai dengan 10s terdekat.
|
FLOAT
|
Turunan dari NUMBER. Presisi sampai dengan 38 digit.
|
DOUBLE PRECISION
|
Sama dengan FLOAT.
|
REAL
|
Turunan dari number. Presisi sampai dengan 18 digit.
|
DEC [(p [,s])]
|
Sama dengan NUMBER [(p [,s])].
|
DECIMAL [( p [,s])]
|
Sama dengan NUMBER [(p [,s])].
|
NUMERIC [(p [,s])]
|
Sama dengan NUMBER [(p [,s])].
|
INTEGER [(n)]
|
Sama dengan NUMBER [(n,0)].
|
INT [(n)]
|
Sama dengan NUMBER [(n,0)].
|
SMALLINT [(n)]
|
Sama dengan NUMBER [(n,0)].
|
BINARY_INTEGER
|
Tipe variabel ini digunakan menyimpan nilai mulai dari
-2.147.483.647 s/d 2.147.483.647
|
NATURAL
|
Bagian dari binary integer, mampu menyimpan mulai dari 0 s/d
2.147.483.647.
|
NATURALN
|
Bagian dari binary integer, mampu menyimpan mulai dari 0 s/d 2.147.483.647.
Tipe data ini tidak boleh bernilai NULL.
|
POSITIVE
|
Bagian dari binary integer, mampu menyimpan mulai dari 1 s/d
2.147.483.647
|
POSITIVEN
|
Bilangan integer dengan rentang nilai 1 sampai dengan 2147483647. Tipe
data ini tidak boleh bernilai NULL.
|
SIGNTYPE
|
Tipe data bilangan yang bernilai -1, 0 atau 1.
|
PLS_INTEGER
|
Bilangan integer dengan rentang nilai -2147483647 sampai 2147483647.
|
VARCHAR2(n)
|
Data karakter dengan panjang tidak tetap. Nilai n minimum sama
dengan 1 dan maksimum sama dengan 32767 byte.
|
VARCHAR(n)
|
Sama dengan VARCHAR2(n).
|
CHAR [(n)]
|
Data karakter dengan panjang tetap sebesar n byte. Nilai n maksimum
adalah 32767. Nilai n minimum dan juga nilai default adalah 1.
|
STRING(n)
|
Sama dengan VARCHAR2(n).
|
CHARACTER [(n)]
|
Sama dengan CHAR(n).
|
LONG [(n)]
|
Data karakter dengan panjang tidak tetap. Nilai n maksimum sama
dengan 32760 byte.
|
NCHAR [(n)]
|
Data karakter dengan panjang tetap. Panjang maksimum sama dengan 32767
byte. maksimum bergantung pada national character set yang dipakai.
Nilai default adalah 1.
|
NVARCHAR2(n)
|
Data karakter dengan panjang tidak tetap. Panjang maksimum sama dengan
32767 byte. Nilai n maksimum bergantung pada national character set
yang dipakai.
|
RAW(n)
|
Data binary dengan panjang tidak tetap. Nilai n maksimum sama
dengan 32767 byte.
|
LONG RAW [(n)]
|
Data binary dengan panjang tidak tetap. Nilai n maksimum sama
dengan 32760 byte.
|
ROWID
|
Identitas baris pada suatu tabel-index yang dinyatakan dengan string
heksa desimal. Identitas tersebut menunjukkan posisi baris data. Tipe data
ini merupakan balikan dari kolom palsu ROWID.
|
UROWID [(n)]
|
Identitas baris pada suatu tabel-index yang dinyatakan dengan string
heksa desimal. Nilai n adalah ukuran kolom UROWID. Nilai n
maksimum adalah 4000 byte.
|
BFILE
|
Tipe data large object untuk data file.
|
BLOB
|
Tipe data large object untuk karakter binary.
|
CLOB
|
Tipe data large object untuk karakter satu byte.
|
NCLOB
|
Tipe data large object untuk karakter multi byte.
|
%TYPE
|
Untuk mendeklarasikan variabel dengan tipe data yang sesuai dengan suatu kolom
pada suatu tabel.
|
%ROWTYPE
|
Untuk mendeklarasikan variabel dengan tipe data yang sesuai dengan semua
kolom pada suatu tabel. Biasanya untuk menampung suatu cursor.
|
Pendeklarasian Konstanta
Sintaks:
Identifier
CONSTANT typedate[(presisi,skala)] := ekspresi;
|
Contoh:
pi CONSTANT
NUMBER(9,2):=3.14;
|
Atribut Variabel
Jika menggunakan variabel yang menampung nilai dari suatu kolom dari suatu
tabel, maka sebaiknya menggunakan atribut variabel. Hal ini untuk menghindari
terjadinya kerepotan seperti: user harus melihat struktur tabel yang terkait
terlebih dahulu untuk memberikan tipe data yang cocok. Selain itu jika terjadi
tipe data kolom maka deklarasi variabel tersebut harus diubah juga.
Atribut variabel berfungsi untuk memberikan tipe data yang sama dengan tipe
data suatu kolom dari suatu tabel. Atribut variabel juga dapat digunakan untuk
tipe data record. Dengan demikian, atribut variabel ada dua. Untuk atribut
kolom digunakan %TYPE, sedangkan untuk atribut record gunakan %ROWTYPE. Cara
penggunaannya ditunjukkan berikut ini:
[schema.]table.column%TYPE;
<cursor_name|[schema.]table>%ROWTYPE;
|
Sebagai contoh, varaiabel v_nama mempunyai tipe data yang sama dengan kolom
nama pada tabel pegawai. Deklarasi variabel tersebut dapat dituliskan seperti
ini:
v_nama
mahasiswa.nama%type;
|
Selain dapat digunakan untuk variabel record, atribut %ROWTYPE bisa dipakai
pada variabel cursor. Dan untuk mengakses baris-baris pada cursor atau record
tersebut digunakan format nama_var.COLUMN.
Contoh:
pgw_rec
pgw_cur%rowtype;
|
Menugaskan Nilai ke Dalam Variabel
Sintaks:
identifier := ekspresi;
|
Dimana identifier adalah nama variabel target, atau field untuk menerima
nilai dari ekspresi. Sedang ekspresi mungkin berupa literal, nama variabel lain
yang sudah ada, atau suatu ekspresi yang cukup kompleks yang diperlukan untuk
menentukan suatu nilai yang akan ditugaskan.
Contoh:
v_jumlah := 0;
|
Operator pada PL/SQL
Operator-operator SQL statement juga berlaku pada PL/SQL. Berikut ini
prioritas dari semua operator tersebut ditampilkan pada tabel di bawah ini
dengan prioritas yang lebih tinggi ditempatkan pada baris yang lebih atas:
Operator
|
Operasi
|
**, NOT
|
Pemangkatan dan negasi logika
|
+, -
|
Tanda positif dan negatif
|
*, /
|
Perkalian dan pembagian
|
+, -, ||
|
Penjumlahan., pengurangan dan konkatinasi
|
=, <, >, <=, >=, <>, !=, IS NULL, LIKE, BETWEEN, IN
|
Perbandingan
|
AND
|
Konjungsi
|
OR
|
inklusi
|
Mencetak Keluaran pada Layar SQL*Plus
Untuk mencetak sebuah nilai pada layar SQL*Plus dapat digunakan procedure
PUT, PUT_LINE dan NEW_LINE yang terdapat dalam package DBMS_OUTPUT. Package ini
merupakan salah satu package yang telah built in pada Oracle.
Procedure PUT dan PUT_LINE membutuhkan sebuah argumen berupa NUMBER,
VARCHAR2 ataupun DATE. Kedua procedure tersebut akan menyimpan argumen tersebut
ke dalam buffer dan akan ditampilkan di layar bila procedure tersebut
dijalankan.
Procedure NEW_LINE tidak membutuhkan argumen apapun. Procedure ini
berfungsi untuk menyimpan karakter new line ke dalam buffer.
Namun sebelum procedure tersebut dijalankan, harus dijalankan perintah “SET
SERVEROUTPUT ON” untuk mengaktifkan pencetakan ke layar dengan menggunakan
procedure yang ada pada package DBMS_OUTPUT.
SET
SERVEROUTPUT <ON|OFF> [SIZE n] [FOR[MAT]
<WRA[PPED] | WOR[D_WAPPED] | TRU[NCATED]]
|
Pilihan SIZE n bertujuan untuk menentukan jumlah byte maksimum yang dapat
ditampung oleh buffer. Nilai n ini tidak boleh kurang dari 2000 dan tidak boleh
lebih dari 1.000.000. Nilai defaultnya 2000. pilihan format bertujuan untuk
menetukan format keluaran. WRAPPED akan melanjutkan bagian yang tidak mencukupi
dari suatu baris ke baris yang baru. Pilihan TRUNCATE akan memotong
bagian yang melampaui ukuran satu baris tepat pada karakter yang berada setelah
batas maksimum baris. Ukuran satu baris, yakni jumlah karakter maksimum dalam
satu baris, ditentukan oleh sistem variabel LINESIZE.
Struktur Blok PL/SQL
Terdapat dua macam blok pada PL/SQL yaitu blok bernama dan blok tidak
bernama (anonymous block), dimana blok-blok ini akan membentuk suatu unit
PL/SQL. Blok-blok yang bernama bisa disimpan dan dapat berupa procedure, function
serta trigger. Sedangkan blok yang tidak bernama tidak dapat disimpan dalam
database kecuali jika dipakai sebagai subblok dalam sebuah unit PL/SQL bernama.
Secara
umum, satu blok PL/SQL yang lengkap terdiri atas tiga bagian, yaitu: declaration
section (bagian deklarasi variabel), executable section (bagian pengeksekusian)
serta exception section (bagian penanganan kesalahan). Berikut ini
penggambarannya:
[DECLARE
...] à DECLARATION SECTION
BEGIN
... à EXECUTABLE SECTION
[EXCEPTION
...] à EXCEPTION SECTION
END;
|
Dengan declaration dan exception bersifat opsional, maka satu bok PL/SQL
paling tidak terdiri atas executable section.
Contoh:
begin
null;
end;
|
Catatan: Null dipakai untuk menyatakan nilai yang tidak
diketahui, sehingga untuk contoh di atas, blok PL/SQL tersebut tidak melakukan
proses apapun.
1) DECLARATION SECTION
Digunakan untuk mendefinisikan atau mendeklarasikan variabel, konstanta, cursor
dan seluruh exception yang didefinisikan oleh user yang akan digunakan pada
bagian eksekusi. Penulisan blok ini dimulai dengan menulis DECLARE.
Contoh:
declare
v_nama
mahasiswa.nama%type;
v_nim
mahasiswa.nim%type;
|
2) EXECUTABLE SECTION
Digunakan untuk mengeksekusi atau menjalankan blok perintah PL/SQL seperti
pengulangan, percabangan, perintah SQL dan perintah cursor. Berisi statement
SQL untuk memanipulasi data pada basis data dan statement PL/SQL untuk
memanipulasi data dalam blok.
Contoh:
declare
v_nama
mahasiswa.nama%type;
v_nim
mahasiswa.nim%type;
begin
select nim,
nama into v_nim, v_nama
from pegawai
where nim=30108001
dbms_output.put_line(v_nama);
exception
when
no_data_found then
dbms_output.put_line(‘gak ada’);
end;
|
3) EXCEPTION SECTION
Merupakan bagian yang akan diaktifkan bila terjadi kesalahan atau pengecualian
pada saat menjalankan program PL/SQL. Exception section terdiri atas predefined
dan user defined. Sebagai contoh exception predefined NO_DATA_FOUND akan
diaktifkan bila perintah DML SQL tidak menemukan data dalam klausa WHERE.
Contoh:
declare
v_nama
mahasiswa.nama%type;
v_nim
mahasiswa.nim%type;
begin
select nim,
nama into v_nim, v_nama
from pegawai
where
nim=30108001
dbms_output.put_line(v_nama);
exception
when no_data_found then
dbms_output.put_line(‘gak ada’);
end;
|
Struktur Kondisional
Perintah IF terdiri atas tiga bentuk, yaitu IF
THEN, IF THEN ELSE, serta IF THEN ELSEIF. Struktur dari ketiganya ditampilkan
dalam satu rumusan umum sebagai berikut:
IF kondisi 1 THEN
Baris
perintah...
[ELSIF kondisi 2 THEN
Baris
perintah...]
...
[ELSE
baris
perintah..]
END IF;
|
Baris pada baris perintah dapat
berupa perintah IF sehingga akan membentuk blok IF bersarang. Bagian ELSIF bisa
muncul beberapa kali sesuai dengan kebutuhan sedangkan bagian ELSE biasanya
dipakai untuk menangani kondisi jika semua kondisi pada kalang IF... THEN atau
ELSIF... THEN tidak terpenuhi. Namun bagian ELSE ini bisa saja tidak digunakan.
contoh:
declare
penuh
exception;
n1
number;
n2
number;
begin
if
b1>n2 then
raise penuh;
else
dbms_ouput.put_line(‘bisa’);
end if;
end;
|
Struktur Iterasi
Pernyataan Loop
Untuk perintah LOOP, akan dilakukan
pengulangan terus-menerus. Bentuk umum dari pernyataan LOOP sebagai berikut:
LOOP
//Baris
perintah
END LOOP;
|
Karena
tidak mempunyai kondisi untuk keluar dari iterasi, maka perlu digunakan
perintah EXIT. Perintah EXIT dapat digunakan dengan cara seperti berikut:
EXIT WHEN kondisi;
|
Contoh:
DECLARE
x
number;
BEGIN
x
:= 0;
LOOP
x
:= x + 1;
EXIT
WHEN x > 5; -- exit loop immediately
END LOOP;
dbms_output.put_line('Hasil looping : '||x);
END;
|
Bisa juga digunakan format seperti ini:
IF kondisi THEN
EXIT;
END IF;
|
Contoh:
DECLARE
x
number;
BEGIN
x
:= 0;
LOOP
x := x + 1;
IF x > 5 THEN
EXIT; -- exit loop immediately
END IF;
dbms_output.put_line('Hasil
looping ke- '||x);
END LOOP;
END;
|
DECLARE
vno number;
BEGIN
vno:=1;
LOOP
insert
into coba(no) values vno;
vno:=vno+1;
if
vno > 10 then
exit;
end
if;
END LOOP;
END;
|
Pernyataan LOOP bisa diberi label atau nama,
sintaksnya sebagai berikut :
<<label_name>>
LOOP
sequence_of_statements
END LOOP
label_nama; //optional
|
Contoh:
<<outer>>
LOOP
...
LOOP
...
EXIT outer WHEN ... -- exit both loops
END
LOOP;
...
END LOOP outer;
|
Pada contoh
diatas, saat EXIT maka akan keluar dari kedua looping yang ada.
Pernyataan While - Loop
Perintah WHILE-LOOP akan terus
melakukan iterasi (memproses baris perintah secara berulang) selama KONDISI
bernilai TRUE. Bentuk umum dari pernyataan LOOP sebagai berikut:
WHILE kondisi LOOP
//Baris
perintah
END LOOP;
|
Contoh:
DECLARE
x
number;
BEGIN
x
:= 0;
WHILE x <= 5 LOOP
x := x + 1;
dbms_output.put_line('Hasil looping ke- '||x);
END LOOP;
END;
|
Selain dapat digunakan pada perintah
LOOP, perintah EXIT ini juga dapat digunakan pada WHILE-LOOP untuk menambahkan
kondisi tertentu. Namun perintah EXIT ini hanya bisa digunakan dalam loop saja.
Contoh:
DECLARE
vno number;
BEGIN
vno:=1;
WHILE vno <=
10 LOOP
insert
into coba(no) values vno;
EXIT
WHEN vno = 10;
vno:=vno+1;
END LOOP;
END;
|
Pernyataan For - Loop
Struktur pengulangan For
digunakan untuk menghasilkan pengulangan sejumlah kali tanpa penggunaan kondisi
apapun. Stuktur ini menyebabkan aksi diulangi sejumlah beberapa kali
(tertentu). Bentuk umum struktur for ada dua macam yaitu : menaik (ascending)
atau menurun (descending). Sintaksnya sebagai berikut :
FOR counter IN [REVERSE] i_terendah
.. i_teratas LOOP
Baris
perintah
END LOOP;
|
Perintah FOR-LOOP melakukan iterasi
selama nilai COUNTER berada dalam range nilai i_terendah dan i_teratas.
Pada FOR-LOOP, counter tidak perlu dideklarasikan. Penggunaan kata kunci
RESERVE akan menyebabkan nilai counter dimulai dari i_teratas ke i_terendah.
Dua titik antara i_terendah dan i_teratas merupakan operator rentang nilai.
i_terendah maupun i_terkecil bisa berupa nilai integer ataupun variabel yang
bernilai integer yang sudah dideklarasikan sebelumnya. i_upper harus lebih
besar dari i_lower dan jika tidak maka iterasi tidak akan dilakukan.
Contoh:
BEGIN
FOR vno IN
1..10 LOOP
insert
into coba(no) values vno;
dbms_output.put_line('Hasil
looping ke- '||x);
END LOOP;
END;
|
BEGIN
FOR
vno IN REVERSE 1..10 LOOP
insert
into coba(no) values vno;
dbms_output.put_line('Hasil
looping ke- '||x);
END
LOOP;
END;
|
Ruang Lingkup Pernyataan FOR – LOOP
Contoh :
DECLARE
ctr
INTEGER; -- global variable
BEGIN
...
FOR ctr
IN 1..25 LOOP
...
IF
ctr > 10 THEN ... -- refers to loop counter
END
IF;
END
LOOP;
END;
|
Untuk menuju ke variabel global, harus
ditambahkan label dan notasi dot.
Contoh :
<<main>>
DECLARE
ctr
INTEGER;
...
BEGIN
...
FOR ctr
IN 1..25 LOOP
...
IF
main.ctr > 10 THEN -- refers to global variable
...
END
IF;
END
LOOP;
END main;
|
Hal ini juga berlaku untuk nested loop.
Contoh :
<<main>>
DECLARE
ctr
INTEGER;
...
BEGIN
<<outer>>
FOR step
IN 1..25 LOOP
FOR
step IN 1..10 LOOP
...
IF outer.step > 15 THEN
...
END IF;
END
LOOP;
END LOOP
outer;
END main;
|
Selain dapat digunakan pada perintah
LOOP, perintah EXIT ini juga dapat digunakan pada FOR-LOOP untuk menambahkan
kondisi tertentu. Namun perintah EXIT ini hanya bisa digunakan dalam loop saja.
Contoh:
BEGIN
FOR j IN 1..10 LOOP
FETCH
c1 INTO mhs_rec;
EXIT
WHEN c1%NOTFOUND;
...
END
LOOP;
END;
|
BEGIN
<<outer>>
FOR i IN
1..5 LOOP
...
FOR
j IN 1..10 LOOP
FETCH c1 INTO mhs_rec;
EXIT outer WHEN c1%NOTFOUND; -- exit both FOR loops
...
END
LOOP;
END LOOP
outer;
--
control passes here
END;
|
Perintah GOTO
Perintah ini digunakan untuk
mengarahkan proses ke baris yang ditandai dengan label tertentu. Bentuk umum
pemakaian perintah ini adalah:
GOTO
nama_label;
|
Untuk memberikan label pada suatu
baris tertentu, gunakan format penamaan label seperti berikut ini:
<<nama_label>>
|
Penggunaan perintah GOTO dalam jumlah
yang banyak akan menyebabkan suatu blok PL/SQL menjadi tidak terstruktur.
Karena itu sebaiknya penggunaan GOTO ini dihindari.
Contoh:
DECLARE
x
number;
BEGIN
x
:= 0;
LOOP
x := x + 1;
IF x = 5 THEN
GOTO EndOfLoop;
END IF;
END LOOP;
<<EndOfLoop>>dbms_output.put_line('Hasil looping : '||x);
END;
|
Contoh:
create or
replace procedure coba
(v_nim mahasiswa.nim %type) is
cursor mhs_cur is
select nim, nama, alamat
from mahasiswa
where nim=v_nim;
mhs_rec
mhs_cur%rowtype;
begin
open
mhs_cur;
<<iterasi>>
fetch mhs
_cur into mhs _rec;
if mhs
_cur%notfound then
goto lbl_end;
end if;
dbms_output.put_line(mhs
_rec.nama_pegawai||' '||
mhs_rec.alamat||'
'|| mhs_rec.gaji);
goto
iterasi;
|
Dengan adanya perintah “goto iterasi”,
proses berikutnya menuju baris “<<iterasi>>” yang berada beberapa
sebelum baris goto tersebut. Selanjutnya, perintah-perintah yang mengikutinya
akan diproses sesuai dengan urutannya (sekuensial). Sedangkan perintah
“<<lbl_end>>” menentukan proses berikutnya adalah baris
“<<lbl_end>>” yang berada setelah perintah goto tersebut.
Namun
demikian, pada saat menggunakan perintah goto harus diperhatikan hal-hal
berikut:
- perintah goto tidak boleh menuju label yang berada dalam perintah IF, LOOP, blok lain dan blok yang menjadi sub bloknya.
- Sebuah label harus diikuti oleh paling tidak sebuah perintah eksekusi PL/SQL. Kata atau reserved word seperti END, END IF dan END LOOP tidak termasuk sebagai perintah eksekusi. Tetapi NULL termasuk perintah eksekusi.
Wah, Terimakasih ilmunya.. :)
ReplyDelete