Struktur Kontrol PL/SQL

4.4. Kontrol Sekuensial: Perintah-perintah GOTO dan NULL

Tidak seperti perintah-perintah IF dan LOOP, perintah-perintah GOTO dan NULL tidak begitu penting untuk pemrograman PL/SQL. Struktur PL/SQL telah berbentuk seperti yang dibutuhkan oleh perintah GOTO. Terkadang, ia dapat cukup menyederhanakan logika untuk menjamin penggunaannya. Perintah NULL dapat meningkatkan keterbacaan dengan membuat arti dan aksi dari perintah-perintah berkondisi menjadi lebih jelas.
Penggunaan perintah-perintah GOTO yang berlebihan dapat menghasilkan kode yang kompleks dan tidak terstruktur (kadangkala disebut spaghetti code) yang sulit dimengerti dan dipelihara. Jadi, gunakan perintah-perintah GOTO dengan hemat. Sebagai contoh, untuk bercabang dari struktur bersarang yang dalam kepada rutin error-handling, munculkan exception dibandingkan menggunakan perintah GOTO.

4.4.1. Perintah GOTO

Perintah GOTO mencabang label tanpa adanya kondisi tertentu. Label ahrus unik di dalam jangkauannya dan harus mendahului perintah executable atau blok PL/SQL. Ketika dieksekusi, perintah GOTO mentransfer kontrol ke perintah label atau blok. Dalam contoh berikut ini, kita menuju ke perintah executable turun lebih jauh di dalam rangkaian perintah-perintah:

BEGIN
  ...
  GOTO insert_row;
  ...
  <<insert_row>>
  INSERT INTO emp VALUES ...
END;

Dalam contoh selanjutnya, kita menuju ke blok PL/SQL jauh diatas rangkaian perintah-perintah:

BEGIN
  ...
  <<update_row>>
  BEGIN
    UPDATE emp SET ...
  ...
  END;
  ...
  GOTO update_row;
  ...
END;

Label end_loop dalam contoh selanjutnya tidak diperbolehkan karena ia tidak mendahului perintah executable:

DECLARE
  done BOOLEAN;
BEGIN
  ...
  FOR i IN 1..50 LOOP
    IF done THEN
      GOTO end_loop;
    END IF;
    ...
    <<end_loop>> -- tidak diperbolehkan
  END LOOP; -- bukan perintah executable
END;

Untuk men-debug contoh terakhir, cukup tambahkan perintah NULL, seperti berikut ini:

FOR i IN 1..50 LOOP
  IF done THEN
    GOTO end_loop;
  END IF;
  ...
  <<end_loop>>
  NULL; -- perintah executable
END LOOP;

Seperti contoh selanjutnya, perintah GOTO dapat mencabang ke blok yang mengapitnya dari blok yang memanggilnya:

DECLARE
  my_ename CHAR(10);
BEGIN
  <<get_name>>
  SELECT ename INTO my_ename FROM emp WHERE ...
  BEGIN
    ...
    GOTO get_name; -- mencabang ke blok yang mengapitnya
  END;
END;

Perintah GOTO mencabang ke blok pertama yang mengapitnya dimana label yang direferensinya berada.

4.4.1.1. Batasan-batasan

Beberapa maksud dari perintah GOTO tidak diperbolehkan. Secara spesifik, perintah GOTO tidak dapat mencabang ke dalam perintah IF, perintah CASE, perintah LOOP, dan sub-blok. Sebagai contoh, perintah GOTO berikut ini tidak diperbolehkan:

BEGIN
  ...
  GOTO update_row; -- tidak dapat mencabang ke perintah IF
  ...
  IF valid THEN
    ...
    <<update_row>>
    UPDATE emp SET ...
  END IF;
END;

Seperti ditunjukkan oleh contoh di bawah ini, perintah GOTO tidak dapat mencabang dari satu klausa perintah IF ke lainnya. Demikian juga, perintah GOTO tidak dapat mencabang dari satu perintah CASE klausa WHEN ke lainnya.

BEGIN
  ...
  IF valid THEN
    ...
    GOTO update_row; -- tidak dapat mencabang ke klausa ELSE
  ELSE
    ...
    <<update_row>>
    UPDATE emp SET ...
  END IF;
END;

Contoh berikutnya menunjukkan bahwa perintah GOTO tidak dapat mencabang dari blok yang mengapitnya ke sub-blok:

BEGIN
  ...
  IF status = 'OBSOLETE' THEN
    GOTO delete_part; -- tidak dapat mencabang ke sub-blok
  END IF;
  ...
  BEGIN
    ...
    <<delete_part>>
    DELETE FROM parts WHERE ...
  END;
END;

Juga, perintah GOTO tidak dapat mencabang keluar dari subprogram, seperti ditunjukkan oleh contoh dibawah ini:

DECLARE
  ...
PROCEDURE compute_bonus (emp_id NUMBER) IS
BEGIN
  ...
  GOTO update_row; -- tidak dapat mencabang keluar dari subprogram
END;
BEGIN
  ...
  <<update_row>>
  UPDATE emp SET ...
END;

Akhirnya, perintah GOTO tidak dapat mencabang dari satu penanganan kesalahan (exception handler) ke blok terkini. Sebagai contoh, perintah GOTO berikut ini tidak diperbolehkan:

DECLARE
  ...
  pe_ratio REAL;
BEGIN
  ...
  SELECT price / NVL(earnings, 0) INTO pe_ratio FROM ...
  <<insert_row>>
  INSERT INTO stats VALUES (pe_ratio, ...);
  EXCEPTION
  WHEN ZERO_DIVIDE THEN
  pe_ratio := 0;
  GOTO insert_row; -- tidak dapat mencabang ke blok terkini
END;

Namun, perintah GOTO dapat mencabang dari exception handler ke blok yang mengapitnya.

4.4.2. Perintah NULL

Perintah NULL tidak melakukan apapun kecuali hanya melewatkan kontrol ke perintah selanjutnya. Dalam konstruksi kondisional, perintah NULL memberitahu pembaca bahwa sebuah kemungkinan telah dipertimbangkan, namun tidak ada tindakan yang perlu dilakukan. Dalam contoh berikut ini, perintah NULL menunjukkan bahwa tidak ada tindakan yang diambil untuk exception-exception tak bernama:

EXCEPTION
WHEN ZERO_DIVIDE THEN
ROLLBACK;
WHEN VALUE_ERROR THEN
INSERT INTO errors VALUES ...
COMMIT;
WHEN OTHERS THEN
NULL;
END;

Dalam perintah-perintah IF atau tempat-tempat lain yang membutuhkan paling tidak satu perintah executable, perintah NULL digunakan untuk memenuhi sintaks. Dalam contoh berikut ini, perintah NULL menekankan bahwa hanya karyawan yang memiliki rate tinggi sajalah yang mendapatkan bonus:

IF rating > 90 THEN
  compute_bonus(emp_id);
ELSE
  NULL;
END IF;

Juga, perintah NULL merupakan jalan yang berguna untuk menciptakan potongan-potongan ketika mendesain aplikasi-aplikasi dari atas ke bawah. Stub (potongan) adalah subprogram kosong yang mengijinkan kita untuk menunda definisi procedure atau function-nya sampai kita menguji dan men-debug program utama. Dalam contoh berikut ini, perintah NULL memenuhi kebutuhan bahwa paling tidak terdapat satu perintah yang harus muncul dalam bagian executable dari subprogram:

PROCEDURE debit_account (acct_id INTEGER, amount REAL) IS
BEGIN
  NULL;
END debit_account;

Silahkan melanjutkan membaca pembahasan Collections dan Records PL/SQL

 

 

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