YR15CI Santolo

Bogor -> Cianjur -> Bandung -> Pantai Santolo Garut -> Cianjur Selatan -> Bogor

SEMAKIN DI DEPAN

YR15CI @BOGOR @Tangsel @CIKARANG R15 Bandung-MC

VR|46

#IAMUNITED

Pages

Sunday 8 June 2014

Modul PL/SQL



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.






1 comment: