Condições de pre-execução de SQL

Visão Geral

As Condições de Pre-Execução de SQL permitem através de instruções de controle do tipo IF, ELSE IF e ELSE adicionar ou omitir partes do comando SQL antes dele ser executado.

Este é um recurso muito útil para não executar partes desnecessárias de um comando SQL. Por exemplo, se existe um parâmetro opcional a ser utilizado na Query, ao invés de fazer uma condição usando a cláusula OR ou CASE WHEN para verificar se ele está preenchido ou não, bastaria omitir a linha do comando SQL que usa o parâmetro quando ele não for informado.

As Condições de Pre-Execução de SQL pode ser utilizadas em qualquer Comando SQL informado dentro do Latromi.

image

Instruções

Seguem abaixo as instruções disponíveis:

  • IF: Deve ser usada para iniciar um bloco de condição.
  • ELSE IF: Usada para criar uma condição excedente à anterior. Essa instrução pode ser várias vezes após o IF
  • ELSE: Usada para determinar o que de ser executado se nenhuma das condições anteriores forem antedidas
  • END IF: Deve ser usada para finalizar um bloco de condição.

Sintaxe

As instruções de Condições de Pre-Execução de SQL são adicionadas dentro de comentários de linha do SQL (--). Este cuidado foi tomado para minimizar os erros de sintaxe de SQL antes das condições serem processadas pelo sistema.

Além de estarem dentro de um comentário de linha, as instruções são precedidas por # e devem ser o único código da linha.

A analise das instruções é case insensitive, ou seja, tanto faz se você informar --#IF ou --#if.

Condições

As condições são usadas imediatamente após as declarações IF ou ELSE IF.

Exemplo:

--#if {?PARAM Codigo} > 0
Codigo = {?PARAM Codigo}
--#end if

Operadores Relacionais

Operadores relacionais são utilizados para comparar valores. O resultado de uma expressão relacional é um valor booleano (true ou false).

O seguintes operadores estão disponíveis:

Operador Descrição
= Igual
== Igual
<> Diferente
!= Diferente
> Maior
>= Maior ou Igual
< Menor
<= Menor ou Igual

Operadores Lógicos

Os operadores lógicos and (ou &&) e or (ou ||) podem ser usados para combinar condições, assim como os ( ) (parênteses) para agrupar condições.

Exemplo:

--#if  {?PARAM FiltrarCliente} = 'SIM' and {?PARAM IdCliente} > 0
IdCliente = '{?PARAM IdCliente}'
--#end if

Negação

Para negar uma condição, use not (ou !) antes dela.

Por exemplo, essa condinção:

--#if  not {?PARAM IdCliente} > 0

Tem o mesmo resultado desta:

--#if  {?PARAM IdCliente} <= 0

Funções

Segue abaixo a lista de funções disponíveis.

Empty (…)

A função Empty recebe um ou mais parâmetros, e retorna true se todos estiverem vazios.

O parâmetro será considerado vazio quando qualquer uma das condições abaixo for entendida:

  • A ausência do Parâmetro
  • Nulo
  • Vazio (ausência de caracteres)
  • 0
  • 0.00
  • false

Exemplo:

--#if Empty({?PARAM DataFinal})
Data <= CURRENT_DATE
--#end if

Também é possível testar se um parâmetro está em branco negando a existência dele na expressão. Este recurso é conhecido como omissão de condição, e nada mais é do que um atalho para a função Empty.

Exemplo:

--#if !{?PARAM DataFinal}
Data <= CURRENT_DATE
--#end if
Ao usar a omissão de condição, a expressão não pode conter outras condições.

Filled (…)

A função Filled faz o inverso da função Empty. Ela recebe um ou mais parâmetros, e retorna true se todos estiverem preenchidos.

Exemplo:

--#if Filled({?PARAM DataFinal})
Data <= '{?PARAM DataFinal}'
--#end if

Também é possível testar se um parâmetro está preenchido afirmando a existência dele na expressão. Este recurso é conhecido como omissão de condição, e nada mais é do que um atalho para a função Filled.

Exemplo:

--#if {?PARAM DataFinal}
Data <= '{?PARAM DataFinal}'
--#end if
Ao usar a omissão de condição, a expressão não pode conter outras condições.

Date (…)

A função Date recebe um texto e converte para Data/Hora. O texto deve ser passado entre aspas simples, como uma string.

Os formatos aceitos são:

Formato Exemplo
yyyy-MM-dd HH:mm:ss 2021-04-28 13:47:02
yyyy-MM-dd HH:mm 2021-04-28 13:47
yyyy-MM-dd 2021-04-28

Exemplo:

--#if {?PARAM Data} < Date('2000-01-01')
TO_DATE(Data, 'YYMMDD') = '{?PARAM DataInicio}'
--#end if

Exemplos

SELECT * FROM Tabela WHERE 1=1

--#if {?PARAM DataInicio}
AND DataEmissao >= '{?PARAM DataInicio}'
--#endif

--#if {?PARAM DataFim}
AND DataEmissao <= '{?PARAM DataFim}'
--#endif

No exemplo acima, podemos ter 3 execuções diferentes de SQL:

  1. Se apenas o parâmetro “DataInicio” for informado:

    SELECT * FROM Tabela WHERE 1=1
    
    AND DataEmissao >= '{?PARAM DataInicio}'
    
  2. Se apenas o parâmetro “DataFim” for informado:

    SELECT * FROM Tabela WHERE 1=1
    
    AND DataEmissao <= '{?PARAM DataFim}'
    
  3. Se os dois parâmetros forem informados:

    SELECT * FROM Tabela WHERE 1=1
    
    AND DataEmissao >= '{?PARAM DataInicio}'
    
    AND DataEmissao <= '{?PARAM DataFim}'
    

Limitações

  • Não há suporte para a omissão de comparação em condições combinadas.

    A condição abaixo por exemplo, não funcionaria:
    --#if {?PARAM Parametro1} and {?PARAM Parametro2}

  • Parâmetro do tipo Data/Hora só podem ser testados com omissão de comparação.

3 curtidas