🔄 MacroTranslator: Documentação de Macros Sankhya
🔄 MacroTranslator: Documentação de Macros Sankhya
Esta documentação descreve todas as macros suportadas pelo framework de persistência da Sankhya, explicando propósito, sintaxe, diferenças entre Oracle e MSSQL, e exemplos práticos.
🤔 Por que usar macros?
O uso do Macros Sankhya traz diversas vantagens, especialmente quando se busca portabilidade e manutenção de consultas SQL entre Oracle e MSSQL:
- ✅ Unificação de Sintaxe: Permite escrever consultas SQL de forma unificada, abstraindo diferenças de sintaxe e funções entre Oracle e MSSQL. Isso reduz a necessidade de duplicar código ou criar ramificações específicas para cada banco.
- ✅ Redução de Erros: Ao centralizar as diferenças em macros bem definidas, diminui-se o risco de erros causados por adaptações manuais ou esquecimentos de detalhes específicos da sintaxe de cada banco.
- ✅ Facilidade de Manutenção: Alterações em regras de negócio ou ajustes de queries podem ser feitas em um único ponto, sem a necessidade de revisar múltiplas versões da mesma consulta.
- ✅ Melhoria na Legibilidade: As macros tornam as consultas mais legíveis e expressivas, permitindo que o foco esteja na lógica de negócio em vez de detalhes técnicos de cada banco.
Índice
- ignorecase
- normalizeText
- nullValue
- convertToNumber
- maxLines
- yearMonth
- dbDate
- stringIndex
- trim
- length
- diffdays
- diffhour
- concatstr
- quebraLinha
- convertPtBrDate
- onlydate
- truncWeek
- truncMonth
- truncQarter
- truncYear
- truncDate
- convertToFloat
- convertToVarchar
- user.name
- sqldatabase
- leftPad
- subString
- upperText
- getMonth
- getYear
- getDay
- monYear
- addMonths
- endOfCurrentMonth
- convertToTimestamp
- convertToMilliseconds
ignorecase
Propósito: Normaliza texto para comparação sem considerar maiúsculas/minúsculas e acentuação.
Sintaxe:
ignorecase(<expressão>)Oracle:
TRANSLATE(UPPER(<expressão>),'ÁÉÍÓÚÃÕÂÊÎÔÛÀÈÌÒÙÇ','AEIOUAOAEIOUAEIOUC')MSSQL:
REPLACE(UPPER(<expressão>),'ÁÉÍÓÚÃÕÂÊÎÔÛÀÈÌÒÙÇ','AEIOUAOAEIOUAEIOUC')Exemplo:
ignorecase(NOME)Exemplo de consulta:
SELECT * FROM CLIENTES WHERE ignorecase(NOME) = ignorecase('José');normalizeText
Propósito: Remove acentuação e normaliza texto para comparação.
Sintaxe:
normalizeText(<expressão>)Oracle:
CONVERT(UPPER(<expressão>), 'US7ASCII')MSSQL:
REPLACE(UPPER(<expressão>),'ÁÉÍÓÚÃÕÂÊÎÔÛÀÈÌÒÙÇ','AEIOUAOAEIOUAEIOUC')Exemplo:
normalizeText(NOME)Exemplo de consulta:
SELECT * FROM CLIENTES WHERE normalizeText(NOME) LIKE normalizeText('%silva%');nullValue
Propósito: Substitui valores nulos por um valor padrão.
Sintaxe:
nullValue(<expressão>, <valor padrão>)Oracle:
NVL(<expressão>, <valor padrão>)MSSQL:
ISNULL(<expressão>, <valor padrão>)Exemplo:
nullValue(SALARIO, 0)Exemplo de consulta:
SELECT nullValue(SALARIO, 0) AS SALARIO_CORRIGIDO FROM FUNCIONARIOS;convertToNumber
Propósito: Converte expressão para número.
Sintaxe:
convertToNumber(<expressão>)Oracle:
TO_NUMBER(<expressão>)MSSQL:
CONVERT(NUMERIC, <expressão>)Exemplo:
convertToNumber(VALOR)Exemplo de consulta:
SELECT convertToNumber(PRECO) FROM PRODUTOS WHERE convertToNumber(PRECO) > 100;maxLines
Propósito: Limita o número de linhas retornadas.
Sintaxe:
maxLines(<quantidade>)Oracle:
AND ROWNUM <= <quantidade>MSSQL:
TOP <quantidade>Exemplo:
maxLines(10)Exemplo de consulta:
SELECT maxLines(10) * FROM VENDAS ORDER BY DATA DESC;yearMonth
Propósito: Retorna o ano e mês de uma data no formato YYYYMM.
Sintaxe:
yearMonth(<campo>)Oracle:
(TO_NUMBER(TO_CHAR(<campo>,'YYYYMM')))MSSQL:
(YEAR(<campo>) * 100) + MONTH(<campo>)Exemplo:
yearMonth(DATA)Exemplo de consulta:
SELECT yearMonth(DATA_VENDA) AS ANO_MES FROM VENDAS;dbDate
Propósito: Retorna a data atual do banco.
Sintaxe:
dbDate()Oracle:
SYSDATEMSSQL:
GETDATE()Exemplo:
dbDate()Exemplo de consulta:
SELECT dbDate() AS DATA_ATUAL;stringIndex
Propósito: Retorna a posição de uma substring dentro de uma string.
Sintaxe:
stringIndex(<src>, <trg>)Oracle:
INSTR(<src>, <trg>)MSSQL:
CHARINDEX(<trg>, <src>)Exemplo:
stringIndex('abcde', 'cd')Exemplo de consulta:
SELECT stringIndex(NOME, 'A') AS POSICAO FROM CLIENTES;trim
Propósito: Remove espaços em branco das extremidades.
Sintaxe:
trim(<expressão>)Oracle:
TRIM(<expressão>)MSSQL:
LTRIM(RTRIM(<expressão>))Exemplo:
trim(NOME)Exemplo de consulta:
SELECT trim(NOME) FROM CLIENTES;length
Propósito: Retorna o tamanho de uma string.
Sintaxe:
length(<expressão>)Oracle:
LENGTH(<expressão>)MSSQL:
DATALENGTH(<expressão>)Exemplo:
length(NOME)Exemplo de consulta:
SELECT length(NOME) AS TAMANHO FROM CLIENTES;diffdays
Propósito: Calcula a diferença em dias entre duas datas.
Sintaxe:
diffdays(<data1>, <data2>)Oracle:
TRUNC(<data1> - <data2>)MSSQL:
DATEDIFF(DAY, <data2>, <data1>)Exemplo:
diffdays(DATA_FIM, DATA_INICIO)Exemplo de consulta:
SELECT diffdays(DATA_FIM, DATA_INICIO) AS DIAS FROM PROJETOS;diffhour
Propósito: Calcula a diferença em horas entre duas datas.
Sintaxe:
diffhour(<data1>, <data2>)Oracle:
((<data1> - <data2>) * 24)MSSQL:
DATEDIFF(HOUR, <data2>, <data1>)Exemplo:
diffhour(DATA_FIM, DATA_INICIO)Exemplo de consulta:
SELECT diffhour(DATA_FIM, DATA_INICIO) AS HORAS FROM TAREFAS;concatstr
Propósito: Concatena duas strings.
Sintaxe:
concatstr(<str1>, <str2>)Oracle:
<str1> || <str2>MSSQL:
<str1> + <str2>Exemplo:
concatstr('A', 'B')Exemplo de consulta:
SELECT concatstr(NOME, SOBRENOME) AS NOME_COMPLETO FROM CLIENTES;quebraLinha
Propósito: Insere uma quebra de linha.
Sintaxe:
quebraLinha()Oracle:
CHR(13)||CHR(10)MSSQL:
CHAR(13)+CHAR(10)Exemplo:
quebraLinha()Exemplo de consulta:
SELECT NOME || quebraLinha() || ENDERECO AS DADOS FROM CLIENTES;convertPtBrDate
Propósito: Converte data para formato brasileiro (DD/MM/YYYY).
Sintaxe:
convertPtBrDate(<data>)Oracle:
TO_CHAR(<data>, 'DD/MM/YYYY')MSSQL:
CONVERT(VARCHAR, <data>, 103)Exemplo:
convertPtBrDate(DATA)Exemplo de consulta:
SELECT convertPtBrDate(DATA_NASCIMENTO) AS DATA_BR FROM CLIENTES;onlydate
Propósito: Retorna apenas a parte da data (sem hora).
Sintaxe:
onlydate(<data>)Oracle:
TRUNC(<data>)MSSQL:
DATEADD(DAY, DATEDIFF(DAY, 0, <data>), 0)Exemplo:
onlydate(DATA)Exemplo de consulta:
SELECT onlydate(DATA_VENDA) AS DATA_SEM_HORA FROM VENDAS;truncWeek
Propósito: Retorna o início da semana da data.
Sintaxe:
truncWeek(<data>)Oracle:
TRUNC(<data>, 'IW')MSSQL:
CONVERT(DATE, DATEADD(DAY, -1, DATEADD(WK, DATEDIFF(WK, 0, <data> ), 0)), 103)Exemplo:
truncWeek(DATA)Exemplo de consulta:
SELECT truncWeek(DATA) AS INICIO_SEMANA FROM CALENDARIO;truncMonth
Propósito: Retorna o início do mês da data.
Sintaxe:
truncMonth(<data>)Oracle:
TRUNC(<data>, 'MM')MSSQL:
CONVERT(DATE, DATEADD(DAY, (DATEPART(DAY, <data>) * -1) + 1, <data>), 103)Exemplo:
truncMonth(DATA)Exemplo de consulta:
SELECT truncMonth(DATA) AS INICIO_MES FROM CALENDARIO;truncQarter
Propósito: Retorna o início do trimestre da data.
Sintaxe:
truncQarter(<data>)Oracle:
TRUNC(<data>, 'Q')MSSQL:
CONVERT(DATE, DATEADD(QQ, DATEDIFF(QQ, 0, <data>), 0), 103)Exemplo:
truncQarter(DATA)Exemplo de consulta:
SELECT truncQarter(DATA) AS INICIO_TRIMESTRE FROM CALENDARIO;truncYear
Propósito: Retorna o início do ano da data.
Sintaxe:
truncYear(<data>)Oracle:
TRUNC(<data>, 'YY')MSSQL:
CONVERT(DATE, DATEADD(YY, DATEDIFF(YY, 0, <data>), 0), 103)Exemplo:
truncYear(DATA)Exemplo de consulta:
SELECT truncYear(DATA) AS INICIO_ANO FROM CALENDARIO;truncDate
Propósito: Retorna apenas a parte da data (sem hora).
Sintaxe:
truncDate(<data>)Oracle:
TRUNC(<data>)MSSQL:
CONVERT(date, <data>)Exemplo:
truncDate(DATA)Exemplo de consulta:
SELECT truncDate(DATA) AS DATA_SEM_HORA FROM CALENDARIO;convertToFloat
Propósito: Converte expressão para float.
Sintaxe:
convertToFloat(<expressão>)Oracle:
<expressão>MSSQL:
CONVERT(FLOAT, <expressão>)Exemplo:
convertToFloat(VALOR)Exemplo de consulta:
SELECT convertToFloat(PRECO) FROM PRODUTOS;convertToVarchar
Propósito: Converte expressão para varchar.
Sintaxe:
convertToVarchar(<expressão>)Oracle:
TO_CHAR(<expressão>)MSSQL:
CONVERT(VARCHAR, <expressão>)Exemplo:
convertToVarchar(VALOR)Exemplo de consulta:
SELECT convertToVarchar(CODIGO) FROM PRODUTOS;user.name
Propósito: Insere o nome do usuário/banco.
Sintaxe:
${user.name}Oracle:
<usuário>MSSQL:
<usuário>.Exemplo:
SELECT * FROM ${user.name}TABELAExemplo de consulta:
SELECT * FROM ${user.name}CLIENTES;sqldatabase
Propósito: Insere o nome do banco.
Sintaxe:
sqldatabase.<tabela>Oracle:
<tabela>MSSQL:
<usuário>.<tabela>Exemplo:
SELECT * FROM sqldatabase.TABELAExemplo de consulta:
SELECT * FROM sqldatabase.CLIENTES;leftPad
Propósito: Preenche à esquerda até o tamanho desejado.
Sintaxe:
leftPad(<coluna>, <caractere>, <tamanho>)Oracle:
LPAD(<coluna>, <tamanho>, <caractere>)MSSQL:
RIGHT(REPLICATE(<caractere>, <tamanho>) + <coluna>, <tamanho>)Exemplo:
leftPad('123', '0', 5)Exemplo de consulta:
SELECT leftPad(CODIGO, '0', 8) AS CODIGO_PAD FROM PRODUTOS;subString
Propósito: Retorna parte de uma string.
Sintaxe:
subString(<coluna>, <início>, <fim>)Oracle:
SUBSTR(<coluna>, <início>, <fim>)MSSQL:
SUBSTRING(<coluna>, <início>, <fim>)Exemplo:
subString('abcdef', 2, 3)Exemplo de consulta:
SELECT subString(NOME, 1, 5) AS PRIMEIRAS_LETRAS FROM CLIENTES;upperText
Propósito: Converte texto para maiúsculas.
Sintaxe:
upperText(<expressão>)Oracle:
UPPER(<expressão>)MSSQL:
UPPER(RTRIM(CONVERT(VARCHAR(4000),<expressão>)))Exemplo:
upperText(NOME)Exemplo de consulta:
SELECT upperText(NOME) AS NOME_MAIUSCULO FROM CLIENTES;getMonth
Propósito: Retorna o mês de uma data.
Sintaxe:
getMonth(<data>)Oracle:
TO_CHAR(<data>, 'MM')MSSQL:
MONTH(<data>)Exemplo:
getMonth(DATA)Exemplo de consulta:
SELECT getMonth(DATA_NASCIMENTO) AS MES_NASC FROM CLIENTES;getYear
Propósito: Retorna o ano de uma data.
Sintaxe:
getYear(<data>)Oracle:
TO_CHAR(<data>, 'YYYY')MSSQL:
YEAR(<data>)Exemplo:
getYear(DATA)Exemplo de consulta:
SELECT getYear(DATA_NASCIMENTO) AS ANO_NASC FROM CLIENTES;getDay
Propósito: Retorna o dia de uma data.
Sintaxe:
getDay(<data>)Oracle:
TO_CHAR(<data>, 'DD')MSSQL:
DAY(<data>)Exemplo:
getDay(DATA)Exemplo de consulta:
SELECT getDay(DATA_NASCIMENTO) AS DIA_NASC FROM CLIENTES;monYear
Propósito: Retorna mês e ano de uma data.
Sintaxe:
monYear(<data>)Oracle:
TO_CHAR(<data>, 'MM/YYYY')MSSQL:
FORMAT(<data>, 'MM/yyyy')Exemplo:
monYear(DATA)Exemplo de consulta:
SELECT monYear(DATA_NASCIMENTO) AS MES_ANO FROM CLIENTES;addMonths
Propósito: Soma meses a uma data.
Sintaxe:
addMonths(<data>, <quantidade>)Oracle:
ADD_MONTHS(<data>, <quantidade>)MSSQL:
DATEADD(MONTH, <quantidade>, <data>)Exemplo:
addMonths(DATA, 2)Exemplo de consulta:
SELECT addMonths(DATA_VENDA, 3) AS DATA_FUTURA FROM VENDAS;endOfCurrentMonth
Propósito: Retorna o último dia do mês atual.
Sintaxe:
endOfCurrentMonth()Oracle:
LAST_DAY(SYSDATE)MSSQL:
EOMONTH(GETDATE())Exemplo:
endOfCurrentMonth()Exemplo de consulta:
SELECT endOfCurrentMonth() AS FIM_MES_ATUAL;convertToTimestamp
Propósito: Converte expressão para timestamp.
Sintaxe:
convertToTimestamp(<expressão>)Oracle:
TO_TIMESTAMP(<expressão>)MSSQL:
CONVERT(DATETIME, <expressão>)Exemplo:
convertToTimestamp(DATA)Exemplo de consulta:
SELECT convertToTimestamp(DATA) AS DATA_TIMESTAMP FROM LOGS;convertToMilliseconds
Propósito: Converte expressão para milissegundos.
Sintaxe:
convertToMilliseconds(<expressão>)Oracle:
EXTRACT(MILLISECOND FROM <expressão>)MSSQL:
DATEPART(MILLISECOND, <expressão>)Exemplo:
convertToMilliseconds(DATA)Exemplo de consulta:
SELECT convertToMilliseconds(DATA) AS MILIS FROM LOGS;Updated about 2 hours ago
