Czy Oracle PL / SQL ma standardową procedurę ASSERT?

14

Chciałbym użyć procedury ASSERT funkcjonalnie podobnej do tej znalezionej w innych językach, tj. Konstrukcji (czy to procedury, składni ...)

ASSERT( <condition>, <msg>)

tak, że gdy <condition>przekazany w pierwszym argumencie argument ma wartość false, zgłaszany jest wyjątek z określonym <msg>komunikatem opisowym.

Wiem, że jest to trywialne zrobić ręcznie, ale pytam, czy istnieje standardowy z DBMS.

Konieczność napisania własnego lub zaimportowania jednego z pakietów 3rdy party byłaby niepraktyczna, ponieważ musiałbym być całkowicie przenośny i przejrzysty dla każdego projektu, nad którym pracuję.

użytkownik881430
źródło
Nie, będziesz musiał zbudować własny. Niepraktyczność ma obecnie niski próg :)
Vincent Malgrat

Odpowiedzi:

11

Nie ma wbudowanej procedury asercji w SQL lub PL / SQL, więc będziesz musiał napisać własną.

Można to zrobić na dwa sposoby. Możesz albo ręcznie zgłosić wyjątek, jak omówiono w tym artykule Oracle , lub napisać opakowanie dla raise_application_errorprocedury, które jest udokumentowane w sekcji obsługi wyjątków Oracle w dokumentacji.

Dodam, że wyjątki zostały zaprojektowane dla tego rodzaju scenariusza, więc lepiej byłoby na chwilę zdjąć czapkę programisty i użyć czapki DBA :)

Philᵀᴹ
źródło
7

Wbudowany pakiet DBMS_ASSERT to wąsko zakrojona wersja tego, czego szukasz. W przypadku innych twierdzeń, że Phil ma rację, będziesz musiał zbudować własny. Oto prosty przykład drugiej opcji w odpowiedzi Phila +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;
/
Leigh Riffel
źródło
1
DBMS_ASSERT jest ukierunkowany na parsowanie SQL, dlatego nie wspominam o tym.
Philᵀᴹ
1
@Fil i dlatego powiedziałem wąsko. Być może powinno to mieć bardzo wąski zakres. :)
Leigh Riffel,