Oracle PL / SQL a-t-il une routine ASSERT standard?


14

Je voudrais utiliser une routine ASSERT fonctionnellement similaire à celle trouvée dans d'autres langages, c'est-à-dire une construction (que ce soit une procédure, une syntaxe ...)

ASSERT( <condition>, <msg>)

de telle sorte que lorsque le <condition>passé dans le premier argument est faux, une exception est levée avec le <msg>message descriptif spécifié .

Je sais que c'est trivial à faire à la main, mais je demande s'il y en a un standard fourni avec le SGBD.

Devoir écrire le mien ou en importer un à partir de packages tiers ne serait pas pratique, car j'aurais besoin qu'il soit complètement portable et transparent pour chaque projet sur lequel je travaille.


Non, vous devrez construire le vôtre. L'impraticité a un seuil bas de nos jours :)
Vincent Malgrat

Réponses:


11

Il n'y a pas de procédure d'assertion intégrée en SQL ou PL / SQL, vous devrez donc écrire la vôtre.

Il y a deux façons de procéder. Vous pouvez soit lever manuellement une exception, comme indiqué dans cet article Oracle , soit écrire un wrapper pour la raise_application_errorprocédure, qui est documenté dans la section Gestion des exceptions Oracle de la documentation.

J'ajouterai que les exceptions ont été conçues pour ce type de scénario, il vaut donc mieux retirer votre chapeau de programmeur une seconde et utiliser votre chapeau DBA :)


7

Le package DBMS_ASSERT intégré est une version à portée limitée de ce que vous recherchez. Pour les autres affirmations que Phil a raison, vous devrez créer le vôtre. Voici une démonstration simple de la deuxième option dans la réponse +1 de Phil :

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 est destiné à l'analyse SQL, donc je ne le mentionne pas.
Philᵀᴹ

1
@Phil et c'est pourquoi j'ai dit une portée étroite. Peut-être que cela devrait être extrêmement limité. :)
Leigh Riffel
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.