Tuesday, June 20, 2023

Pengantar singkat tentang PL/SQL (Procedural Language/Structured Query Language). 

PL/SQL adalah ekstensi dari SQL yang digunakan untuk membuat program yang menjalankan operasi database yang kompleks dan berjalan di dalam database Oracle.


Berikut ini adalah beberapa konsep dasar dalam PL/SQL:


Blok PL/SQL: Blok PL/SQL adalah unit dasar pemrograman dalam PL/SQL. Blok ini terdiri dari deklarasi, penanganan eksepsi (exception handling), dan bagian eksekusi.


Contoh blok PL/SQL:


DECLARE

   -- Deklarasi variabel

   nama_variabel datatype;

BEGIN

   -- Bagian eksekusi

   -- ...

EXCEPTION

   -- Penanganan eksepsi

   -- ...

END;


Variabel: Anda dapat mendeklarasikan variabel dalam blok PL/SQL. Variabel digunakan untuk menyimpan nilai sementara yang dapat digunakan dalam operasi selanjutnya.


Contoh deklarasi variabel:

DECLARE

   nama_variabel datatype;

BEGIN

   nama_variabel := nilai;

END;


Pengendalian alur: Anda dapat menggunakan pernyataan pengendalian alur seperti IF-THEN-ELSE, LOOP, dan CASE untuk mengontrol alur eksekusi program.


Contoh pengendalian alur IF-THEN-ELSE:

IF kondisi THEN

   -- Perintah yang dieksekusi jika kondisi bernilai TRUE

ELSE

   -- Perintah yang dieksekusi jika kondisi bernilai FALSE

END IF;

Prosedur dan Fungsi: Anda dapat membuat prosedur dan fungsi di PL/SQL. Prosedur adalah blok PL/SQL yang dapat dieksekusi, sedangkan fungsi mengembalikan nilai.


Contoh definisi prosedur:

CREATE OR REPLACE PROCEDURE nama_prosedur

IS

BEGIN

   -- Logika prosedur

END;


Contoh definisi fungsi:

CREATE OR REPLACE FUNCTION nama_fungsi

RETURN datatype

IS

BEGIN

   -- Logika fungsi

END;

Eksepsi: PL/SQL memiliki mekanisme penanganan eksepsi yang memungkinkan Anda untuk menangani kesalahan atau kondisi tidak normal dalam program Anda.


Contoh penanganan eksepsi:

BEGIN

   -- Logika program

EXCEPTION

   WHEN jenis_eksepsi THEN

      -- Penanganan kesalahan

END;


Ini hanya pengantar singkat tentang PL/SQL. Ada banyak konsep lain yang dapat dieksplorasi seperti penggunaan kursor, paket, dan trigger. Saya merekomendasikan Anda membaca dokumentasi resmi Oracle untuk mendapatkan pengetahuan yang lebih mendalam tentang PL/SQL.

Wednesday, December 6, 2017

Pernyataan PL / SQL GOTO


PL / SQL GOTO

Pernyataan  PL / SQL GOTO memungkinkan kamu untuk beralih ke pernyataan eksekusi yang spesifik di bagian eksekusi yang sama dari blok PL / SQL.

Sintaks dari pernyataan PL / SQL GOTO adalah sebagai berikut:

GOTO label_name

Dimana label_name adalah label yang mendefinisikan pernyataan target. Dalam sebuah program, kamu bisa menentukan label sebagai berikut:

<<label_name>>
Nama label dilampirkan dalam tanda kurung siku sudut (<< >>).

PL/SQL GOTO restrictions


Ada beberapa batasan dalam menggunakan pernyataan PL / SQL GOTO yang harus kamu sadari sebelum menggunakannya.

Pertama, pernyataan PL / SQL GOTO tidak dapat beralih ke pernyataan IF, pernyataan CASE, pernyataan LOOP, atau child-block.

Satu-satunya cara untuk membuat pernyataan IF adalah melalui pemeriksaan kondisinya. Hal ini juga diterapkan pada pernyataan CASE. Dalam contoh berikut, pernyataan GOTO mencoba melompat ke dalam sebuah pernyataan IF, yang tidak diperbolehkan. Akibatnya, PL / SQL mengeluarkan pesan kesalahan.

BEGIN
    GOTO goto_inside_if;
    IF v_status = 'COMPLETED' THEN
      <<goto_inside_if>>
      ...
    END IF;
END;


Pernyataan GOTO tidak bisa bercabang sampai tengah loop:

BEGIN
  GOTO goto_inside_loop;
  FOR n_day IN 1 .. 7
  LOOP
     <<goto_inside_loop>>
     ...
  END LOOP;
END;
Satu-satunya cara untuk memasuki child block adalah melalui pernyataan BEGIN-nya. Contoh berikut tidak sesuai dengan peraturan ini, sehingga menyebabkan kesalahan.

BEGIN
  GOTO inside_child_block;
  ...
  BEGIN
    ...
    <<inside_child_block>>
    ...
  END;
END;


Kedua, kamu tidak dapat menggunakan pernyataan GOTO untuk cabang dari bagian penanganan pengecualian kembali ke blok saat ini. Contoh berikut tidak sesuai dengan peraturan ini, karena itu menyebabkan kesalahan.

BEGIN
  --...
  <<back_to_exec>>
  --...
  EXCEPTION.
    --...
    WHEN SOMETHING_WRONG_HAPPENED.
        GOTO back_to_exec;
    --...
END;
Ketiga, kamu tidak bisa menggunakan pernyataan GOTO untuk keluar dari subprogram. Untuk mengakhiri subprogram, kamu akan melompat ke akhir subprogram menggunakan pernyataan GOTO atau menggunakan pernyataan RETURN.

Keempat, Anda tidak dapat menggunakan pernyataan GOTO untuk membuat cabang dari satu klausa IF ke yang lain, atau dari satu klausa WHEN dari pernyataan CASE ke yang lain.

Kelima, setidaknya harus ada satu pernyataan yang bisa dieksekusi muncul setelah label target. Jika kamu hanya ingin bercabang ke label target tanpa melakukan apapun, kamu menggunakan pernyataan NULL

Contoh PL / SQL GOTO


Contoh berikut menunjukkan bagaimana menggunakan pernyataan PL / SQL GOTO:

SET SERVEROUTPUT ON SIZE 1000000;
BEGIN
  GOTO label_1;
  DBMS_OUTPUT.PUT_LINE('Right after the GOTO statement');
  <<label_1>>
  DBMS_OUTPUT.PUT_LINE('It is here!');
END;
/
Keluaran dar script-nya adalah:

It is here!
Ketika PL / SQL mencapai pernyataan GOTO, ia melewatkan semuanya dan langsung melompat ke label sasaran yaitu label_1 dan ini menampilkan pesannya It is here.

Pernyataan PL / SQL GOTO memiliki reputasi buruk karena membuat kode sulit dipahami dan sulit untuk di-debug. Secara umum, pernyataan PL / SQL GOTO harus dihindari dan diganti dengan pernyataan lain seperti pernyataan IF atau CASE.

Namun, ada beberapa kasus yang menggunakan pernyataan GOTO bisa membuat program lebih efisien. Lihat contoh berikut ini:

BEGIN
   IF ... THEN
         FOR rec_emp IN cur_emp LOOP
            -- By pass all using GOTO
            GOTO <<exit_now>>
         END LOOP;
         -- a lot of code here
   END IF;
   -- target label
   <<exit_now>>
   NULL;
END;

Pada contoh di atas, alih-alih melewati banyak kode setelah pernyataan loop FOR pertama, kita bisa menggunakan pernyataan GOTO untuk melompat ke ujung blok yang membuat kode sangat efisien.

Dalam tutorial ini, kamu telah belajar bagaimana menggunakan pernyataan PL / SQL GOTO untuk cabang tanpa syarat ke label target di blok yang sama.




Sumber asli :http://www.plsqltutorial.com

Tuesday, December 5, 2017

Memperkenalkan PL / SQL Cursor


Ketika kamu bekerja dengan database Oracle, kamu bekerja dengan satu set baris lengkap yang dikembalikan dari sebuah pernyataan SELECT.

Namun aplikasi dalam beberapa kasus tidak dapat bekerja secara efektif dengan keseluruhan rangkaian hasil, oleh karena itu, server basis data perlu menyediakan mekanisme agar aplikasi dapat bekerja dengan satu baris atau subset dari hasil yang ditetapkan pada satu waktu.

Akibatnya, Oracle membuat kursor PL / SQL untuk menyediakan ekstensi ini.

Cursor PL / SQL adalah pointer yang menunjukkan hasil query SQL terhadap tabel database.

Bekerja dengan Cursor PL / SQL


Gambar berikut menjelaskan langkah-langkah yang perlu Anda ikuti saat Anda bekerja dengan cursor PL / SQL:


PL/SQL Cursor

Mari kita periksa setiap langkah secara lebih rinci.

Mendeklarasikan PL / SQL Cursor


Untuk menggunakan kursor PL / SQL, pertama-tama kamu harus mendeklarasikannya di bagian deklarasi blok PL / SQL atau dalam sebuah paket sebagai berikut:

CURSOR cursor_name [ ( [ parameter_1 [, parameter_2 ...] ) ]
      [ RETURN return_specification ]
IS sql_select_statements
[FOR UPDATE [OF [column_list]];

  •     Pertama, kamu menyatakan nama cursor cursor_name setelah kata kunci cursor. Nama cursor bisa memiliki panjang hingga 30 karakter dan mengikuti aturan penamaan pengenal di PL / SQL. Penting untuk dicatat bahwa nama cursor bukan variabel sehingga Anda tidak dapat menggunakannya sebagai variabel seperti menugaskannya ke cursor lain atau menggunakannya dalam sebuah ekspresi. Parameter1, parameter2 ... adalah elemen opsional dalam deklarasi cursor. Parameter ini memungkinkan Anda untuk melewatkan argumen ke cursor. RETURN return_specification juga merupakan bagian opsional.
  •     Kedua, kamu menentukan pernyataan SQL yang valid yang mengembalikan kumpulan hasil yang akan ditunjukkan cursor.
  •     Ketiga, kamu bisa menunjukkan daftar kolom yang ingin kamu update setelah FOR UPDATE OF. Bagian ini bersifat opsional sehingga kamu bisa menghilangkannya dalam deklarasi CURSOR.

Berikut adalah contoh untuk mendeklarasikan cursor:

CURSOR cur_chief
IS
  SELECT
    first_name, last_name, department_name
  FROM
    employees e
  INNER JOIN departments d ON d.manager_id = e.employee_id;
Kami mengambil data dari tabel karyawan dan departemen menggunakan klausa SELECT with the INNER JOIN dan menetapkan kursor cur_chief ke set hasil ini.

Membuka Cursor PL / SQL


Setelah mendeklarasikan Cursor, kamu bisa membukanya dengan menggunakan sintaks berikut:

OPEN cursor_name [(argument_1 [, argument_2 ...])];

Kamu harus menentukan nama cursor cursor_name setelah kata kunci OPEN. Jika cursor didefinisikan dengan daftar parameter, kamu harus melewati argumen yang sesuai ke cursor.

Ketika kamu melakukan OPEN cursor, PL / SQL mengeksekusi pernyataan SELECT dan mengidentifikasi set hasil aktif. Perhatikan bahwa OPEN action sebenarnya tidak mengambil catatan dari database. Itu terjadi di FETCH step. Jika cursor dinyatakan dengan klausa FOR UPDATE, PL / SQL mengunci semua record pada set hasil.

Kita bisa membuka cur_chief cursor sebagai berikut:

OPEN cur_chief;

Fetching Records dari kursor PL / SQL


Setelah cursor terbuka, kamu dapat mengambil data dari cursor ke dalam record yang memiliki struktur yang sama seperti cursor. Alih-alih mengambil data menjadi catatan, kamu juga dapat mengambil data dari cursor ke daftar variabel.

Tindakan mengambil mengambil data dan mengisi catatan atau daftar variabel. Kamu bisa memanipulasi data ini di memori. Kamu bisa mengambil data sampai tidak ada catatan yang ditemukan di set hasil aktif.

Sintaksis FETCH  sebagai berikut:

 FETCH cursor_name INTO record or variables

Kamu dapat menguji atribut kursor % FOUND atau % NOTFOUND untuk memeriksa apakah pengambilan terhadap cursor berhasil dilakukan. Cursor memiliki lebih banyak atribut yang akan kita bahas di bagian selanjutnya.

Kita bisa menggunakan pernyataan PL / SQL LOOP bersamaan dengan loop FETCHto melalui semua record dalam hasil aktif yang ditetapkan sebagai berikut:

LOOP
    -- fetch information from cursor into record
    FETCH cur_chief INTO r_chief;

    EXIT WHEN cur_chief%NOTFOUND;

    -- print department - chief
    DBMS_OUTPUT.PUT_LINE(r_chief.department_name || ' - ' ||
                         r_chief.first_name || ',' ||
                         r_chief.last_name);
  END LOOP;

Closing PL/SQL Cursor


Kamu harus selalu menutup kursor saat tidak lagi digunakan. Jika tidak, kamu akan memiliki kebocoran memori dalam program , yang tidak diharapkan.

Untuk menutup cursor, kamumenggunakan CLOSE statement sebagai berikut:

CLOSE cursor_name;
Dan inilah contoh penutupan cursor cur_chief:

CLOSE cur_chief;

Contoh Cursor PL / SQL yang lengkap


Berikut ini adalah contoh lengkap dari cursor untuk mencetak daftar kepala dan nama departemen sebagai berikut:

SET SERVEROUTPUT ON SIZE 1000000;
DECLARE
  -- declare a cursor
  CURSOR cur_chief  IS
      SELECT first_name,
                      last_name,
                      department_name
      FROM employees e
      INNER JOIN departments d ON d.manager_id = e.employee_id;

  r_chief cur_chief%ROWTYPE;
BEGIN
  OPEN cur_chief;
  LOOP
    -- fetch information from cursor into record
    FETCH cur_chief INTO r_chief;

    EXIT WHEN cur_chief%NOTFOUND;

    -- print department - chief
    DBMS_OUTPUT.PUT_LINE(r_chief.department_name || ' - ' ||
                         r_chief.first_name || ',' ||
                         r_chief.last_name);
  END LOOP;
  -- close cursor cur_chief
  CLOSE cur_chief;
END;
/


Atribut Cursor PL / SQL


Ini adalah atribut utama dari cursor PL / SQL dan deskripsi mereka.

Atribut:                cursor_name % FOUND             
Deskripsi:            kembali TRUE  jika record berhasil diambil oleh cursor cursor_name

Atribut :               cursor_name% NOTFOUND     
Deskripsi:            kembali TRUE jika record tidak diambil berhasil oleh cursor cursor_name 

Atribut:                cursor_name% ROWCOUNT    
Deskripsi:            mengembalikan jumlah record yang diambil dari kursor cursor_name  saat kita menguji % ROWCOUNT attribute

Atribut:                cursor_name% ISOPEN             
Deskripsi:            mengembalikan TRUE jika  cursor cursor_name  terbuka

Dalam tutorial ini, kamu telah belajar bagaimana menggunakan cursor PL / SQL untuk melewati satu set baris dengan semua langkah penting yang perlu dilakukan termasuk DECLARE, OPEN, FETCH dan CLOSE.





Sumber : http://www.plsqltutorial.com

Apa itu Record PL / SQL?


Record / Catatan PL / SQL adalah struktur data gabungan yang merupakan kumpulan data terkait yang tersimpan dalam kolom. Setiap field dalam data PL / SQL memiliki nama dan tipe data tersendiri.

Mendeklarasikan Record PL / SQL


PL / SQL menyediakan tiga cara untuk mendeklarasikan record: table-based record, cursor-based record and programmer-defined records.

Mendeklarasikan Table-based Record


Untuk mendeklarasikan record berbasis tabel kamu bisa menggunakan nama tabel dengan atribut% ROWTYPE. Bidang data PL / SQL memiliki nama dan tipe data yang sama dengan kolom tabel.

Berikut ini menggambarkan deklarasi rekaman berbasis tabel:

DECLARE
   table_based_record table_name%ROWTYPE;
Setelah memiliki record berbasis tabel, kamu bisa menggunakannya dengan berbagai cara, misalnya dalam SQL SELECT statement sebagai berikut:

SET SERVEROUTPUT ON SIZE 1000000;
DECLARE
  r_emp employees%ROWTYPE;
  n_emp_id  employees.employee_id%TYPE := 200;
BEGIN
  SELECT *
  INTO r_emp
  FROM employees
  WHERE employee_id = n_emp_id;
  -- print out the employee's first name
  DBMS_OUTPUT.PUT_LINE(r_emp.first_name);
END;
/

Dalam contoh di atas:

  •     Pertama, kami mendefinisikan sebuah catatan berdasarkan tabel karyawan di database sampel SDM.
  •     Kedua, kami menggunakan pernyataan SELECT untuk mengambil informasi karyawan dari id karyawan 200 dan mengisi data ke dalam catatan r_emp.
  •     Ketiga, kami mencetak nama depan karyawan terpilih dari catatan karyawan r_emp.

Mendeklarasikan Programmer-defined Record


Untuk mendeklarasikan record yang ditentukan programmer, pertama kamu harus mendefinisikan tipe record dengan menggunakan pernyataan TYPE dengan field record secara eksplisit. Kemudian, kamu dapat mendeklarasikan rekaman berdasarkan jenis rekaman yang telah kamu tetapkan.

Berikut ini mengilustrasikan sintaks dari definisi yang didefinisikan pemrogram dengan pernyataan TYPE:

TYPE type_name IS RECORD
   (field1 data_type1 [NOT NULL] := [DEFAULT VALUE],
    field2 data_type2 [NOT NULL] := [DEFAULT VALUE],
    ...
    fieldn data_type3 [NOT NULL] := [DEFAULT VALUE]
    );
Jenis data bidang dapat berupa salah satu dari berikut ini:

  •     Jenis skalar (VARCHAR2, NUMBER ...).
  •     Deklarasi jangkar   %TYPE.
  •     % ROW  type, dalam hal ini kita memiliki nested record.
  •     SUBTYPE
  •     Jenis koleksi PL / SQL.
  •     Variabel kursor REF CURSOR.

Setelah Anda menentukan jenis rekaman, kamu dapat mendeklarasikan catatan berdasarkan jenis rekaman sebagai berikut:

record_name type_name;

Contoh berikut menunjukkan bagaimana cara mendeklarasikan programmer-defined record:

SET SERVEROUTPUT ON SIZE 1000000;
DECLARE
  TYPE t_name IS RECORD(
     first_name employees.first_name%TYPE,
     last_name  employees.last_name%TYPE
  );
  r_name   t_name; -- name record
  n_emp_id employees.employee_id%TYPE := 200;
BEGIN
  SELECT first_name,
         last_name
  INTO r_name
  FROM employees
  WHERE employee_id = n_emp_id;
  -- print out the employee's name
  DBMS_OUTPUT.PUT_LINE(r_name.first_name || ',' || r_name.last_name );
END;
/


Mendeklarasikan Record berbasis kursor / record based on a cursor

Kamu dapat menentukan catatan berdasarkan kursor. Pertama, kamu harus menentukan kursor. Dan kemudian kamu dapat menggunakan% ROWTYPE dengan variabel kursor untuk menyatakan sebuah catatan. Bidang catatan sesuai dengan kolom dalam pernyataan SELECT kursor.

Berikut ini adalah contoh untuk mendeklarasikan record berdasarkan kursor.

SET SERVEROUTPUT ON SIZE 1000000;
DECLARE
  CURSOR cur_emp IS
    SELECT *
    FROM employees
    WHERE employee_id = 200;

  emp_rec cur_emp%ROWTYPE;
BEGIN
  NULL;
END;
/

Bekerja dengan PL / SQL Record


Setelah memiliki catatan PL / SQL, kamu dapat bekerja dengan catatan secara keseluruhan atau kamu dapat bekerja dengan bidang catatan individual.

Bekerja dengan catatan PL / SQL pada tingkat rekor


Pada tingkat rekor, kamu dapat melakukan hal berikut:

  •     Anda dapat menetapkan catatan PL / SQL ke catatan PL / SQL lainnya. Sepasang catatan PL / SQL harus memiliki jumlah bidang yang sama dan tipe data dari masing-masing bidang harus dapat dikonversi.
  •     Anda dapat menetapkan nilai NULL PL / SQL dengan menetapkan catatan yang tidak diinisiasi.
  •     Sebuah catatan PL / SQL dapat digunakan sebagai argumen parameter dalam suatu fungsi
  •     Anda bisa mengembalikan catatan PL / SQL dari sebuah fungsi
  •     Untuk memeriksa apakah catatan NULL, Anda harus memeriksa masing-masing bidang catatan.
  •     Untuk membandingkan dua catatan, Anda harus membandingkan masing-masing bidang masing-masing catatan.

Berikut adalah contoh bekerja dengan catatan PL / SQL pada tingkat rekor:

SET serveroutput ON SIZE 1000000;
DECLARE
  TYPE t_name IS RECORD(
    first_name employees.first_name%TYPE,
    last_name employees.last_name%TYPE
  );
  r_name      t_name;
  r_name2     t_name;
  r_name_null t_name;
  n_emp_id employees.employee_id%TYPE := 200;
BEGIN
  -- assign employee's infomation to record
  SELECT first_name,
         last_name
  INTO r_name
  FROM employees
  WHERE employee_id = n_emp_id;

  -- assign record to another record
  r_name2 := r_name;
  -- print out the employee's name
  DBMS_OUTPUT.PUT_LINE(r_name2.first_name || ',' || r_name2.last_name);

  -- assign record to NULL
  r_name2 := r_name_null;

  -- check NULL for each individual field
  IF r_name2.first_name IS NULL AND
     r_name2.last_name IS NULL THEN
    DBMS_OUTPUT.PUT_LINE('Record r_name2 is NULL');
  END IF;

END;
/


Bekerja dengan PL/SQL record at field level


Seperti yang kamu lihat pada contoh di atas, kita dapat merujuk ke bidang catatan dengan menggunakan notasi titik (.) Sebagai berikut:

record_name.field

Jika kamu mengacu pada variabel rekaman dalam paket atau skema yang berbeda, kamu perlu secara eksplisit menentukan informasi tersebut seperti yang ditunjukkan di bawah ini:

[schema_name.] [package_name.] record_name.field

Kamu dapat menggunakan operator penugasan (: =) untuk mengubah nilai bidang catatan yang kamu rujuk.

Untuk catatan bersarang kamu perlu menggunakan notasi titik ekstra (.)

Contoh berikut menunjukkan bagaimana menggunakan data PL / SQL pada field level:

DECLARE
  TYPE t_address IS RECORD(
    house_number VARCHAR2(6),
    street       VARCHAR2(50),
    phone        VARCHAR2(15),
    region       VARCHAR2(10),
    postal_code  VARCHAR2(10),
    country      VARCHAR2(25)
  );

  TYPE t_contact IS RECORD(
    home     t_address,
    business t_address
  );
  r_contact t_contact;
BEGIN
  r_contact.business.house_number := '500';
  r_contact.business.street       := 'Oracle Parkway';
  r_contact.business.region       := 'CA';
  r_contact.business.postal_code  := '94065';
  r_contact.business.country      := 'USA';
  r_contact.business.phone        := '+1.800.223.1711';
END;
Dalam tutorial ini, kamu telah belajar bagaimana menggunakan data PL / SQL untuk memanipulasi data dengan lebih efisien, dan membuat kode kamu lebih bersih dan mudah perawatannya.




Sumber : http://www.plsqltutorial.com

Monday, December 4, 2017

Memperkenalkan PL/SQL Exception


Dalam PL / SQL, segala jenis kesalahan diperlakukan sebagai pengecualian. Pengecualian didefinisikan sebagai kondisi khusus yang mengubah alur eksekusi program. PL / SQL memberi Kamu cara yang fleksibel dan ampuh untuk menangani pengecualian semacam itu.

PL / SQL menangkap dan menangani pengecualian dengan menggunakan exception handler architecture. Kapan pun pengecualian terjadi, hal itu dinaikkan. Penghentian eksekusi blok PL / SQL saat ini, kontrol dilewatkan ke bagian terpisah yang disebut bagian pengecualian.

Di bagian pengecualian, kamu dapat memeriksa pengecualian apa yang telah terjadi dan menanganinya dengan tepat. Arsitektur pengendali pengecualian ini memungkinkan pemisahan logika bisnis dan kode penanganan pengecualian sehingga membuat program lebih mudah dibaca dan dipelihara.


PL/SQL Exception


Ada dua jenis pengecualian:


  •     Pengecualian sistem: pengecualian sistem dinaikkan oleh PL / SQL run-time saat mendeteksi kesalahan. Misalnya, NO_DATA_FOUND exception dinaikkan jika kamu memilih catatan yang tidak ada dari database.

  •     Pengecualian yang ditentukan oleh programmer: pengecualian yang ditentukan oleh programmer ditentukan oleh kamu dalam aplikasi tertentu. Kamu dapat memetakan nama pengecualian dengan kesalahan Oracle tertentu menggunakan EXCEPTION_INIT pragma. Anda juga dapat menetapkan nomor dan deskripsi ke pengecualian menggunakan RAISE_APPLICATION_ERROR.

Mendefinisikan PL/SQL Exception


Pengecualian harus didefinisikan sebelum dapat diajukan. Oracle menyediakan banyak pengecualian standar pada STANDARD package. Untuk menentukan pengecualian, kamu bisa menggunakan EXCEPTION keyword seperti di bawah ini:

EXCEPTION_NAME EXCEPTION;

Untuk meningkatkan pengecualian yang telah kamu definisikan, kamu bisa menggunakan pernyataan RAISE sebagai berikut:

RAISE EXCEPTION_NAME;

Di bagian exception handler, kamu bisa menggunakan exception seperti biasa. Contoh berikut menggambarkan pengecualian yang ditentukan oleh pemrogram. Kami mendapatkan gaji seorang karyawan dan memeriksanya dengan gaji di tempat kerja.

Jika gaji di bawah kisaran, kita naikkan pengecualian BELOW_SALARY_RANGE. Jika gaji di atas kisaran, kami meningkatkan pengecualian ABOVE_SALARY_RANGE hanya membuatnya sederhana untuk demonstrasi.

SET SERVEROUTPUT ON SIZE 100000;
DECLARE
  -- define exceptions
  BELOW_SALARY_RANGE EXCEPTION;
  ABOVE_SALARY_RANGE EXCEPTION;
  -- salary variables
  n_salary employees.salary%TYPE;
  n_min_salary employees.salary%TYPE;
  n_max_salary employees.salary%TYPE;
  -- input employee id
  n_emp_id employees.employee_id%TYPE := &emp_id;
BEGIN
  SELECT salary,
         min_salary,
         max_salary
  INTO n_salary,
       n_min_salary,
       n_max_salary
  FROM employees
  INNER JOIN jobs ON jobs.job_id = employees.job_id
  WHERE employee_id = n_emp_id;

  IF n_salary < n_min_salary THEN
     RAISE BELOW_SALARY_RANGE;
  ELSIF n_salary > n_max_salary THEN
      RAISE ABOVE_SALARY_RANGE;
  END IF;

  dbms_output.put_line('Employee ' || n_emp_id ||
                               ' has salary $' || n_salary );

  EXCEPTION
    WHEN BELOW_SALARY_RANGE THEN
      dbms_output.put_line('Employee ' || n_emp_id ||
              ' has salary below the salary range');
    WHEN ABOVE_SALARY_RANGE THEN
      dbms_output.put_line('Employee ' || n_emp_id ||
              ' has salary above the salary range');
    WHEN NO_DATA_FOUND THEN
      DBMS_OUTPUT.PUT_LINE('Employee ' || n_emp_id || ' not found');
END;
/

Dalam tutorial ini, kamu telah belajar bagaimana mendefinisikan pengecualian PL / SQL kamu sendiri, meningkatkan dan menanganinya di bagian pengendali pengecualian dari blok PL / SQL.




Sumber : http://www.plsqltutorial.com/

Popular Posts