MySQL - RESIGNAL Statement: A Comprehensive Guide for Beginners

Hai there, para pemula pengembang MySQL! Hari ini, kita akan mendalami aspek menarik dari penanganan kesalahan MySQL: pernyataan RESIGNAL. Jangan khawatir jika Anda baru dalam pemrograman; saya akan memecahnya secara langkah demi langkah, seperti yang saya lakukan untuk ratusan siswa dalam tahunajaran saya. Jadi, ambil secangkir kopi (atau teh, jika itu hal Anda), dan mari kita mulai perjalanan belajar ini bersama!

MySQL - Resignal

What is the RESIGNAL Statement?

Sebelum kita melompat ke hal yang mendalam, mari kita mengerti apa itu RESIGNAL. Bayangkan Anda mainkan permainan jagung panas, tapi bukan jagung, melainkan pesan kesalahan. Itu sebenarnya apa yang dilakukan RESIGNAL di MySQL - itu memungkinkan Anda untuk menangkap kesalahan dan kemudian melemparkannya kembali, mungkin dengan beberapa modifikasi.

The Basics of RESIGNAL

Perintah RESIGNAL digunakan dalam penanganan kesalahan untuk mempropagasi kondisi kesalahan. Itu seperti mengatakan, "Hai, saya menangkap kesalahan ini, tapi saya ingin melemparkan dengan beberapa informasi ekstra."

Ini adalah sintaksis dasar:

RESIGNAL [condition_value]
[SET signal_information_item
[, signal_information_item] ...]

mari kitaongkikan ini:

  • condition_value: Ini opsional. Bisa adalah nilai SQLSTATE, nama kondisi, atau kondisi yang didefinisikan dengan DECLARE ... CONDITION.
  • SET: Klausul ini memungkinkan Anda untuk memodifikasi informasi kesalahan.
  • signal_information_item: Ini adalah item yang Anda dapat mengatur, seperti MESSAGE_TEXT, MYSQL_ERRNO, dll.

Handling Warnings with RESIGNAL

Sekarang, mari kita praktikkan dengan beberapa contoh kode. Kita akan mulai dengan kasus sederhana di mana kita menangkap peringatan dan melemparkan kembali dengan informasi tambahan.

DELIMITER //

CREATE PROCEDURE divide_numbers(IN numerator INT, IN denominator INT)
BEGIN
DECLARE EXIT HANDLER FOR SQLWARNING
BEGIN
GET DIAGNOSTICS CONDITION 1 @sqlstate = RETURNED_SQLSTATE, @errno = MYSQL_ERRNO, @text = MESSAGE_TEXT;
SET @full_error = CONCAT('Error ', @errno, ' (', @sqlstate, '): ', @text);
RESIGNAL SET MESSAGE_TEXT = @full_error;
END;

SELECT numerator / denominator;
END //

DELIMITER ;

mari kitaongkikan ini:

  1. Kita membuat prosedur yang disebut divide_numbers yang menerima dua parameter.
  2. Kita deklarasikan penanganan keluar untuk SQLWARNING. Ini menangkap setiap peringatan yang terjadi.
  3. Di dalam penangan, kita gunakan GET DIAGNOSTICS untuk mengambil informasi tentang peringatan.
  4. Kita gabungkan informasi ini menjadi pesan kesalahan lengkap.
  5. Akhirnya, kita gunakan RESIGNAL untuk melempar pesan kesalahan ini.

Untuk menguji ini, Anda dapat menjalankan:

CALL divide_numbers(10, 0);

Anda akan mendapatkan pesan kesalahan detil daripada hanya peringatan pembagian nol. Keren, kan?

Advanced RESIGNAL Usage

Bergabunglah kita ke tingkat yang lebih tinggi dengan contoh yang lebih kompleks. Kita akan membuat prosedur yang memeriksa umur pengguna dan menggunakan RESIGNAL untuk memberikan pesan kesalahan khusus.

DELIMITER //

CREATE PROCEDURE check_age(IN user_age INT)
BEGIN
DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
GET DIAGNOSTICS CONDITION 1 @sqlstate = RETURNED_SQLSTATE, @errno = MYSQL_ERRNO, @text = MESSAGE_TEXT;

IF @errno = 45000 THEN
CASE
WHEN user_age < 0 THEN
RESIGNAL SET MESSAGE_TEXT = 'Error: Age cannot be negative!';
WHEN user_age > 120 THEN
RESIGNAL SET MESSAGE_TEXT = 'Error: Age seems unrealistically high!';
ELSE
RESIGNAL SET MESSAGE_TEXT = 'Error: Invalid age input!';
END CASE;
ELSE
RESIGNAL;
END IF;
END;

IF user_age < 0 OR user_age > 120 THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'Invalid age input';
END IF;

SELECT CONCAT('User age: ', user_age, ' is valid.') AS result;
END //

DELIMITER ;

Contoh ini menunjukkan:

  1. Penanganan kesalahan khusus berdasarkan kondisi tertentu.
  2. Penggunaan SIGNAL untuk mengirim kesalahan khusus.
  3. RESIGNAL dengan logika bersyarat untuk memberikan pesan kesalahan yang lebih spesifik.

Anda dapat menguji prosedur ini dengan berbagai masukan:

CALL check_age(25);  -- Umur valid
CALL check_age(-5);  -- Kesalahan umur negatif
CALL check_age(150); -- Kesalahan umur yang tidak realistis tinggi

Resignal Statement Using Client Program

Sekarang, mari kita lihat bagaimana kita dapat menggunakan RESIGNAL dalam program klien. Untuk contoh ini, kita akan menggunakan Python dengan pustaka MySQL Connector.

import mysql.connector
from mysql.connector import Error

def check_user_age(age):
try:
connection = mysql.connector.connect(
host='localhost',
database='your_database',
user='your_username',
password='your_password'
)

cursor = connection.cursor()
cursor.callproc('check_age', [age])

for result in cursor.stored_results():
print(result.fetchall())

except Error as e:
print(f"Error: {e}")

finally:
if connection.is_connected():
cursor.close()
connection.close()

# Test the function
check_user_age(25)  # Valid age
check_user_age(-5)  # Negative age error
check_user_age(150) # Unrealistically high age error

Skrip Python ini:

  1. Menghubungkan ke basis data MySQL.
  2. Memanggil prosedur check_age dengan berbagai masukan.
  3. Menampilkan hasil atau pesan kesalahan.

Conclusion

Dan begitu saja, teman-teman! Kita telah berpergian melalui dunia pernyataan RESIGNAL MySQL. Dari penggunaan dasar ke situasi yang lebih kompleks, Anda sekarang memiliki alat untuk menangani kesalahan dan peringatan seperti seorang ahli.

Ingat, penanganan kesalahan seperti menjadi seorang detektif baik - itu tentang mengumpulkan informasi dan membagikan itu dalam cara yang membantu untuk memecahkan misteri (atau dalam kasus kita, untuk debugging kode).

Tetap berlatih, tetap bersemangat, dan jangan takut untuk membuat kesalahan. Setelah semuanya, itu adalah bagaimana kita belajar dan tumbuh sebagai pemrogram. Selamat coding!

Credits: Image by storyset