PL/SQL - Penyelesaian: Panduan Pemula
Hai sana, para maestro PL/SQL masa depan! Hari ini, kita akan melihat dunia yang menarik penyelesaian di PL/SQL. Jangan khawatir jika Anda baru dalam programming - saya akan mengarahkan Anda melalui topik ini langkah demi langkah, seperti yang saya lakukan untuk ribuan murid selama tahun-tahun mengajar saya. Jadi, ambil secangkir kopi (atau teh, jika itu hal Anda), dan mari kita embarkasi dalam perjalanan yang menarik ini bersama!
Apa Itu Penyelesaian?
Sebelum kita masuk ke detailnya, mari kita memahami apa itu penyelesaian. Bayangkan Anda sedang memanggang kue (ikuti saya disini, saya berjanji ini berkaitan dengan programming). Anda mengikuti resep langkah demi langkah, tetapi tiba-tiba, Anda menyadari Anda kehabisan telur! Situasi yang tak terduga ini mirip dengan penyelesaian dalam programming.
Dalam PL/SQL, penyelesaian adalah kejadian yang tak terduga yang mengganggu aliran normal program Anda. Mereka bisa menjadi kesalahan seperti mencoba membagi dengan nol atau mencoba memasukkan nilai duplikat ke dalam kolom unik. Daripada membiarkan masalah ini memaksa program Anda crash, kita bisa "menangani" mereka dengan mulus - seperti halnya Anda mungkin menggunakan pengganti untuk telur dalam analogi memanggang kita.
Sintaks untuk Penanganan Penyelesaian
Sekarang, mari kita lihat bagaimana kita menangani penyelesaian ini dalam PL/SQL. Struktur dasar terlihat seperti ini:
BEGIN
-- Kode normal Anda disini
EXCEPTION
WHEN exception_name1 THEN
-- Tangani penyelesaian 1
WHEN exception_name2 THEN
-- Tangani penyelesaian 2
WHEN OTHERS THEN
-- Tangani semua penyelesaian lainnya
END;
Mari kitauraikan ini:
- Kita menulis kode normal kita di blok
BEGIN
. - Jika terjadi penyelesaian, program melompat ke blok
EXCEPTION
. - Kita dapat menangani penyelesaian tertentu menggunakan klausa
WHEN
. - Klausa
WHEN OTHERS
menangkap semua penyelesaian yang kita belum tangani secara spesifik.
Ini adalah contoh sederhana:
DECLARE
v_result NUMBER;
BEGIN
v_result := 10 / 0; -- Ini akan menyebabkan kesalahan pembagian dengan nol
DBMS_OUTPUT.PUT_LINE('Hasil: ' || v_result);
EXCEPTION
WHEN ZERO_DIVIDE THEN
DBMS_OUTPUT.PUT_LINE('Kesalahan: Tidak dapat membagi dengan nol!');
END;
Dalam contoh ini, kita mencoba membagi 10 dengan 0, yang matematiknya mustahil. Daripada crash, program kita menangkap penyelesaian ZERO_DIVIDE
dan mencetak pesan kesalahan yang ramah.
Menimbulkan Penyelesaian
kadang-kadang, kita ingin membuat penyelesaian sendiri ketika kondisi tertentu terpenuhi. Kita dapat melakukan ini menggunakan pernyataan RAISE
. Itu seperti menjadi wasit di pertandingan sepak bola - Anda melihat pelanggaran, Anda mengibarkan fluit!
Berikut cara kerjanya:
DECLARE
v_age NUMBER := 15;
BEGIN
IF v_age < 18 THEN
RAISE_APPLICATION_ERROR(-20001, 'Harus berumur 18 atau lebih tua');
END IF;
DBMS_OUTPUT.PUT_LINE('Selamat datang ke klub!');
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('Kesalahan: ' || SQLERRM);
END;
Dalam contoh ini, kita memeriksa jika seseorang cukup tua untuk masuk ke klub. Jika mereka di bawah 18, kita bangkitkan penyelesaian dengan pesan kesalahan khusus. Klausa WHEN OTHERS
menangkap penyelesaian ini dan mencetak pesan kesalahan.
Penyelesaian yang Ditentukan Pengguna
Meskipun PL/SQL menyediakan banyak penyelesaian yang ditentukan terlebih dahulu untuk kesalahan scenario umum, kadang-kadang kita perlu membuat penyelesaian sendiri. Itu seperti menciptakan aturan baru dalam permainan kita. Berikut cara kita dapat melakukan ini:
DECLARE
e_invalid_name EXCEPTION;
v_name VARCHAR2(50) := 'J0hn';
BEGIN
IF NOT REGEXP_LIKE(v_name, '^[A-Za-z]+$') THEN
RAISE e_invalid_name;
END IF;
DBMS_OUTPUT.PUT_LINE('Nama valid: ' || v_name);
EXCEPTION
WHEN e_invalid_name THEN
DBMS_OUTPUT.PUT_LINE('Kesalahan: Nama hanya boleh mengandung huruf');
END;
Dalam contoh ini, kita menciptakan penyelesaian khusus e_invalid_name
. Kita bangkitkan penyelesaian ini jika nama mengandung sesuatu selain huruf. Ini memungkinkan kita menangani scenario khusus ini dalam cara yang cocok bagi program kita.
Penyelesaian yang Ditentukan Terlebih Dahulu
PL/SQL menyertakan set penyelesaian yang ditentukan terlebih dahulu untuk kesalahan scenario umum. Itu seperti memiliki koper pertolongan siap pakai untuk cedera umum. Berikut adalah beberapa yang paling sering digunakan:
Nama Penyelesaian | Deskripsi |
---|---|
NO_DATA_FOUND | Terbangkitkan saat pernyataan SELECT INTO tidak mengembalikan baris |
TOO_MANY_ROWS | Terbangkitkan saat pernyataan SELECT INTO mengembalikan lebih dari satu baris |
ZERO_DIVIDE | Terbangkitkan saat mencoba membagi dengan nol |
DUP_VAL_ON_INDEX | Terbangkitkan saat mencoba memasukkan nilai duplikat ke dalam indeks unik |
VALUE_ERROR | Terbangkitkan saat ada kesalahan aritmetik, konversi, pemotongan, atau batas ukuran |
mari lihat contoh menggunakan penyelesaian yang ditentukan terlebih dahulu:
DECLARE
v_emp_name VARCHAR2(50);
BEGIN
SELECT first_name INTO v_emp_name
FROM employees
WHERE employee_id = 1000; -- Diperkirakan ID ini tidak ada
DBMS_OUTPUT.PUT_LINE('Nama karyawan: ' || v_emp_name);
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('Kesalahan: Tidak ada karyawan dengan ID itu');
WHEN TOO_MANY_ROWS THEN
DBMS_OUTPUT.PUT_LINE('Kesalahan: Ditemukan lebih dari satu karyawan');
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('Kesalahan yang tak terduga terjadi: ' || SQLERRM);
END;
Dalam contoh ini, kita mencoba mengambil nama karyawan. Jika tidak ada karyawan ditemukan, kita tangkap penyelesaian NO_DATA_FOUND
. Jika secara tidak sengaja ditemukan lebih dari satu karyawan, kita tangkap penyelesaian TOO_MANY_ROWS
. Semua kesalahan tak terduga lainnya ditangkap oleh klausa WHEN OTHERS
.
Dan begitu saja, teman-teman! Kita telah melihat dasar penanganan penyelesaian dalam PL/SQL. Ingat, menangani penyelesaian adalah seperti memakai sabuk pengaman - mungkin tampak tak diperlukan saat semuanya berjalan lancar, tetapi itu dapat menyelamatkan Anda saat hal-hal berubah buruk.
Latih konsep ini, mainkan dengan berbagai scenario, dan segera Anda akan menjadi ahli dalam menangani penyelesaian. Selamat coding, dan semoga program Anda selalu menangani yang tak terduga dengan mulus!
Credits: Image by storyset