¿Oracle PL / SQL tiene una rutina ASSERT estándar?

14

Me gustaría utilizar una rutina ASSERT funcionalmente similar a la que se encuentra en otros idiomas, es decir, una construcción (ya sea un procedimiento, sintaxis ...)

ASSERT( <condition>, <msg>)

de modo que cuando se <condition>pasa el primer argumento es falso, se genera una excepción con el <msg>mensaje descriptivo especificado .

Sé que esto es trivial, pero estoy preguntando si hay un estándar provisto con el DBMS.

No sería práctico tener que escribir el mío o importar uno de los paquetes de 3rdy-party, ya que necesitaría que fuera completamente portátil y transparente para cada proyecto en el que estoy trabajando.

usuario881430
fuente
No, tendrás que construir el tuyo. La impracticabilidad tiene un umbral bajo hoy en día :)
Vincent Malgrat

Respuestas:

11

No hay un procedimiento de aserción incorporado en SQL o PL / SQL, por lo que tendrá que escribir el suyo.

Hay dos formas de hacerlo. Puede generar una excepción manualmente, como se describe en este artículo de Oracle , o puede escribir un contenedor para el raise_application_errorprocedimiento, que se documenta en la sección de manejo de excepciones de Oracle de la documentación.

Agregaré que las excepciones fueron diseñadas para este tipo de escenario, por lo que sería mejor quitarse el sombrero de programador por un segundo y usar su sombrero de DBA :)

Philᵀᴹ
fuente
7

El paquete incorporado DBMS_ASSERT es una versión de alcance limitado de lo que está buscando. Para otras afirmaciones, Phil tiene razón, tendrá que construir la suya propia. Aquí hay una demostración simple de la segunda opción en la respuesta de 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;
/
Leigh Riffel
fuente
1
DBMS_ASSERT está dirigido al análisis de SQL, por lo tanto, no lo menciono.
Philᵀᴹ
1
@ Phil y es por eso que dije con un alcance limitado. Quizás eso debería ser extremadamente limitado. :)
Leigh Riffel