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.
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
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
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:
-
Se apenas o parâmetro “DataInicio” for informado:
SELECT * FROM Tabela WHERE 1=1 AND DataEmissao >= '{?PARAM DataInicio}'
-
Se apenas o parâmetro “DataFim” for informado:
SELECT * FROM Tabela WHERE 1=1 AND DataEmissao <= '{?PARAM DataFim}'
-
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.