O Oracle PL / SQL possui uma rotina ASSERT padrão?

14

Eu gostaria de usar uma rotina ASSERT funcionalmente semelhante à encontrada em outros idiomas, ou seja, uma construção (seja um procedimento, sintaxe ...)

ASSERT( <condition>, <msg>)

de modo que, quando o <condition>passado no primeiro argumento for falso, uma exceção seja gerada com a <msg>mensagem descritiva especificada .

Eu sei que isso é trivial de fazer à mão, mas estou perguntando se há um padrão fornecido com o DBMS.

Ter que escrever o meu próprio ou importar um de pacotes de terceiros seria impraticável, pois eu precisaria que fosse completamente portátil e transparente para todos os projetos em que estou trabalhando.

user881430
fonte
Não, você terá que construir o seu próprio. Impraticabilidade tem um baixo limiar de hoje :)
Vincent Malgrat

Respostas:

11

Não há um procedimento de asserção interno no SQL ou PL / SQL, portanto, você precisará escrever o seu próprio.

Existem duas maneiras de fazer isso. Você pode gerar manualmente uma exceção, conforme discutido neste artigo da Oracle , ou pode escrever um wrapper para o raise_application_errorprocedimento, que está documentado na seção de manipulação de exceções do Oracle da documentação.

Acrescentarei que as exceções foram projetadas para esse tipo de cenário, então é melhor tirar o chapéu do programador por um segundo e usar o chapéu do DBA :)

Philᵀᴹ
fonte
7

O pacote DBMS_ASSERT interno é uma versão com escopo restrito do que você está procurando. Para outras afirmações, Phil está correto, você terá que construir o seu próprio. Aqui está uma demonstração simples da segunda opção na resposta 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
fonte
1
DBMS_ASSERT é direcionado à análise de SQL, portanto, não estou mencionando isso.
Philᵀᴹ
1
@ Phil e é por isso que eu disse com escopo limitado. Talvez isso deva ser extremamente limitado. :)
Leigh Riffel