Saya punya pertanyaan yang sangat sederhana tetapi saya tidak mendapatkan kode sederhana untuk keluar dari SP menggunakan Mysql. Adakah yang bisa berbagi dengan saya cara melakukannya?
CREATE PROCEDURE SP_Reporting(IN tablename VARCHAR(20))
BEGIN
IF tablename IS NULL THEN
#Exit this stored procedure here
END IF;
#proceed the code
END;
mysql
sql
stored-procedures
Joe Ijam
sumber
sumber
IF tablename IS NOT NULL THEN
...;)Jawaban:
sumber
END proc_label;
sintaks (ditunjukkan dalam sebagian besar contoh MySQL resmi) tidak diperlukan. (ini adalah cara yang bagus untuk berkomentar tentang proc yang disimpan tanpa harus menggulir ke bawah untuk menempatkannya*/
)LEAVE this_proc;
kedengarannya sempurna!return <value>
mengembalikan nilai.:
danBEGIN
karenaproc_label:BEGIN
memberikan kesalahan sintaks saatproc_label: BEGIN
bekerja.Jika Anda ingin "keluar awal" untuk situasi di mana tidak ada kesalahan, maka gunakan jawaban yang diterima yang diposting oleh @piotrm. Paling biasanya, Anda akan menyerah karena kondisi kesalahan (terutama dalam prosedur SQL).
Pada MySQL v5.5 Anda bisa melempar pengecualian. Meniadakan penangan pengecualian, dll. Yang akan mencapai hasil yang sama, tetapi dengan cara yang lebih bersih dan lebih pedih.
Begini caranya:
Catatan
SQLSTATE '45000'
sama dengan "Kondisi pengecualian yang ditentukan pengguna yang tidak ditangani". Secara default, ini akan menghasilkan kode kesalahan1644
(yang memiliki arti yang sama). Perhatikan bahwa Anda dapat membuang kode kondisi lain atau kode kesalahan jika Anda mau (ditambah detail tambahan untuk penanganan pengecualian).Untuk lebih lanjut tentang hal ini, lihat:
https://dev.mysql.com/doc/refman/5.5/id/signal.html
Cara meningkatkan kesalahan dalam fungsi MySQL
http://www.databasejournal.com/features/mysql/mysql-error-handling-using-the-signal-and-resignal-statements.html
Tambahan
Ketika saya membaca kembali posting saya ini, saya menyadari bahwa saya memiliki sesuatu yang ditambahkan. Sebelum ke MySQL v5.5, ada cara untuk meniru melempar pengecualian. Ini bukan hal yang persis sama, tetapi ini analog: Buat kesalahan melalui memanggil prosedur yang tidak ada. Panggil prosedur dengan nama yang bermakna untuk mendapatkan cara yang berguna untuk menentukan apa masalahnya. Ketika kesalahan terjadi, Anda akan melihat garis kegagalan (tergantung pada konteks eksekusi Anda).
Sebagai contoh:
CALL AttemptedToInsertSomethingInvalid;
Perhatikan bahwa ketika Anda membuat prosedur, tidak ada validasi yang dilakukan pada hal-hal tersebut. Jadi sementara dalam sesuatu seperti bahasa yang dikompilasi, Anda tidak akan pernah bisa memanggil fungsi yang tidak ada di sana, dalam skrip seperti ini, ia hanya akan gagal saat runtime, yang persis seperti yang diinginkan dalam kasus ini!
sumber
Untuk menangani situasi ini dengan cara yang portabel (yaitu akan bekerja pada semua database karena tidak menggunakan label MySQL Kung fu), pisahkan prosedur menjadi beberapa bagian logika, seperti ini:
sumber
Kenapa tidak ini:
sumber
if
pernyataan. Secara logis identik dengan "pengembalian awal".Ini bekerja untuk saya:
sumber
sumber