Controle e Sub-rotinas
#CALL
Definição: Chama outro método, permitindo reutilizar consultas em outros métodos.
Utilidade: Modularização e reutilização de código SQL.
Especificação:
#CALL:nome_alias caminho_do_método(parametros)Exemplo:
#CALL:param Millennium.configuracoes.consulta();#CHECK
Definição: Realiza validações e retorna um erro caso a condição seja atendida.
Utilidade: Implementar validações condicionais em consultas.
Especificação:
#CHECK("consulta_sql", condição, "mensagem_de_erro")Exemplo:
#CHECK("SELECT COUNT(*) AS n FROM DUAL", n > 0, "Quantidade inválida");#EACH
Definição: Itera sobre um REGISTRO (array/lista) e executa comandos SQL para cada item individualmente.
Um REGISTRO é criado quando se atribui uma variável (:VARIAVEL) a um resultado de SELECT. O macro #EACH() permite processar cada elemento deste registro separadamente.
Formas de Uso:
- Comando único - use ponto e vírgula no final:
#EACH() :PEDIDOS AS P;
DELETE FROM PEDIDO_VENDA WHERE PEDIDOV = :P.PEDIDOV;- Múltiplos comandos - use estrutura #BEGIN/#END; (com ponto e vírgula apenas no final):
#EACH() :PEDS AS P
#BEGIN
UPDATE PEDIDO_VENDA SET STATUS = 'CANCELADO' WHERE PEDIDOV = :P.PEDIDOV;
DELETE FROM PEDIDO_ITENS WHERE PEDIDOV = :P.PEDIDOV;
#CALL:log Millennium.log.registrar_operacao('Cancelamento', :P.PEDIDOV);
#END;Variações de Parâmetros:
- Parâmetro do método - sem os dois pontos, acessa parâmetros do próprio método:
#EACH() TAREFAS AS T1
#BEGIN
UPDATE TAREFAS SET STATUS = 'CONCLUIDO' WHERE ID = :T1.ID;
INSERT INTO HISTORICO (TAREFA_ID, DATA) VALUES (:T1.ID, SYSDATE);
#END;- Sem alias (AS) - acessa diretamente pelo nome do registro:
#EACH() :RETORNO
#BEGIN
#CALL:nn millenium.bordero.FormataNossoNumeroCobrebem(NOSSO_NUMERO=:RETORNO.NOSSO_NUMERO);
#CALL:nd millenium.bordero.FormataNossoNumeroCobrebem(NOSSO_NUMERO=:RETORNO.DUPLICATA);
#END;- **SELECT direto com atribuição da variável ** - realiza a consulta e itera sobre o resultado:
#EACH()
SELECT:T0 AGENDA_PRODUCAO FROM AGENDA_PRODUCAO
WHERE AGENDA_PRODUCAO.PRODUCAO = :PRODUCAO AND #NULL_TO_S(LINHA_BASE,FALSE) = TRUE
#BEGIN
DELETE FROM AGENDA_PRODUCAO WHERE AGENDA_PRODUCAO = :T0.AGENDA_PRODUCAO;
DELETE FROM AGENDA_PRODUCAO_DETALHE WHERE AGENDA_PRODUCAO = :T0.AGENDA_PRODUCAO;
#END;#FETCHALL
Definição: Força a consulta a processar todos os registros de uma única vez.
Utilidade: Necessário em casos especiais onde é preciso processar todos os registros imediatamente.
Especificação:
#FETCHALL()Exemplo:
#FETCHALL()
SELECT produto FROM produtos;#NOERROR
Definição: Ignora qualquer erro que ocorrer no comando seguinte.
Utilidade: Prosseguir com a execução mesmo que ocorram erros.
Especificação:
#NOERROR()#NOFILTER
Definição: Ignora os filtros de usuário configurados (como Loja, Conta, etc.), retornando todos os registros.
Utilidade: Necessário quando a consulta deve ignorar filtros de segurança aplicados por padrão.
Especificação:
#NOFILTER()Exemplo:
#NOFILTER()
SELECT * FROM filiais;#NOFILTER_SESSION
Definição: Similar ao #NOFILTER, mas mantém o comportamento para todo o script.
Utilidade: Aplicar o #NOFILTER a todas as consultas do script.
Especificação:
#NOFILTER_SESSION()#NOPROTECT
Definição: Desabilita a proteção de segurança, não aplicando os filtros padrão no servidor.
Utilidade: Usado em casos onde é necessário acesso total aos dados sem restrições.
Especificação:
#NOPROTECT()Exemplo:
#NOPROTECT()
SELECT * FROM FILIAIS;#PRIVATE
Definição: Indica que o resultado da consulta não deve fazer parte do resultado final do método.
Utilidade: Evitar que consultas intermediárias apareçam no resultado final.
Especificação:
#PRIVATE()Exemplo:
#PRIVATE()
SELECT * FROM tabela_intermediaria;#TOP
Definição: Limita o número de registros retornados pelo método do broker às N primeiras linhas.
Utilidade: Restringir a quantidade de dados retornados.
Especificação:
#TOP(número_de_linhas)Exemplo:
#TOP(5)
SELECT nome FROM CLIENTES;