SQL - Part II (input, output, if, looping)

Selasa, 16 November 2010

Kita dapat menggunakan scrip untuk menghasilkan kodingan di cmd dengan cara langsung. Dengan langkah-langkah sebagai berikut :
Ketikan script SQL di notepad dengan format (.sql, all file)


Kita harus membuka cmd (ctrl + R + ketik cmd + enter)
Kita harus mengetikan sqlplus
Setelah itu harus connect atau login ke oracle dengan username hr dan password hr
Kalau sudah connect kita harus mengetikan SET SERVEROUTPUT ON
Ketik @’---(hasil copy link notepad)--- \---- .sql’;



Contoh-contoh Script dan Tampilan Hasil

1. output : Menampilkan First_Name, Last_Name, Salary from employees
    script :
            select * from tab;
            desc employees;
            select first_name, last_name, salary from employees;

2. output : Bismillah, Nama Saya ....
    script :





            declare
            begin
            dbms_output.put_line('Bismillah, Nama Saya Novia Liestarini');
            end;
            /





3. input : nama
    output : Bismillah, Nama Saya
    script :

            declare





a varchar (30);
begin
a:='&masukkan_nama_anda';
dbms_output.put_line('Bismillah Nama Saya '||a);
end;
/


4. input : nama, umur
    output : Jumlah umur ditambah 5tahun umur kedepan
    script :





declare
a varchar (30);
b number (9);
c number (9);
begin
a:='&masukkan_nama_anda';
b:='&masukkan_umur_anda';
c:=b+5;
dbms_output.put_line('Hai, nama saya '||a);
dbms_output.put_line('5 Tahun lagi umur saya '||c||'tahun');
end;
/


5. input : angka1, angka2, angka3, angka4
    output : Selamat datang dikalkulator cupu 
                Penjumlahan (+)
                Pengurangan (-)
                Perkalian (*)
    script :





declare
a number (9);
b number (9);
c number (9);
d number (9);
e number (9);
begin
a:=&masukkan_angka;
b:=&masukkan_angka;
c:=a+b;
d:=a-b;
e:=a*b;
dbms_output.put_line('SELAMAT DATANG DI KALKULATOR CUPU');
dbms_output.put_line(a|| '+' ||b|| '=' ||c);
dbms_output.put_line(a|| '-' ||b|| '=' ||d);
dbms_output.put_line(a|| '*' ||b|| '=' ||e);
end;
/


6. output : Sekarang hari sabtu (enter) Kemarin hari jum'at
    script :





declare
begin
dbms_output.put_line('Sekarang hari sabtu');
dbms_output.put_line('kemarin hari jum''at');
end;
/


7. input : x, y
    output : Persegi panjang ini kelilingnya ... cm (enter) Luasnya ... cm
    script :



declare
x number(20);
y number(20);
c number(20);
d number(20);
begin
x:=&masukkan_nilai_x;
y:=&masukkan_nilai_y;
c:=x+y+x+y;
d:=x*y;
dbms_output.put_line('Persegi panjang ini kelilingnya '||c||'cm');
dbms_output.put_line('Luasnya '||d||'cm');
end;
/


8. output : Hari, Tanggal, Bulan, Tahun
    script :



            declare
            begin
            dbms_output.put_line ('Sekarang hari '||to_char(sysdate,'DAY')
                                             ||'tanggal '||to_char(sysdate,'DD ')
                                             ||'bulan '||to_char(sysdate,'MM ')
                                             ||'tahun '||to_char(sysdate,'YYYY'));
            end;
            /



9. input : nama, harga_buku, jumlah_diskon
    output : Selamat datang ... (enter) Harga yang harus dibayar Rp ...
    script :
            declare
            a varchar (30);


            b number (10);
            c number (10);
            d number (10);
            e number (10); 
            begin
            a:='&masukkan_nama';
            b:=&masukkan_harga_buku;
            c:=&masukkan_diskon;
            d:=b*c/100;
            e:=b-d; 
            dbms_output.put_line('Selamat Datang '||a);
            dbms_output.put_line('Harga yang harus dibayar Rp '||e); 
            end;
            /


10. input : nama, harga_buku, jumlah_diskon
      output : Harga < 50 (Ih, pelit banget) (enter) Harga > 50 (Wow, baik banget)
      script :
             declare
             a varchar (30);
             b number (10);
             c number (10);
             d number (10);
             e number (10);
             f varchar (50); 
             begin
             a:='&masukkan_nama';
             b:=&masukkan_harga_buku;
             c:=&masukkan_diskon;
             d:=b*c/100;
             e:=b-d; 
             --mengeluarkan tampilan dengan kata ih, pelit banget
             if c<=50 then
            dbms_output.put_line('Ih, pelit banget'); 
             --mengeluarkan tampilan dengan kata ih, baik banget
            else
            dbms_output.put_line('Wow, baik banget');
            end if; 
            dbms_output.put_line('Selamat Datang '||a);
            dbms_output.put_line('Harga yang harus dibayar Rp '||e); 
            end;
            /

11. input : masukkan_nilai_a, masukkan_nilai_b
     output : Hasil pengurangan (jika a<b penjumlahan; a>b pengurangan; a=b    sama dengan)
     script :


             declare
             a number (9);
             b number (9);
             c number (9);
             d number (9);
            begin
            a:=&masukkan_nilai_a;
            b:=&masukkan_nilai_b;
            c:=a+b;
            d:=a-b;
            if a<b then
            dbms_output.put_line('Hasil penjumlahan '||c);
            else if a>b then
            dbms_output.put_line('Hasil pengurangan '||d);
            else if a=b then
            dbms_output.put_line('a sama dengan b');
            end if;
            end if;
            end if;
            end;
            /


12. input : masukkan_nilai_x
     output : n
                  .
                  .
                  .
                 1
      script :


              declare
              x number (3);
              begin
              x:=&berapa;
             for i in 1..x loop
                       dbms_output.put_line(x);
                       x:=x-1;
              end loop;
              end;
              /



13. input : masukkan_nilai_x
     output : 1 ganjil
                 genap
                 3 ganjil
                 genap
                 .
                 .
                 .
                 n
      script :


              declare
              x number(2);
              begin
              x:=&nilai_x;
              for i in 1..x loop
                      if mod(i,2)=1 then
                         dbms_output.put_line(i||' ganjil');
                      else
                         dbms_output.put_line('genap');
                      end if;
              end loop;
              end;
              /


14. input : angka 1-7
     output : Nama hari (Senin, Selasa, Rabu, Kamis, Jum'at, Sabtu, Minggu)
     script :

            declare
            a number (9);
            begin
            a:=&masukkan_angka;
            if a='1' then
           dbms_output.put_line('hari senin');
           else if a='2' then
           dbms_output.put_line('hari selasa');
           else if a='3' then
           dbms_output.put_line('hari rabu');
           else if a='4' then
           dbms_output.put_line('hari kamis');
           else if a='5' then
           dbms_output.put_line('hari jumat');
           else if a='6'then
           dbms_output.put_line('hari sabtu');
           else if a='7' then
           dbms_output.put_line('hari minggu');
           end if;
           end if;
           end if;
           end if;
           end if;
           end if;
           end if;
           end;
           /


15. input : harga_buku, jumlah_buku
     output : Total_harga (jika > 50000 diskon 10%)
     script :

             declare
             a number (9);
             b number (9);
             c number (9);
             d number (9);
             begin
             a:=&masukkan_harga_buku;
             b:=&jumlah_buku;
             c:=a*b;
                  if c>50000 then
                  d:=c-(c*10/100);
                  dbms_output.put_line('Total Harga '||d);
                  else
                  dbms_output.put_line('Total Harga '||c);
                  end if;
             end;
             /



16. input : nama
     output : Selamat Pagi/ Siang/ Sore/ Malam
     (catatan : pagi 05-12, siang 12-16, sore  16-21, malam sisanya)
      clue : to_char(Sysdate,"HH24")
     script :

             declare
             a varchar (30);
             b varchar (3);
             begin
             a:='&masukkan_nama';
             b:=to_char(sysdate,'HH24');
             if (b>05 and b<=12) then
                     dbms_output.put_line('Selamat Pagi');
             else if (b>12 and b<=16) then
                     dbms_output.put_line('Selamat Siang');
             else if (b>16 and b<=21) then
                     dbms_output.put_line('Selamat Sore');
             else
                     dbms_output.put_line('Selamat Malam');
             end if;
             end if;
             end if;
             end;
             /

created by :
Novia Liestarini
30109097
Pis-09-04
Manajement Infromatika

    SQL - Part III (Explisit dan Implisit)

    Minggu, 07 November 2010

    PL/SQL

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


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

    Struktur Blok
          PL/SQL merupakan bahasa block-structured (berstruktur blok). Yaitu bahwa unit-unit dasar (procedure, function, dan blok tanpa nama (anonymous block)) yang membentuk program PL/SQL merupakan blok logikal, yang mana dapat berisi beberapa sub-sub blok bersarang (nested-blocks).



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

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

    - Memberikan Nilai ke Variable
    Kita dapat memberikan nilai ke variable dengan tiga cara. Yaitu:
    1. Menggunakan assignment operator (:=), yaitu titik dua diikuti dengan sama dengan. Contoh :
    tax := price * tax_rate;
    valid_id := FALSE;
    bonus := current_salary * 0.10;
    wages := gross_pay(emp_id, st_hrs, ot_hrs) - deductions;

    2. Melakukan select (atau fetch) terhadap nilai-nilai yang ada di dalam database ke variable tersebut. Contoh :
    SELECT sal * 0.10 INTO bonus FROM emp WHERE empno = emp_id;

    3. Melewatkannya sebagai parameter OUT atau IN OUT kepada sebuah subprogram. Contoh :
    parameter IN OUT mengijinkan kita untuk melewatkan nilai awal ke subprogram yang sedang dipanggil dan kemudian mengembalikan nilai perubahannya kepada pemanggilnya:
    DECLARE
    my_sal REAL(7,2);
    PROCEDURE adjust_salary (emp_id INT, salary IN OUT REAL) IS ...
    BEGIN
    SELECT AVG(sal) INTO my_sal FROM emp;
    adjust_salary(7788, my_sal); -- assigns a new value to my_sal

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

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



     Gambar 1-2

    Query yang menghasilkan banyak baris data mirip dengan pemrosesan file. Sebagai contoh, program COBOL membuka file, memproses records, dan kemudian menutup file.
    Demikian pula,program PL/SQL membuka cursor, memproses baris-baris data yang dihasilkan oleh query, kemudian menutup cursor tersebut. Seperti halnya file pointer yang menandai posisi terkini di dalam file yang sedang terbuka, cursor menandai posisi terkini dari result set.

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

    - Cursor Variable
            Seperti halnya cursor, cursor variable menunjuk kepada baris terkini (current row) di dalam result set dari multi-row query. Tetapi, tidak seperti cursor, cursor variable dapat dibuka untuk type-compatible query.Ia tidak terikat dengan kepada query tertentu.

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

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

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

    Ketika kita mengeksekusi perintah:
    FETCH c1 INTO emp_rec;
    nilai di dalam kolom ename dari table emp diberikan ke field ename dari emp_rec, nilai dari kolom sal diberikan ke field sal, dan begitu seterusnya.


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

    - Conditional Control
    Seringkali, penting untuk melakukan aksi alternatif bergantung kepada kondisi permasalahannya.Perintah IF-THEN-ELSE mengijinkan kita untuk memproses perintah secara kondisional.

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

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

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

    - Subprogram
    PL/SQL memiliki dua tipe subprogram yang dinamakan procedure dan function, yang mana mengambil parameter dan dipanggil. Seperti contoh berikut ini, subprogram seperti program kecil (miniature program), yang diawali dengan header dan diikuti dengan bagian opsional declarative, bagian executable, dan bagian opsional exception-handling.
    Ketika dipanggil, procedure ini menerima kode karyawan. Kode tersebut digunakan untuk mendapatkan komisi karyawan dari database table, dan, pada saat yang sama, menghitung bonus 15%.Lalu, procedure akan mengecek total bonus. Jika bonus adalah null, exception akan tampil; sebaliknya, data penggajian karyawan akan di-update.

    - Packages
    PL/SQL mengijinkan kita untuk mem-bundle secara logikal terhadap tipe-tipe, variable-variable, cursor-cursor, dan subprogram-subprogram yang saling terkait ke dalam sebuah package.
    Package biasanya memiliki dua bagian: yaitu spesification dan body. Specification merupakan antarmuka untuk aplikasi-aplikasi kita; ia mendeklarasikan tipe, konstanta, variable, exception, cursor, dan subprogram yang tersedia untuk digunakan.

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

    Collection
    Tipe-tipe collection yaitu TABLE dan VARRAY membolehkan kita untuk mendeklarasikan index berdasarkan table (index-by tables), table bersarang (nested tables), dan array berukuran fleksibel (variable-size arrays). Collection merupakan kelompok elemen-elemen terurut, yang seluruhnya memiliki tipe sama. Setiap elemen memiliki subscript unik yang menentukan posisinya di dalam collection.Untuk mereferensi elemen, gunakan sintaks subscripting standar.

    Record
    Kita dapat menggunakan attribute %ROWTYPE untuk mendeklarasikan record yang merepresentasikan baris data di dalam table atau baris data yang dihasilkan dari sebuah cursor. Tetapi, dengan record yang didefinisikan oleh user (user-defined record), kita dapat mendeklarasikan field-field milik kita.

    Object Types
    Di dalam PL/SQL, object-oriented programming adalah berbasiskan pada object types. Object type meng-enkapsulasi struktur data yang berhubungan dengan functions dan procedures yang diperlukan untuk memanipulasi data tersebut.

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

    Algorithms
    Kita menerapkan information hiding untuk algoritma melalui top-down design. Sekali kita mendefinisikan spesifikasi tujuan dan antarmuka dari low-level procedure, kita dapat mengabaikan detil-detil implementasi. Mereka disembunyikan pada level-level yang lebih tinggi.

    Data Structures
    Kita menerapkan information hiding untuk data structures melalui data encapsulation. Dengan membagun kumpulan dari subprogram-subprogram utility untuk struktur data, kita mengisolasinya dari user-user dan developer-developer yang lain. Dengan cara itu, para developer mengetahui bagaimana menggunakan subprogram-subprogram yang mengoperasikan data structure namun tidak mengetahui bagaimana struktur tersebut direpresentasikan.

    Error Handling
    PL/SQL membuatnya mudah untuk mendeteksi dan memproses kondisi-kondisi yang telah didefinisikan terlebih dahulu atau yang didefinisikan oleh user, yang dinamakan dengan exceptions. Ketika error muncul, exception akan ditampilkan. Sehingga, eksekusi normal akan menghentikan dan mengontrol transfer ke bagian exception-handling (penanganan kesalahan) dari blok atau subprogram PL/SQL kita. Untuk menangani exception yang muncul, kita menulis rutin terpisah yang dinamakan dengan exception handlers.

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

    Gambar 1-4

    Manfaat PL/SQL
    -Mendukung SQL
    > SQL telah menjadi bahasa basis data standar karena ia fleksibel, powerful, dan mudah dipelajari. Beberapa perintah-perintah seperti bahasa Inggris seperti SELECT, INSERT, UPDATE, dan DELETE membuatnya mudah untuk memanipulasi data yang tersimpan di dalam basis data relasional (relational database).
    > SQL adalah non-prosedural, yang berarti bahwa kita dapat menetapkan apa yang ingin kita lakukan tanpa menentukan bagaimana melakukannya.
    PL/SQL mengijinkan kita untuk menggunakan seluruh perintah-perintah data manipulation, cursor control, dan transaction control SQL begitu pula dengan functions, operators, dan pseudocolumns. Sehingga, kita dapat memanipulasi data secara lebih fleksibel dan aman.
    > PL/SQL juga mendukung SQL dinamis (dynamic SQL), sebuah teknik pemrograman tingkat lanjut yang membuat aplikasi-aplikasi kita lebih fleksibel dan serbaguna.

    - Mendukung Object-Oriented Programming
           Object types merupakan tool pemodelan berorientasi objek yang ideal, dimana kita dapat menggunakannya untuk mengurangi biaya dan waktu yang dibutuhkan untuk membangun aplikasi-aplikasi kompleks.
    Dengan mengenkapsulasi operasi-operasi dengan data, object types mengijinkan kita untuk memindahkan kode-kode pemeliharaan data keluar dari script-script SQL dan blok-blok PL/SQL menuju kepada methods. Object types juga menyembunyikan detil-detil implementasi, sehingga kita dapat mengubah detil-detil tanpa mempengaruhi program-program pada sisi klien.Sebagai tambahan, object types memperbolehkan pemodelan data yang realistis. Entitas-entitas kompleks pada dunia nyata beserta relasi-relasinya dipetakan secara langsung ke dalam object types.
    Hal ini membantu program-program kita secara lebih baik merefleksikan dunia yang berusaha disimulasikannya.

    Gambar 1-5 PL/SQL Meningkatkan Performa

    PL/SQL juga meningkatkan performa dengan menambahkan kekuatan pemrosesan prosedural kepada tool-tool Oracle. 


    - Produktifitas Lebih Tinggi
    PL/SQL menambahkan fungsionalitas untuk tool-tool non-prosedural seperti Oracle Forms dan Oracle Reports.Dengan PL/SQL di dalam tool-tool ini, kita dapat menggunakan konstruksi prosedural yang sudah lazim untuk membangun aplikasi.

    - Portabilitas Penuh
    Aplikasi-aplikasi yang ditulis dengan PL/SQL portabel untuk setiap sistem operasi dan platform dimana Oracle berjalan.


    - Integritas dengan SQL
    Bahasa-bahasa PL/SQL dan SQL terintegrasi penuh satu sama lain. PL/SQL mendukung seluruh tipe-tipe data SQL dan nilai NULL. Hal ini memperbolehkan kita memanipulasi data Oracle secara lebih mudah dan efisien.Sehingga juga membantu kita untuk menulis kode program yang memiliki performa tinggi.

    - Keamanan yang baik
    Stored procedures PL/SQL memungkinkan kita untuk menyekat logika aplikasi diantara client dan server. Dengan cara itu, kita dapat mencegah aplikasi-aplikasi client agar tidak memanipulasi data yang sensitif.