PENGENALAN PL/SQL DAN TIPE DATA
Pendahuluan
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.
Variabel dan Tipe Data
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.
0 komentar:
Posting Komentar