Minggu, 09 Januari 2011

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.

Tidak ada komentar:

Posting Komentar