sábado, 26 de setembro de 2020

Parâmetros de Sessão - Alterando NLS da conexão

Fala, galera.

Hoje vamos falar um pouco sobre o NLS no Oracle.

Significado da sigla = National Language Suporte, como a própria descrição já sugere, nesses parâmetros é possível se efetuar as configurações de região e linguagem, abaixo vou compartilhar alguns testes que fiz onde faço alterações desses parâmetros apenas p/ a sessão em que estou conectado.

Consultando os parametros:


select * from v$nls_parameters;




 










Note nas configurações que a linguagem está setada p/ o americano, o que faz com que o resultado da query abaixo seja em inglês.

SELECT to_char(SYSDATE, 'Day') FROM dual;








Agora vou alterar o parâmetro  de idioma da minha sessão p/ português e vou executar a mesma query, vejam o resultado.

ALTER SESSION SET NLS_LANGUAGE = 'BRAZILIAN PORTUGUESE';






Também é possível alterarmos a formatação da data, pra essa sessão a configuração está no padrão americano, note o que acontece se eu tentar executar a query abaixo:

SELECT * FROM funcionarios WHERE dt_contratacao = '04/12/2017'










Pra essa query anterior funcionar, eu teria que usar uma formatação com um to_char, ou to_date, mas esse não é o intuito dos testes.

Agora vou alterar a configuração do formato da data pra minha sessão.

ALTER SESSION SET NLS_DATE_FORMAT = 'DD/MM/RRRR';

Executei a mesma query após a alteração do parâmetro de formatação de data.



Espero que tenham gostado.


Abs, 


Leonardo Silva.

Estudando para o exame de certificação Oracle Database SQL | 1Z0-071 - Utilizando funções de conversão e condicionais.

Fala, galera. Tudo bem?

Hoje vou falar um pouco sobre funções de conversão e funções condicionais.

Pode acontecer de precisarmos converter um tipo de dado p/ realizar algum procedimento, as vezes converter um formato de uma data, ou a formatação de um numero, lembre-se que essas conversões acontecem a nível de select, a nível da consulta que estivermos fazendo, e não a nível de banco de dados.

Pra ajudar na demonstração das funções, criarei a tabela abaixo.

CREATE TABLE funcionarios(id_func INT PRIMARY KEY
                                                  ,nm_func VARCHAR2(50)
                                                  ,dt_contratacao  DATE
                                                  ,vl_salario  NUMBER(16,2)
                                                  ,nm_departamento VARCHAR2(20))
/


INSERT INTO funcionarios VALUES(1, 'Antonio Pereira'  ,'04/12/2017', 5500, 'MANUTENCAO');
INSERT INTO funcionarios VALUES(2, 'Luiza Silva'      ,'10/02/2019', 7500, 'TECNOLOGIA');
INSERT INTO funcionarios VALUES(3, 'Ana Pereira'      ,'15/04/2010', 8000, 'LOGISTICA');
INSERT INTO funcionarios VALUES(4, 'Vinicius Pereira' ,'05/01/2018', 4300, 'MARKETING');
INSERT INTO funcionarios VALUES(5, 'Sergio Bavini'    ,'04/12/2017', 4000, 'RECURSOS HUMANOS')

/

COMMIT
/


Principais funções utilizadas p/ conversão de dados.

TO_NUMER() Converte caracteres p/ numérico, sendo necessário que o dado a ser convertido seja um número.
TO_DATE() Converte números ou caracteres p/ data.
TO_CHAR() Converte dados p/ caractere.

Conversão Implícita.

Acontece quando a literal é passada no mesmo tipo de dado da coluna da tabela, dessa maneira o próprio banco de dados faz  a conversão. 

Exemplos:

SELECT * FROM funcionarios
WHERE vl_salario > 5000









Outro exemplo utilizando um campo de data.

SELECT * FROM funcionarios
 WHERE dt_contratacao > '01/01/2019'


Conversão explicita, é quando na codificação você já informa pro banco de dados o tipo de dado que será utilizado p/ fazer a consulta. 

Exemplo:

SELECT *
  FROM funcionarios
 WHERE vl_salario > to_number(7000);






Vamos agora falar um pouco sobre a função to_char, essa função é necessária quando precisamos recuperar uma informação do banco e alterar sua formatação, alguns exemplos abaixo:

Formatações p/ campos de data.

YYYY - Ano em números
RRRR - Ano em números
YEAR - Ano escrito
MM - Dois dígitos para o mês
MONTH - Mês por escrito
MON - Três letras para abreviação do mês
DY - 3 letras para abreviação do dia da semana
DAY - Nome do dia da semana
DD - Dia

O primeiro campo no select está em sua formatação original, da maneira em que está gravado no banco de dados, as demais colunas demonstram as formatações citadas acima, essas formatações são Case Sensitive, ou seja, dependendo da maneira em que são escritas, o retorno virá em letras maiúsculas ou minusculas.

SELECT dt_contratacao
      ,to_char(dt_contratacao, 'YYYY') ano_numyy
      ,to_char(dt_contratacao, 'rrrr') ano_numrr
      ,to_char(dt_contratacao, 'Year') ano_escrito
      ,to_char(dt_contratacao, 'MM') mes2
      ,to_char(dt_contratacao, 'Month') mes_escrito
      ,to_char(dt_contratacao, 'MON') mes_3abrev
      ,to_char(dt_contratacao, 'DY') dd_3abrev
      ,to_char(dt_contratacao, 'DAY') Dia_sem
      ,to_char(dt_contratacao, 'DD') dia
  FROM funcionarios











Mais formatações possiveis p/ o to_char.

AM    - AM ou PM
CC    - Século
D     - Dia da semana (1-7)
DDD   - Dia do ano
DY    - Dia da semana abreviado ('SUN')
Ddspth - Dia por extenso
FM    - Tira os blanks ou Zeros da esquerda
HH    - Hora do dia (0-12)
HH24  - Hora do dia (0-24)
MI    - Minutos da Hora
MM    - Mês com 2 dígitos
PM    - AM ou PM
RR    - Ano com 2 dígitos - especial
RRRR  - Ano com 4 dígitos
SS    - Segundos do minuto(0 - 59)
SSSSS - Segundos do dia
W     - Semana do Mês
WW    - Semana do Ano
YY    - Ano com 2 dígitos

Mais alguns exemplos de formatação de datas:

SELECT f.dt_contratacao
      ,TO_CHAR(f.dt_contratacao, 'fmDD Month YYYY')AS dt_contratacao       
      ,'Hoje é dia: ' || TO_CHAR(TRUNC(SYSDATE), 'fmDD Month YYYY') || ' ' ||
       'E são exatamente ' || TO_CHAR(SYSDATE, 'hh24:mi:ss') || ' ' ||
       'da' || TO_CHAR(SYSDATE, 'Am')  AS dia_corrente
  FROM funcionarios f;



Agora uns exemplos de formatações de números.

Formatações possíveis.

9 determina a largura de exibição 9999 = 1234
0 exibe zeros a esquerda 09999 = 01234
$ Exibe o dólar = $1234
L Exibe a moeda L9999 = R$1234
D Caractere decimal 9999D = 1234,
. Mostra uma virgula ou ponto 9999.99  = 1234.00
G Separado de grupos 999G9 = 123.4
, Ponto / virgula na posição 999,9 = 123,4
MI Sinal negativo à direita* 9999MI = 1234-*
PR põe valores negativos entre <>* 9999PR = <1234>*
EEEE informa no padrão cientifico 9999EEEE = 1E+03
U Símbolo monetário
S Informa o sinal S9999 = +1234
B Troca valores zero por vazio** B9999 = ‘ ‘ ** 

Alguns exemplos:

SELECT vl_salario
      ,to_char(vl_salario, '999G999G999G999D99')  vl_salario
      ,to_char(vl_salario, 'S999G999G999G999D99') vl_salarioSinal
      ,to_char(vl_salario, 'L999G999G999G999D99') vl_salariomoeda           
      ,to_char(-1234.22, 'B999G999G999G999D99PR') vl_negativo
      ,to_char(-1234.22, 'B999G999G999G999D99MI') vl_sinnegativo     
  FROM funcionarios f




Bom, espero que tenham gostado.


Abs.


Leonardo Silva.

quinta-feira, 17 de setembro de 2020

Estudando para o exame de certificação Oracle Database SQL | 1Z0-071 - Utilizando funções simples(Single Row Functions) Cont.

Fala, galera. Tudo bem?

Continuando com o assunto de funções simples(Single Row Functions), resolvi quebrar o artigo em dois, pra deixar as funções de datas separadas, funções essas que são extremamente utilizadas por nós que trabalhamos com Oracle.

Função SYSDATE

Função pra retornar a data e hora atual do servidor.

SELECT SYSDATE FROM dual;








Função CURRENT_DATE

Mais uma função pra retornar data, a diferença do current_date p/ o sysdate é que a função current_date retorna a data e hora de acordo com o fuso horário da sessão do usuário.

SELECT current_date FROM dual;


Somando dias em datas.

Toda data quando adicionamos ou subtraimos um número, c/ isso alteramos a data em quantidade de dias, exemplo:

SELECT SYSDATE
               ,SYSDATE + 5 
               ,SYSDATE -30
    FROM dual;


Podemos também subtrair (data - data)
Obs: Menos de 100 dias p/ o natal...rs

SELECT SYSDATE, (TRUNC(SYSDATE) - TO_DATE('25/12/2020')) FROM DUAL;








Outra coisa legal que da pra fazer com as funções de datas é, suponhamos que você precise saber  quantas semanas um determinado funcionário está trabalhando na sua empresa, utilizando a data de contratação, conseguimos calcular a quantidade de semanas:

Dt_Contratacao = 04/12/2017
Conta = Data atual - Dt_Contratacao/ 7 (Quantidade de dias que tem uma semana)

145 semanas é o resultado.

SELECT (TRUNC(SYSDATE) - to_date('04/12/2017','dd/mm/rrrr') )/7 FROM DUAL;


Agora mais algumas coisas que da pra fazer com as datas/ horas.

Caso seja necessário somar uma quantidade de minutos, ou menos segundos a uma data, basta fazer as contas e aplicar, exemplos.

Adicionando 5 minutos a uma data/ hora, basta colocarmos 5/1440 que é a quantidade de minutos que temos em um dia (1440/60) = 24.

SELECT TO_CHAR(SYSDATE,'DD/MM/YYYY HH24:MI:SS') Hora_Atual,
               TO_CHAR(SYSDATE + 5/1440, 'DD/MM/YYYY HH24:MI:SS') "Hora+5min"
  FROM DUAL;









Função ADD_MONTHS, muito utilizada, adiciona ou subtrai meses a uma data desejada.

SELECT TRUNC(SYSDATE) dt_atual
              ,add_months(TRUNC(SYSDATE),2) "+2 Meses"
             ,add_months(TRUNC(SYSDATE),-2) "-2 Meses"
  FROM DUAL;









Função MONTHS_BETWEEN, traz a quantidade de meses entre uma data e outra.

SELECT TRUNC(SYSDATE) dt_atual
              ,months_between(to_Date('17/01/2021','dd/mm/rrrr'), TRUNC(SYSDATE)) meses
 FROM DUAL;








Função NEXT_DAY, traz pra você o próximo dia da semana, conforme parâmetro especificado.

SELECT NEXT_DAY(SYSDATE,'SEGUNDA') "NEXT DAY"
  FROM DUAL;








Obs: a função acima só respeita o português, devido as variáveis de ambiente do banco ao qual eu estou trabalhando estarem configuradas p/ o português, caso contrario, parâmetros deverão ser informados em inglês. 

Função Last_Day, retorna o ultimo dia do mês.

SELECT LAST_DAY(SYSDATE) FROM DUAL;








Outros exemplos, o round arredondou a data p/ cima, e o trunc p/ baixo.

SELECT ROUND(SYSDATE, 'MONTH')
             ,TRUNC(SYSDATE, 'MONTH')
   FROM DUAL;









Ultimo ponto, a nível de curiosidade.

Trabalhando com as mascaras YYYY x RRRR

Quando temos a data armazenada com o ano com 4 dígitos não há diferença entre as mascaras.

Você só vai notar diferença entre essas mascaras, caso esteja utilizando datas com formação de ano com 2 dígitos, exemplos abaixo:

SELECT to_date('01-jan-77','dd/mm/rrrr') FROM dual








Agora utilizando a mesma data, porém com a mascara YYYY

SELECT to_date('01-jan-77','dd/mm/yyyy') FROM dual


Por que isso ocorre?

Se a data tem apenas dois dígitos e utilizamos a formatação YYYY, o banco sempre vai assumir os dois dígitos iniciais 00, conforme exemplo abaixo.

SELECT to_date('01-jan-01','dd/mm/yyyy') dt1
               ,to_date('01-jan-49','dd/mm/yyyy') dt2
               ,to_date('01-jan-50','dd/mm/yyyy') dt3
               ,to_date('01-jan-99','dd/mm/yyyy') dt4
   FROM dual











Utilizando o RRRR, o banco aplica a seguinte regra, se o ano estiver entre 00 e 49 assume o século atual, se estiver entre 50 e 99, assume o século anterior;

SELECT to_date('01-jan-01','dd/mm/rrrr') dt1
               ,to_date('01-jan-49','dd/mm/rrrr') dt2
               ,to_date('01-jan-50','dd/mm/rrrr') dt3
               ,to_date('01-jan-99','dd/mm/rrrr') dt4
   FROM dual











Bom, espero que tenham gostado.

Um abraço.

Leonardo Silva.


terça-feira, 15 de setembro de 2020

Estudando para o exame de certificação Oracle Database SQL | 1Z0-071 - Utilizando funções simples(Single Row Functions)

Fala, galera!

Tudo bem?

Continuando os estudos preparatórios p/ realizar o exame 1Z0-071, hoje vou falar um pouco sobre a utilização de algumas funções que ajudam muito no dia dia.

Single Row Functions (Funções de uma unica linha), o que significa que se o retorno do seu select tiver 1000 linhas, as funções serão executadas linha a linha.

O que podemos fazer com esse tipo de função:

Manipular dados, efetuar cálculos, alterações formatações de dados.. e etc;

P/ nos auxiliar nos exercícios criarei a seguinte tabela: 

CREATE TABLE vendedores(cod_vendedor INT PRIMARY KEY
                                                 ,nm_vendedor VARCHAR2(100)
                                                 ,dt_contratacao DATE
                                                ,vl_comissao NUMBER (16,2))
 /

INSERT INTO vendedores VALUES(1, 'Ana Paula', '01-jan-2020', 100);
INSERT INTO vendedores VALUES(2, 'Luiza Silva', '01-Fev-2020', 400);
INSERT INTO vendedores VALUES(3, 'Antonio Pereira', '17-jan-2020', 150);
INSERT INTO vendedores VALUES(4, 'Olivia Silva', '15-Mai-2020', 1100);
INSERT INTO vendedores VALUES(5, 'Thais Rodrigues', '16-Mar-2020', 100)

/

COMMIT
/

Vamos começar trabalhar com as funções de manipulação de caracteres.

Função UPPER, transforma p/ todo o conteúdo do campo p/ letras maiúsculas

SELECT nm_vendedor, UPPER(nm_Vendedor) "Upper" FROM vendedores;


Função LOWER, transforma p/ todo o conteúdo do campo p/ letras minusculas.

SELECT nm_vendedor, LOWER(nm_Vendedor) "LOWER" FROM vendedores;

As funções Upper e Lower também podem ser utilizadas no where do select auxiliando na recuperação dos dados, por exemplo, se eu quero recuperar um dos registros utilizando a coluna nm_vendedor no meu where, eu preciso passar os dados exatamente como estão preenchidos na coluna, caso o contrario o registro não será encontrado, ex:

O select abaixo não retornou nenhum registro devido ao parâmetro não estar igual ao dado preenchido na coluna.

SELECT * FROM vendedores WHERE nm_vendedor = 'ana paula';

Nós podemos utilizar uma das funções p/ efetuar a busca do dado, aqui eu converto o campo p/ letras minusculas, e isso me possibilita encontrar o dado, o mesmo pode ser feito com a função Upper.

SELECT * FROM vendedores WHERE LOWER(nm_vendedor)= 'ana paula';


Função Initcap, transforma a primeira letra das literais em maisuculas:

SELECT INITCAP('vendedor: '|| nm_vendedor) "INITCAP" FROM vendedores;

Funcão concat, onde ao invés de utilizar as barras(||) para concatenação, podemos utilizar a função concat, essa função não te da a opção de colocar nada entre as colunas, ela simplesmente junta os dados.

SELECT CONCAT(nm_vendedor, dt_contratacao) FROM vendedores;

Função Length, essa função efetua a contagem de caracteres na coluna, função muito utilizada no dia a dia.

SELECT LENGTH(nm_vendedor), nm_vendedor FROM vendedores;

Função Instr, essa função retorna a posição que encontrou o caractere que foi passado via parâmetro.

SELECT INSTR(nm_vendedor, 'a'), nm_vendedor FROM vendedores;

Função Substr, mais uma função que é bastante utilizada, a mesma recebe dois parâmetros, onde o primeiro parâmetro define o inicio da leitura do campo, e o segundo define a quantidade de caracteres que deve ser retornado, no exemplo abaixo, pedi p/ retornar a partir da primeira posição 5 caracteres.

SELECT SUBSTR(nm_vendedor, 1,5), nm_vendedor FROM vendedores;

Outras maneiras de se utilizar é passando apenas um parâmetro, dessa maneira a função irá retornar todo o restante do campo a partir do parâmetro que foi informado. 

SELECT SUBSTR(nm_vendedor, 5), nm_vendedor FROM vendedores;

Podemos também utilizar o parâmetro com numeração negativa.
Quando utilizamos o Substr com parametrização negativa, a função trabalha com os caracteres de trás para frente.

Tome cuidado p/ não ultrapassar a quantidade de caracteres existentes no campo, caso contrario a função não irá retornar dado nenhum.

Podemos passar apenas o parâmetro negativo e desta maneira a função irá trazer apenas a quantidade parametrizada e isso de trás pra frente.

SELECT SUBSTR(nm_vendedor, -3), nm_vendedor FROM vendedores;

Quando utilizamos dois parâmetros, a função retorna os caracteres definidos a partir do primeiro parâmetro e isso de trás pra frente, meio confuso, mas creio que com o print fico mais tranquilo de entender.

SELECT SUBSTR('abcdefg',-5,2) FROM dual; (A partir da 5º posição de trás pra frente, traga 2 caracteres);


Função Replace, usada p/ substituir dados dos campos, no exemplo abaixo, eu parametrizo a função de maneira que substituia toda a letra "A", pela letra "B"

SELECT nm_vendedor, REPLACE(nm_vendedor, 'A', 'B') FROM vendedores;

Função LPAD e RPAD, usamos estas p/ complementação de caracteres, no exemplo abaixo eu deixo o meu campo c/ 20 caracteres, completando a informação já existente com a letra "A"

Utilizando o LPAD os dados são complementados a esquerda (left), no caso do RPAD, vão p/ a direita, (right).

SELECT nm_vendedor
              ,LPAD(nm_vendedor, 20, 'A')
              ,RPAD(nm_vendedor, 20, 'A')
   FROM vendedores;


Funções numéricas.

As funções Round e Trunc podem ser utilizadas em campos numéricos e de data, mas só vou abordar a aplicação das funções em campos numéricos.

Função round, como o próprio nome já sugere, utilizada p/ fazer arredondamentos de valores, p/ demonstrar a utilização dessa função irei inserir mais dois registros na tabela.

INSERT INTO vendedores VALUES(6, 'Maick Sousa', '15-Mai-2020', 110.57);
INSERT INTO vendedores VALUES(7, 'Rubens Sousa', '16-Mar-2020', 95.42)
/

COMMIT

No exemplo abaixo, utilizo a função sem informar nenhum parâmetro, o round sempre irá arredondar os valores arredondando para cima caso a decima seja maior ou igual a 5, se for menor, arredonda p/ baixo.

SELECT nm_vendedor, vl_comissao, ROUND(vl_comissao) "Round" FROM vendedores WHERE cod_vendedor IN(6,7);


Utilizando com parâmetro, o mesmo indica o valor que será utilizado para efetuar o arredondamento, ou seja, no exemplo abaixo 1 casa após a virgula da esquerda p/ a direita.

SELECT nm_vendedor
              ,vl_comissao
             ,ROUND(vl_comissao,1) "Round" 
  FROM vendedores WHERE cod_vendedor IN(6,7);

No exemplo abaixo, passei 2 como parâmetro para a função, ou seja, usa como fator p/ arredondamento a segunda casa após a virgula.

SELECT nm_vendedor
              ,vl_comissao
              ,ROUND(vl_comissao,2) "Round" 
  FROM vendedores WHERE cod_vendedor IN(6,7);

O parâmetro também pode ser usado com numero negativo, o que fará a inversão do fator de arredondamento, ou seja, no exemplo abaixo, será o primeiro campo após a virgula da direita para a esquerda.

 SELECT ROUND(110.57,-1) "Round(-)" FROM dual

Ajustando o parametro p/ -2

 SELECT ROUND(110.57,-2) "Round(-)" FROM dual


Função Trunc, essa função realiza uma operação de truncamento em valores numéricos com base em uma precisão determinada, que assim como a função round também é opcional.

A diferença do Trunc p/ o Round é que no caso do Trunc não há arredondamentos a função simplesmente quebra o valor, sem arredondar nem pra cima e nem pra baixo. Alguns exemplos abaixo.

SELECT nm_vendedor
              ,vl_comissao
             ,TRUNC(vl_comissao) "TRUNC" 
  FROM vendedores WHERE cod_vendedor IN(6,7);


Utilizando o parâmetro de precisão:

SELECT nm_vendedor
               ,vl_comissao
               ,TRUNC(vl_comissao,1) "TRUNC" 
    FROM vendedores WHERE cod_vendedor IN(6,7);


No caso do valor de precisão ser negativo, a função fará a leitura da direita p/  a esquerda, no caso abaixo, o numero 9 será o valor de precisão.

SELECT TRUNC(159.35,-1) FROM dual


Função MOD, essa função traz a sobra de uma divisão.

No exemplo abaixo, se divimos 1000/3, temos uma sobra de 1.

SELECT MOD(1000,3) FROM dual;









Estudando para o exame de certificação Oracle Database SQL | 1Z0-071 - Comando Merge

Fala, galera. Tudo bem? Hoje vou falar um pouco sobre o comando MERGE. O MERGE é um comando DML que combina as funções de insert, update e d...