Apakah Oracle PL / SQL memiliki rutin ASSERT standar?


14

Saya ingin menggunakan rutin ASSERT yang secara fungsional mirip dengan yang ditemukan dalam bahasa lain, yaitu konstruk (baik itu prosedur, sintaksis ...)

ASSERT( <condition>, <msg>)

sedemikian sehingga ketika <condition>dikirimkan dalam argumen pertama adalah salah pengecualian akan dimunculkan dengan <msg>pesan deskriptif yang ditentukan .

Saya tahu ini sepele untuk dilakukan dengan tangan tetapi saya bertanya apakah ada standar yang disediakan dengan DBMS.

Harus menulis sendiri atau mengimpor satu dari paket pihak ketiga akan tidak praktis, karena saya akan membutuhkannya sepenuhnya portabel dan transparan untuk setiap proyek yang saya kerjakan.


Tidak, Anda harus membangun sendiri. Impraktik memiliki ambang batas yang rendah saat ini :)
Vincent Malgrat

Jawaban:


11

Tidak ada prosedur pernyataan bawaan dalam SQL atau PL / SQL, jadi Anda harus menulis sendiri.

Ada dua cara untuk melakukan ini. Anda dapat mengajukan pengecualian secara manual, seperti yang dibahas dalam artikel Oracle ini , atau Anda dapat menulis pembungkus untuk raise_application_errorprosedur ini, yang didokumentasikan di bagian penanganan pengecualian Oracle pada dokumentasi.

Saya akan menambahkan bahwa pengecualian dirancang untuk skenario semacam ini, jadi Anda sebaiknya melepas topi programmer sebentar & menggunakan topi DBA Anda :)


7

Dibangun di DBMS_ASSERT paket adalah versi sempit scoped dari apa yang Anda cari. Untuk menegaskan Phil lain benar, Anda harus membangun sendiri. Berikut ini adalah demonstrasi sederhana dari opsi kedua dalam jawaban Phil +1 :

set serveroutput on size 1000000
Declare

   Procedure Assert (pCondition In Number, pMessage In Varchar2) Is
   Begin
      If (pCondition = 1) Then
         Return; 
      End If;
      Raise_Application_Error(-20001, pMessage);
   End Assert;

Begin
   DBMS_Output.Put_Line('Start');

   Assert(Case When 1+1=2 Then 1 Else 0 End,'Something is wrong 1.');
   Assert(Case When 1+1=9 Then 1 Else 0 End,'Something is wrong 2.');

   DBMS_Output.Put_Line('End');
End;
/

1
DBMS_ASSERT ditargetkan pada parsing SQL, maka saya tidak menyebutkannya.
Philᵀᴹ

1
@ Phil dan itu sebabnya saya katakan dengan sempit. Mungkin itu harus dibatasi dengan sangat sempit. :)
Leigh Riffel
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.