Rumah >pangkalan data >Oracle >Bagaimana saya mengendalikan pengecualian dalam PL/SQL?
PL/SQL menawarkan mekanisme pengendalian pengecualian yang mantap untuk menguruskan ralat runtime dengan anggun dan mencegah kemalangan aplikasi. Inti dari mekanisme ini berkisar di sekitar blok EXCEPTION
dalam blok PL/SQL. Blok ini digunakan untuk menangkap dan mengendalikan pengecualian yang berlaku semasa pelaksanaan blok BEGIN
yang terdahulu.
Struktur asas kelihatan seperti ini:
<code class="sql">DECLARE -- Declare variables BEGIN -- Your PL/SQL code here EXCEPTION WHEN OTHERS THEN -- Handle any unhandled exception WHEN NO_DATA_FOUND THEN -- Handle the NO_DATA_FOUND exception WHEN ZERO_DIVIDE THEN -- Handle the ZERO_DIVIDE exception WHEN TOO_MANY_ROWS THEN -- Handle the TOO_MANY_ROWS exception -- ... other WHEN clauses for specific exceptions ... END; /</code>
WHEN OTHERS
adalah tangkapan-semua untuk apa-apa pengecualian yang tidak ditangani secara eksplisit dengan sebelumnya WHEN
klausa. Adalah penting untuk memasukkan ini untuk mengelakkan penamatan program yang tidak dijangka, walaupun ia harus digunakan dengan berhati -hati dan dengan pembalakan berhati -hati untuk menentukan sumber kesilapan. Secara umumnya lebih baik untuk mengendalikan pengecualian tertentu apabila mungkin untuk mesej ralat yang lebih bermaklumat dan strategi pemulihan yang disasarkan. Menggunakan WHEN OTHERS
tanpa pembalakan yang betul dapat mengatasi masalah yang serius.
PL/SQL mempunyai beberapa jenis pengecualian yang telah ditetapkan, masing -masing mewakili jenis kesilapan tertentu. Sebahagian yang paling biasa termasuk:
NO_DATA_FOUND
: Dibesarkan apabila SELECT INTO
pernyataan mengembalikan tiada baris. Ini mudah dikenalpasti oleh mesej ralat khususnya.ZERO_DIVIDE
: Dibesarkan apabila percubaan dibuat untuk membahagikan sifar. Sekali lagi, mesej ralat jelas.TOO_MANY_ROWS
: Dibesarkan apabila SELECT INTO
pernyataan mengembalikan lebih dari satu baris. Ini menunjukkan kecacatan dalam klausa WHERE
QUERY.DUP_VAL_ON_INDEX
: Dibesarkan apabila percubaan dibuat untuk memasukkan nilai pendua ke dalam indeks yang unik.INVALID_NUMBER
: Dibesarkan ketika cuba menukar rentetan bukan numerik ke nombor.VALUE_ERROR
: Dibesarkan untuk pelbagai jenis kesilapan yang berkaitan dengan data, seperti cuba menetapkan jenis data yang salah kepada pembolehubah.CURSOR_ALREADY_OPEN
: Dibesarkan ketika cuba membuka kursor yang sudah dibuka.OTHERS
: Catch-All untuk apa-apa pengecualian yang tidak ditangani secara eksplisit. Mengenal pasti pengecualian ini biasanya melibatkan memeriksa mesej ralat yang dikembalikan oleh pangkalan data. Oracle menyediakan mesej ralat terperinci yang sering menentukan jenis pengecualian dan penyebabnya. Anda boleh mengakses maklumat ini menggunakan SQLCODE
(yang mengembalikan kod ralat angka) dan SQLERRM
(yang mengembalikan mesej ralat teks) dalam blok EXCEPTION
.
Meningkatkan pengendalian ralat dan pembalakan adalah penting untuk debugging yang berkesan. Inilah cara untuk meningkatkan pengendalian ralat PL/SQL anda:
Pembalakan terperinci: Daripada hanya memaparkan mesej ralat generik, log maklumat terperinci, termasuk:
SQLCODE
dan SQLERRM
).DBMS_OUTPUT
. DBMS_OUTPUT
sesuai untuk ujian dan pembangunan tetapi bukan untuk sistem pengeluaran.RAISE_APPLICATION_ERROR
.Contoh pembalakan yang dipertingkatkan:
<code class="sql">PROCEDURE my_procedure(p_input IN NUMBER) IS v_result NUMBER; BEGIN -- ... your code ... EXCEPTION WHEN OTHERS THEN INSERT INTO error_log (error_time, procedure_name, sqlcode, sqlerrm, input_parameter) VALUES (SYSTIMESTAMP, 'MY_PROCEDURE', SQLCODE, SQLERRM, p_input); COMMIT; RAISE; -- Re-raise the exception to be handled by a calling procedure, if necessary. END; /</code>
Untuk memastikan tingkah laku aplikasi yang mantap, ikuti amalan terbaik ini:
WHEN OTHERS
. Mengendalikan pengecualian tertentu apabila mungkin untuk pengendalian ralat yang lebih tepat.RAISE
dengan bijak: RAISE
semula pengecualian, yang membolehkan prosedur panggilan untuk mengendalikannya. Gunakannya secara strategik untuk menyebarkan pengecualian sehingga timbunan panggilan.ROLLBACK
untuk membatalkan sebarang perubahan yang dibuat semasa urus niaga jika operasi gagal. Ini memastikan integriti data.Dengan mengikuti garis panduan ini, anda dapat meningkatkan keteguhan dan kebolehpercayaan aplikasi PL/SQL anda dengan ketara. Pengendalian pengecualian yang berkesan adalah penting untuk membina aplikasi yang boleh dipelihara dan mesra pengguna.
Atas ialah kandungan terperinci Bagaimana saya mengendalikan pengecualian dalam PL/SQL?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!