Oracle PL / SQL ha una routine ASSERT standard?


14

Vorrei usare una routine ASSERT funzionalmente simile a quella trovata in altre lingue, ovvero un costrutto (che si tratti di una procedura, di una sintassi ...)

ASSERT( <condition>, <msg>)

tale che quando il <condition>passaggio nel primo argomento è falso, viene sollevata un'eccezione con il <msg>messaggio descrittivo specificato .

So che questo è banale da fare a mano ma sto chiedendo se ce n'è uno standard fornito con il DBMS.

Dover scrivere il mio o importarne uno da pacchetti di terze parti non sarebbe pratico, dal momento che ne avrei bisogno per essere completamente portatile e trasparente per ogni progetto a cui sto lavorando.


No, dovrai costruirne uno tuo. Oggi l'impraticabilità ha una soglia bassa :)
Vincent Malgrat,

Risposte:


11

Non esiste una procedura di asserzione integrata in SQL o PL / SQL, quindi dovrai scriverne una tua.

Ci sono due modi per farlo. È possibile sollevare manualmente un'eccezione, come discusso in questo articolo Oracle , oppure è possibile scrivere un wrapper per la raise_application_errorprocedura, che è documentata nella sezione Gestione delle eccezioni Oracle della documentazione.

Aggiungerò che le eccezioni sono state progettate per questo tipo di scenario, quindi faresti meglio a toglierti il ​​cappello del programmatore per un secondo e usare il tuo cappello DBA :)


7

Il pacchetto DBMS_ASSERT integrato è una versione con ambito ristretto di ciò che stai cercando. Per altre affermazioni, Phil ha ragione, dovrai costruirne una tua. Ecco una semplice dimostrazione della seconda opzione nella risposta +1 di 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 è mirato all'analisi SQL, quindi non me ne accenni.
Philᵀᴹ

1
@Phil ed è per questo che ho detto per scopi ristretti. Forse questo dovrebbe essere estremamente limitato. :)
Leigh Riffel,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.