Struktur Kontrol PL/SQL

Pembahasan kali ini menunjukkan kepada kita bagaimana menyusun aliran kontrol melalui program PL/SQL. Kita akan mempelajari bagaimana perintah-perintah dihubungkan dengan struktur-struktur kontrol sederhana namun powerful, yang memiliki single entry dan exit point. Secara bersama-sama, struktur-struktur ini dapat menangani berbagai situasi. Penggunaan yang tepat akan menghasilkan program terstruktur yang baik.

Pembahasan kali ini mendiskusikan topik-topik berikut ini:

  • Gambaran Struktur Kontrol PL/SQL
  • Kontrol Kondisional: Perintah-perintah IF dan CASE
  • Kontrol Perulangan: Perintah-perintah LOOP dan EXIT
  • Kontrol Sekuensial: Perintah-perintah GOTO dan NULL

4.1. Gambaran Struktur Kontrol PL/SQL

Berdasarkan structure theorem, setiap program komputer dapat ditulis menggunakan struktur kontrol dasar yang ditunjukkan dalam Gambar 4-1. Mereka dapat dikombinasikan dalam suatu cara yang diperlukan untuk menjawab permasalahan-permasalahan yang ada.

Gambar 4-1 Struktur-struktur Kontrol

Struktur seleksi menguji kondisi, lalu mengeksekusi satu rangkaian perintah-perintah daripada lainnya, bergantung kepada kondisi mana yang true atau false. Suatu condition (kondisi) merupakan suatu variable atau ekpresi yang menghasilkan nilai Boolean (TRUE atau FALSE). Struktur perulangan mengeksekusi rangkaian perintah-perintah secara berulang-ulang selama suatu kondisi bernilai true. Struktur sekuensial (berurutan) secara sederhana mengeksekusi rangkaian perintah-perintah dalam urutan.

4.2. Struktur Kondisional: Perintah-perintah IF dan CASE

Seringkali, diperlukan untuk mengambil tindakan-tindakan alternatif bergantung kepada keadaan-keadaan yang ada. Perintah IF mengijinkan kita untuk mengeksekusi rangkaian perintah-perintah berdasarkan suatu kondisi. Dengan begitu, apakah suatu rangkaian perintah-perintah dieksekusi atau tidak, bergantung kepada nilai dari kondisi. Terdapat tiga bentuk perintah-perintah IF: IF-THEN, IF-THEN-ELSE, dan IF-THEN-ELSIF. Perintah CASE merupakan cara yang ringkas untuk mengevaluasi kondisi tunggal dan memiliki diantara banyak alternatif tindakan.

4.2.1. Perintah IF-THEN

Bentuk sederhana dari perintah IF menghubungkan kondisi dengan rangkaian perintah-perintah yang diapit oleh kata-kata kunci THEN dan END IF (bukan ENDIF), seperti berikut:

IF condition THEN
  sequence_of_statements
END IF;

Rangkaian perintah-perintah dieksekusi hanya jika kondisi adalah true. Jika kondisi bernilai false atau null, perintah IF tidak melakukan apa-apa. Dalam salah satu kasus, kontrol berlalu kepada perintah selanjutnya. Contohnya:

IF sales > quota THEN
  compute_bonus(empid);
  UPDATE payroll SET pay = pay + bonus WHERE empno = emp_id;
END IF;

Kita dapat meletakkan perintah-perintah IF yang pendek dalam satu baris tunggal, seperti

IF x > y THEN high := x; END IF;

4.2.2. Perintah IF-THEN-ELSE

Bentuk kedua dari perintah IF menambahkan kata kunci ELSE diikuti oleh rangkaian perintah-perintah alternatif, seperti berikut:

IF condition THEN
  sequence_of_statements1
ELSE
  sequence_of_statements2
END IF;

Rangkaian perintah-perintah dalam klausa ELSE dieksekusi hanya jika kondisi bernilai false atau null. Jadi, klausa ELSE memastikan bahwa rangkaian perintah-perintah tersebut dieksekusi. Dalam contoh berikut ini, perintah UPDATE pertama dieksekusi ketika kondisi bernilai true, namun perintah UPDATE kedua dieksekusi ketika kondisi bernilai false atau null:

IF trans_type = 'CR' THEN
  UPDATE accounts SET balance = balance + credit WHERE ...
ELSE
  UPDATE accounts SET balance = balance - debit WHERE ...
END IF;

Klausa-klausa THEN dan ELSE dapat mengandung perintah-perintah IF. Sehingga, perintah-perintah IF dapat bersarang, seperti ditunjukkan oleh contoh berikut ini:

IF trans_type = 'CR' THEN
  UPDATE accounts SET balance = balance + credit WHERE ...
ELSE
  IF new_balance >= minimum_balance THEN
    UPDATE accounts SET balance = balance - debit WHERE ...
  ELSE
    RAISE insufficient_funds;
  END IF;
END IF;

4.2.3. Perintah IF-THEN-ELSIF

Suatu ketika kita ingin memilih suatu tindakan dari beberapa alternatif yang terpisah satu sama lain. Bentuk ketiga dari perintah IF menggunakan kata kunci ELSIF (bukan ELSEIF) untuk memperkenalkan kondisi-kondisi tambahan, sebagai berikut:

IF condition1 THEN
  sequence_of_statements1
ELSIF condition2 THEN
  sequence_of_statements2
ELSE
  sequence_of_statements3
END IF;

Jika kondisi pertama bernilai false atau null, klausa ELSIF akan menguji kondisi lainnya. Perintah IF dapat memiliki sejumlah klausa ELSIF; klausa final ELSE bersifat opsional (bisa digunakan atau tidak). Kondisi-kondisi dievaluasi satu demi satu dari atas ke bawah. Jika suatu kondisi bernilai true, rangkaian perintah-perintah yang ada di dalamnya dieksekusi dan kontrol akan menuju ke perintah selanjutnya. Jika seluruh kondisi bernilai false atau null, maka rangkaian perintah-perintah di dalam klausa ELSE yang akan dieksekusi. Mari kita perhatikan contoh berikut ini:

BEGIN
  ...
  IF sales > 50000 THEN
    bonus := 1500;
  ELSIF sales > 35000 THEN
    bonus := 500;
  ELSE
    bonus := 100;
  END IF;
  INSERT INTO payroll VALUES (emp_id, bonus, ...);
END;

Jika nilai sales lebih besar dari 50000, kondisi pertama dan kedua bernilai true. Namun, bonus diberikan  kepada nilai yang sesuai dari 1500 karena kondisi kedua tidak pernah diuji. Ketika kondisi pertama bernilai true, perintah-perintah di dalamnya dieksekusi dan kontrol menuju ke perintah INSERT.

4.2.4. Perintah CASE

Seperti halnya perintah IF, perintah CASE menyeleksi satu rangkaian perintah-perintah untuk dieksekusi. Namun, untuk menyeleksi rangkain perintah-perintah tersebut, perintah CASE menggunakan penyeleksi, bukannya menggunakan banyak ekspresi-ekspresi Boolean. (Pada pembahasan Dasar-dasar PL/SQL telah dijelaskan bahwa penyeleksi adalah ekspresi-ekspresi yang nilainya digunakan untuk menyeleksi satu dari beberapa alternatif yang ada). Untuk membandingkan perintah-perintah IF dan CASE, mari kita perhatikan kode program berikut ini yang menghasilkan deskripsi angka siswa sekolah:

IF grade = 'A' THEN
  dbms_output.put_line('Excellent');
ELSIF grade = 'B' THEN
  dbms_output.put_line('Very Good');
ELSIF grade = 'C' THEN
  dbms_output.put_line('Good');
ELSIF grade = 'D' THEN
  dbms_output. put_line('Fair');
ELSIF grade = 'F' THEN
  dbms_output.put_line('Poor');
ELSE
  dbms_output.put_line('No such grade');
END IF;

Perhatikan bahwa terdapat lima ekspresi Boolean. Dalam setiap langkah, kita menguji apakah variable yang sama, yaitu grade, sama dengan satu dari lima nilai: ‘A’, ‘B’, ‘C’, ‘D’, atau ‘E’. Mari kita tulis kembali kode diatas dengan menggunakan perintah IF, seperti berikut:

CASE grade
  WHEN 'A' THEN dbms_output.put_line('Excellent');
  WHEN 'B' THEN dbms_output.put_line('Very Good');
  WHEN 'C' THEN dbms_output.put_line('Good');
  WHEN 'D' THEN dbms_output.put_line('Fair');
  WHEN 'F' THEN dbms_output.put_line('Poor');
  ELSE dbms_output.put_line('No such grade');
END CASE;

Perintah CASE lebih mudah dibaca dan lebih efisien. Jadi, jika memungkinkan, sebaiknya kita tulis ulang perintah-perintah IF-THEN-ELSIF dengan perintah-perintah CASE.

Perintah CASE diawali dengan kata kunci CASE. Kata kunci ini diikuti oleh penyeleksi, dimana pada contoh terakhir adalah variable grade. Ekspresi penyeleksi dapat menjadi kompleks. Sebagai contoh, ia dapat berisi pemanggilan function. Namun biasanya ia terdiri dari variable tunggal. Ekspresi penyeleksi dievaluasi hanya sekali. Nilai yan gdihasilkannya dapat merupakan tipe data PL/SQL selain BLOB, BFILE dan object type, PL/SQL record, index-by-table, varray, atau nested table.

Penyeleksi diikuti oleh satu atau lebih klausa WHEN, yang dicek secara berurutan. Nilai dari penyeleksi menentukan klausa mana yang akan dieksekusi. Jika nilai penyeleksi sama dengan nilai dari ekspresi klausa WHEN, maka klausa WHEN itulah yang akan dieksekusi. Pada contoh terakhir, jika grade sama dengan ‘C’, program menghasilkan ‘Good’. Jika suatu klausa WHEN dieksekusi, kontrol menuju ke perintah selanjutnya.

Klausa ELSE bekerja mirip dengan klausa ELSE di dalam perintah IF. Dalam contoh terakhir, jika grade tidak sama dengan nilai-nilai yang disediakan oleh klausa WHEN, maka klausa ELSE akan dipilih, dan outputnya adalah ‘No such grade’. Klausa ELSE bersifat opsional. Namun, jika kita mengabaikan klausa ELSE, PL/SQL menambahkan klausa ELSE implisit:

ELSE RAISE CASE_NOT_FOUND;

Jika perintah CASE memilih klausa ELSE implisit, maka PL/SQL menampilkan exception CASE_NOT_FOUND. Jadi, terdapat tindakan default, jika kita mengabaikan klausa ELSE.

Kata kunci END CASE menghentikan perintah CASE. Dua kata kunci ini harus dipisahkan oleh spasi. Perintah CASE memiliki bentuk sebagai berikut:

[<<label_name>>]
CASE selector
  WHEN expression1 THEN sequence_of_statements1;
  WHEN expression2 THEN sequence_of_statements2;
  ...
  WHEN expressionN THEN sequence_of_statementsN;
  [ELSE sequence_of_statementsN+1;]
END CASE [label_name];

Seperti halnya blok PL/SQL, perintah CASE dapat diberi label. Label, identifier tak terdeklarasi yang diapit oleh tanda ‘[<<’ dan ‘>>]’, harus berada pada awal perintah CASE. Dan secara opsional kita dapat juga menampilkan label pada akhir perintah CASE.

Berbagai exception yang muncul selama eksekusi perintah CASE ditangani dengan cara yang umum. Jadi, eksekusi normal dihentikan dan berpindah ke bagian exception-handling dari blok atau subprogram PL/SQL.

Alternatif terhadap perintah CASE adalah ekspresi CASE, dimana setiap klausa WHEN adalah merupakan ekspresi.

4.2.4.1. Searched CASE Statement

PL/SQL juga menyediakan perintah CASE searched, yang memiliki bentuk:

[<<label_name>>]
CASE
  WHEN search_condition1 THEN sequence_of_statements1;
  WHEN search_condition2 THEN sequence_of_statements2;
  ...
  WHEN search_conditionN THEN sequence_of_statementsN;
  [ELSE sequence_of_statementsN+1;]
END CASE [label_name];

Perintah CASE searched tidak memiliki penyeleksi. Juga, klausa WHEN-nya berisi kondisi pencarian yang menghasilkan nilai Boolean, bukan ekspresi-ekspresi yang dapat menghasilkan nilai dari suatu tipe. Contohnya sebagai berikut:

CASE
  WHEN grade = 'A' THEN dbms_output.put_line('Excellent');
  WHEN grade = 'B' THEN dbms_output.put_line('Very Good');
  WHEN grade = 'C' THEN dbms_output.put_line('Good');
  WHEN grade = 'D' THEN dbms_output.put_line('Fair');
  WHEN grade = 'F' THEN dbms_output.put_line('Poor');
  ELSE dbms_output.put_line('No such grade');
END CASE;

Kondisi-kondisi pencarian dievaluasi secara berurutan. Nilai Boolean dari setiap kondisi pencarian menentukan klausa WHEN yang akan dieksekusi. Jika kondisi pencarian menghasilkan TRUE, klausa WHEN-nya dieksekusi. Jika suatu klausa WHEN dieksekusi, kontrol berjalan menuju perintah selanjutnya, sehingga kondisi-kondisi pencarian berikutnya tidak dievaluasi.
Jika tidak ada kondisi-kondisi pencarian yang menghasilkan TRUE, maka klausa ELSE dieksekusi. Klausa ELSE bersifat opsional. Namun, jika kita mengabaikan klausa ELSE, maka PL/SQL menambahkan klausa implisit ELSE berikut ini:

ELSE RAISE CASE_NOT_FOUND;

Exception yang muncul selama eksekusi perintah CASE searched ditangani dalam cara yang lazim. Sehingga, eksekusi normal dihentikan dan kontrol berpindah ke bagian exception-handling dari blok atau subprogram PL/SQL kita.

4.2.5. Pedoman untuk Perintah-perintah Kondisional PL/SQL

Hindari perintah-perintah IF yang janggal seperti contoh berikut ini:

IF new_balance < minimum_balance THEN
  overdrawn := TRUE;
ELSE
  overdrawn := FALSE;
END IF;
...
IF overdrawn = TRUE THEN
  RAISE insufficient_funds;
END IF;

Kode ini mengabaikan fakta-fakta yang berguna. Pertama, nilai ekspresi Boolean dapat langsung diberikan kepada variable Boolean. Jadi, kita dapat mengganti perintah IF pertama dengan pemberian nilai sederhana berikut ini:

overdrawn := new_balance < minimum_balance;

Kedua, variable Boolean itu sendiri bernilai true atau false. Jadi, kita dapat menyederhanakan kondisi dalam perintah IF yang kedua menjadi:

IF overdrawn THEN ...

Jika dimungkinkan, gunakan klausa ELSIF daripada perintah-perintah IF bersarang. Dengan demikian, kode program kit menjadi lebih mudah dibaca dan dimengerti. Bandingkan perintah-perintah IF berikut ini:

IF condition1 THEN      | IF condition1 THEN
  statement1;           | statement1;
ELSE                    | ELSIF condition2 THEN
  IF condition2 THEN    | statement2;
    statement2;         | ELSIF condition3 THEN
  ELSE                  | statement3;
    IF condition3 THEN  | END IF;
      statement3;       |
    END IF;             |
  END IF;               |
END IF;                 |

Perintah-perintah ini secara logikal sama, namun perintah pertama tidak jelas dalam hal aliran logikanya, dimana perintah kedua mengungkapnya.

Jika kita membandingkan ekspresi tunggal terhadap banyak nilai, kita dapat menyederhanakan logika dengan menggunakan perintah CASE tunggal daripada menggunakan IF dengan banyak klausa ELSIF.

Oracle MagazineOracle Magazine contains technology strategy articles, sample code, tips, Oracle and partner news, how to articles for developers and DBAs, and more. Oracle (NASDAQ: ORCL) is the world’s largest enterprise software company.

For more information about Oracle, please visit their Web site at http://www.oracle.com. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners.

Get Free Oracle Magazine

 

 

Pages: 1 2 3


Bookmark and Share

 

Buku ini membahas berbagai macam tip dan trik yang sangat berguna bagi Anda pembaca pengguna database Oracle. Pemula, mahasiswa, programmer, maupun database administrator yang mengharapkan solusi cepat dalam menangani permasalahan-permasalahan dalam penggunaan database Oracle dapat membaca buku ini. Anda tidak harus membaca buku ini secara urut karena buku ini di susun berdasarkan topik permasalahan, dan Anda dapat membaca topik-topik yang sesuai dengan permasalahan yang Anda hadapi.
Dapat di beli di toko buku Gramedia, Gunung Agung, Uranus, Karisma, Uranus dsb.

 

Find Related articles