Programação, Banco de Dados
Referenciado por: Introdução a Programação de Banco do Totali Commerce |
Comandos e Funções
Definição Básica de Scripts (*.mac)
Os script serão compostos pelas seguintes partes:
- Texto Livre;
- Macros;
Texto Livre
Nesta área serão escritos os comandos SQL que são iguais para ambas as linguagens. Caso o texto possua palavras mapeadas para substituição estas serão substituídas na execução.
| Macro | Oracle | PostgreSQL |
|---|---|---|
| DATE | Date | Timestamp |
Macros
As macros devem estar entre os seguintes caracteres %%< e >%% e se definem da seguinte forma.
%%<Macro(Parâmetros)>%%
Elas são executadas e o resultado é inserido em sua posição.
Os Parâmetros para macro podem ser:
- Numérico: Valores reais ou inteiros.
Exemplo:
345.09
- Strings: Texto que deve ser colocado entre aspas simples.
Exemplo:
Texto
Caso se deseje imprimir uma aspas simples seve se utilizar barra seguida da mesma.
Exemplo: Outro texto - \'texto entre aspas\'
Saíra da seguinte maneira:
Outro texto 'texto entre aspas'
- Lista de repetição: Cria uma repetição nos passando cada parâmetro a cada repetição. Os parâmetros podem ser números, string ou Macros.
Exemplo:
[1,2,3,4,5]
ou
['a','b','c','d']
ou
[Str('a'),1,'oi',1]
Incrementar: Valores que auto-incrementam a cada repetição. Definido da seguinte forma:
Crescente: .Nro.. Onde Nro é um número inteiro.
Exemplo:
.1..
- Decrescente: ..Nro. Onde Nro é um número inteiro.
Exemplo:
.10..
Por exemplo em uma repetição o incremento .6.. irá gerar os seguintes resultados: 6,7,8,9,10...
- Macro: Uma macro pode chamar outra macro ou ela mesma recursivamente. O seu resultado deve gerar uma saída em forma numérica, string ou incrementar.
Definição de Macros
As macros são compostas pelas seguintes partes:
Nome: Utilizado para chamar posteriormente a mesma.
Nro de Parâmetros: Número de parâmetros da macro. Se for colocado o número como 0 (zero) o template entenderá a macro como uma palavra de substituição.
Exemplo:
Date-> Timestamp
ou
NVL-> Covalesce
Caso se defina uma função com um número de parâmetros e se utilize outro na execução o sistema gerará um erro.
- Descrição: Descrição da macro para fins de documentação.
- Sintaxes (PL/SQL e PL/PGSQL): Expressão de saída para a macro em cada linguagem (PL/SQL e PL/PGSQL).
É definida pelas seguintes partes:
Texto Livre: Texto a ser gerado pela macro (Observação: Aconselha-se trocar ' por \' )
Parâmetros: Os número precedidos de # serão substituídos pelos respectivos parâmetros passados.
Exemplo:
%%<funcaoteste('a','b','c','d')%>
- Sintaxe para PL/SQL: teste #1 - #2 - #3 - #4
Saída:
teste a - b - c - d
Macros: outra macro pode ser chamada deste que seja utilizados os marcadores %%< e >%%
Comando: {#X,Expressão} conforme descrição posterior
Layout de saída [[][]]: conforme descrição posterior
Diretivas - {$IFDEF}: conforme descrição posterior
Lista de Comandos
1) {#X, Expressão} e {!#X, Expressão}
{#X, Expressão}
O segundo parâmetro nos colchetes somente é considerado se o parâmetro (#X) conter um valor ou uma lista encadeada
{!#X, Expressão}
É o contrário do comando anterior, ou seja o segundo parâmetro nos colchetes somente é considerado se o parâmetro (#X) estiver vazio.
Expressão = Caracteres, parâmetros, funções e comandos
Exemplo:
%%<FunçãoExemplo('',0)%%>
Comando: {#1,'Não mostrará esta mensagem porque o primeiro parâmetro está vazio'};
Comando: {#2,'Mostrará porque o segundo parâmetro foi informado', Valor #2'}
Resultado: Mostrará porque o segundo parâmetro foi informado, Valor 0
Comando: {!#1,'Mostrará esta mensagem porque o primeiro parâmetro está vazio'}
Resultado: Mostrará esta mensagem porque o primeiro parâmetro está vazio
Comando: {!#2,'Não mostrará porque o segundo parâmetro foi informado', Valor #2'}
Resultado:
2) [ ]
Repetição para parâmetros do tipo lista encadeada. Sempre que um dos parâmetros de uma função for uma lista. Seus valores serão repetidos na área de máscara o número de vezes que possuir elementos.
Sintaxe [ Expressão ]
Expressão = Um caracter ou uma lista de caracteres (O caracter é repetido conforme o número de itens do parâmetro)
Expressão = Um parâmetro (Cada repetição corresponderá a um valor da lista encadeada)
Expressão = .X.. ou ..X. (Cada repetição o valor X irá ser incrementado ou decrementado)
Expressão = {#X,Expressão} (A expressão é retorna somente se o item de lista encadeada do parâmetro for preenchido)
Expressão = Funções, comandos
Exemplo:
%%<FunçãoExemplo([UM,DOIS,TRES],[DOIS,QUATRO,DEZ],['','',QUATRO])%%>
Função:
[[.1..) Total de: #1 + #1 é igual a #2 #3{- #3}]]
[]]
Resultado:
- Total de UM + UM é igual a DOIS
- Total de DOIS + DOIS é igual a QUATRO
- Total de TRÊS + TRÊS é igual a DEZ - QUATRO
3) [[][]]
Layout de saída para o comando de repetição de parâmetros do tipo lista encadeada.
Sintaxe [[ expressão ]caracter[ expressão ]caracter]
caracter = Qualquer caracter ou caracteres
Exemplo:
Comando: [[.1..) Total de: #1 + #1 é igual a #2];
[].]
Resultado:
- Total de UM + UM é igual a DOIS;
- Total de DOIS + DOIS é igual a QUATRO;
- Total de TRÊS + TRÊS é igual a SEIS.
Exemplos:
Comando: [[#1], []] Resultado: UM, DOIS, TRÊS Comando: [[#1], [#1 Terminou]] Resultado: UM, DOIS, TRÊS Terminou
1) <<Expressão, Expressão Antiga, Expressão Nova>>
Repassa em uma Texto a substring Antiga pela nova. Semelhante ao comando Replace de algumas linguagens.
Expressão = Caracteres, parâmetros, funções e comandos
Exemplo:
%%<FunçãoExemplo('O comando sysdate retorna a data')>%%
Comando: <<'#1','sysdate' ,'agora()'>>
Resultado: O comando agora() retorna a data Templates
1) Diretivas - {$IFDEF}
Permite criar códigos exclusivos de uma única linguagem em um mesmo template.
Sintaxe
{$IFDEF linguagem}
...
{$ENDIF}
linguagem = PL/SQL ou PL/pgSQL
2) Exemplo de template
/*-- SEQ 0001 --*/ -- Objetivo: -- 1) Obter o valor da cotacao de uma moeda num determinado dia %%<BeginFunction('Cambio','Real', ['pMOEDA','pDATA'], ['TD_MOE.CODTAB%TYPE','Date'], [ , ])>%% COTACAO real; BEGIN -- Moeda corrente do Pais IF pMOEDA = 0 THEN RETURN 1; ELSE -- Cria componentes temporarios SELECT nvl(VLRREF,0) INTO COTACAO FROM TT_CAM WHERE CODMOE = pMOEDA AND TO_CHAR(DATREF, %%<STR('DD/MM/YYYY')>%% ) = TO_CHAR(pDATA, %%<STR('DD/MM/YYYY')>%% );
RETURN nvl(COTACAO,0); END IF; {$IFDEF PL/SQL} EXCEPTION -- Provavelmente ocorrera se nao encontrar nenhum registro WHEN OTHERS THEN RETURN 0; {$ENDIF} %%<EndFunction('Cambio','Real',,)>%%
3) Resultado em Oracle
/*-- SEQ 0001 --*/ -- Objetivo: -- 1) Obter o valor da cotacao de uma moeda num determinado dia CREATE OR REPLACE FUNCTION Cambio (pMOEDA IN TD_MOE.CODTAB%TYPE , pDATA IN Date ) RETURN Real IS COTACAO real; BEGIN -- Moeda corrente do Pais IF pMOEDA = 0 THEN RETURN 1; ELSE -- Cria componentes temporarios SELECT COALESCE(VLRREF,0) INTO COTACAO FROM TT_CAM WHERE CODMOE = pMOEDA AND TO_CHAR(DATREF, 'DD/MM/YYYY' ) = TO_CHAR(pDATA, 'DD/MM/YYYY' ); RETURN COALESCE(COTACAO,0); END IF; EXCEPTION -- Provavelmente ocorrera se nao encontrar nenhum registro WHEN OTHERS THEN RETURN 0; END Cambio;
4) Resultado em PostGreSQL
/*-- SEQ 0001 --*/ -- Objetivo: -- 1) Obter o valor da cotacao de uma moeda num determinado dia CREATE OR REPLACE FUNCTION Cambio (TD_MOE.CODTAB%TYPE,Timestamp) RETURNS Real AS ' DECLARE pMOEDA ALIAS FOR $1 ; pDATA ALIAS FOR $2 ; COTACAO real; BEGIN -- Moeda corrente do Pais IF pMOEDA = 0 THEN RETURN 1; ELSE -- Cria componentes temporarios SELECT COALESCE(VLRREF,0) INTO COTACAO FROM TT_CAM WHERE CODMOE = pMOEDA AND TO_CHAR(DATREF, DD/MM/YYYY ) = TO_CHAR(pDATA, DD/MM/YYYY ); RETURN COALESCE(COTACAO,0); END IF; END;
' language 'plpgsql';