Verfügt Oracle PL / SQL über eine Standard-ASSERT-Routine?


14

Ich möchte eine ASSERT-Routine verwenden, die funktional derjenigen in anderen Sprachen ähnelt, dh ein Konstrukt (sei es eine Prozedur, eine Syntax ...).

ASSERT( <condition>, <msg>)

Wenn das <condition>im ersten Argument übergebene Argument falsch ist, wird mit der angegebenen <msg>beschreibenden Nachricht eine Ausnahme ausgelöst.

Ich weiß, dass dies trivial ist, aber ich frage, ob es einen Standard gibt, der mit dem DBMS geliefert wird.

Es wäre unpraktisch, ein eigenes Paket zu schreiben oder aus Paketen von Drittanbietern zu importieren, da es für jedes Projekt, an dem ich arbeite, vollständig portierbar und transparent sein muss.


Nein, Sie müssen Ihre eigenen bauen. Unpraktikabilität hat heutzutage eine niedrige Schwelle :)
Vincent Malgrat

Antworten:


11

In SQL oder PL / SQL ist keine Zusicherungsprozedur integriert, daher müssen Sie Ihre eigene schreiben.

Hierfür gibt es zwei Möglichkeiten. Sie können entweder manuell eine Ausnahme auslösen, wie in diesem Oracle-Artikel beschrieben , oder Sie können einen Wrapper für die raise_application_errorProzedur schreiben , der im Abschnitt zur Behandlung von Oracle-Ausnahmen in der Dokumentation dokumentiert ist.

Ich füge hinzu, dass Ausnahmen für diese Art von Szenario entwickelt wurden, also sollten Sie Ihren Programmiererhut für eine Sekunde abnehmen und Ihren DBA-Hut verwenden :)


7

Das eingebaute DBMS_ASSERT- Paket ist eine eng gefasste Version dessen, wonach Sie suchen. Für andere Behauptungen, die Phil richtig macht, müssen Sie Ihre eigenen bauen. Hier ist eine einfache Demonstration der zweiten Option in Phils Antwort +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 zielt auf SQL-Parsing ab, daher erwähne ich es nicht.
Philᵀᴹ

1
@Phil und das ist, warum ich sagte, eng umrissen. Vielleicht sollte das extrem eng gefasst sein. :)
Leigh Riffel
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.