domingo, 6 de agosto de 2017

Oracle - Substituir resultado nulo ou vazio por uma String

Olá!

Observe a tabela abaixo:
PESSOA
CD_PESSOANOMESOBRENOMEIDADE
1FelipeBarbosa23
2Ananullnull
3JoãoSantosnull
4Alinenull21
5Maira
25
6Ana
null
7AlineFerreira22

Veja que nas colunas SOBRENOME e IDADE há valores nulos, e também está presente alguns registros com o sobrenome vazio (lembre-se vazio é diferente de null).

Com a execução do SQL:

SELECT NOME
, SOBRENOME
, IDADE
FROM PESSOA;

Conseguimos facilmente retornar os valores contidos na tabela PESSOA. Entretanto, o usuário irá visualizar os seguintes dados:

Resultado:
NOMESOBRENOMEIDADE
FelipeBarbosa23
Ananullnull
JoãoSantosnull
Alinenull21
Maira
25
Ana
null
AlineFerreira22

Note que sem realizar o tratamento dos dados, estamos cometendo um ERRO ao apresentar null para o usuário.

  • Solução. Realizar tratamento de nulidade e valores vazios.
No banco de dados (DB) Oracle temos a função NVL() para realizar o tratamento do resultado nulo ou vazio de uma expressão.

Sintaxe:
NVL(expressão, 'texto para substituição')

Ou seja, o primeiro argumento da função é uma expressão que pode ser uma coluna, o resultado de outra função, etc. Já o segundo argumento é uma string (texto qualquer) que você queira que seja apresentado quando o primeiro argumento seja nulo ou vazio.

Exemplos:

1) - NVL('Felipe', 'Ana')
Resultado: Felipe


2) - NVL('', 'Ana')
Resultado: Ana


3) - NVL(null, 'Ana')
Resultado: Ana


4) - Agora vamos usar a função no nosso primeiro SQL:
SELECT NOME
, NVL(SOBRENOME, 'Não cadastrado')
, NVL(IDADE, 'Não cadastrado')
FROM PESSOA;

Resultado:
NOMESOBRENOMEIDADE
FelipeBarbosa23
AnaNão cadastradoNão cadastrado
JoãoSantosNão cadastrado
AlineNão cadastrado21
MairaNão cadastrado25
AnaNão cadastradoNão cadastrado
AlineFerreira22

De forma prática realizamos a substituição de dados nulos e vazios para o valor 'Não cadastrado', assim retornando ao usuário uma resposta legível.

Consultar a relação de Termos e Abreviaturas acesse aqui.
FELIPE BARBOSA FERREIRA

Até o próximo post!

sábado, 27 de maio de 2017

Timestamp Oracle

Olá!

O tipo de dado (data_type) TIMESTAMP no banco de dados (db) Oracle armazena a combinação de data e hora. De modo que os formatos aceitos em uma instrução SQL para a manipulação desse tipo de dado, são:
  • yyyy-mm-dd hh:mm:ss[.nnnnnn] 
  • yyyy-mm-dd-hh.mm.ss[.nnnnnn] 

Sendo que para cada item do timestamp há as regras:
  • yyyy - Ano 
    • Sempre deve possuir quatro dígitos 
  • mm, dd, hh - Mês, Dia, Hora 
    • Podem possuir de um a dois dígitos. Ou seja, para os números de 1 até 9 não é necessário usar o zero à esquerda. 
  • mm, ss - Minutos, Segundos 
    • Sempre devem possuir dois dígitos. Note que a representação (mm) dos minutos também é a mesma utilizada para o mês, na função to_timestamp os minutos são representados por (mi). 
  • nnnnnn - Nanossegundos 
    • São opcionais, mas se presentes, podem ser descritos com um até seis dígitos. 

Exemplo instrução SQL:

   UPDATE nomeTabela 
      SET nomeColuna = TIMESTAMP'2017-05-27 4:32:25
    WHERE condição;

Outra forma de trabalhar com o timestamp é com a função to_timestamp. Que recebe um texto (string) e converte para timestamp, exemplos:

   UPDATE nomeTabela 
      SET nomeColuna = to_timestamp('27/05/2017', 'dd/mm/yyyy')
    WHERE condição;

   UPDATE nomeTabela 
      SET nomeColuna = to_timestamp('20170527', 'yyyymmdd')
    WHERE condição;


   UPDATE nomeTabela 
      SET nomeColuna = to_timestamp('20170527043225', 'yyyymmddhhmiss')
    WHERE condição;

Veja que a função recebe dois parâmetros. O primeiro é a string a ser convertida, e o segundo parâmetro é o formato para encontrar os itens do timestamp dentro da string a ser convertida.

Observação: o mês e dia devem ser maior que zero.
*Se mês igual a zero, é retornado:
Erro de SQL: ORA-01843: not a valid month

*Se dia igual a zero, é retornado:
Erro de SQL: ORA-01847: day of month must be between 1 and last day of month

Consultar a relação de Termos e Abreviaturas acesse aqui.

FELIPE BARBOSA FERREIRA
Até o próximo post!

quinta-feira, 27 de abril de 2017

Delete Restrict / Cascade / Set NULL

Olá!

Para que a integridade do banco de dados (DB) seja mantida, há algumas regras que auxiliam a proteger as associações de registros que são realizadas entres as tabelas. Neste post será demonstrado algumas dessas regras que possuem relação quanto a exclusão registros que possuem ligação em outra tabela.

De modo, há apresentar o impacto que cada regra possui sobre a associação das tabelas e seus respectivos registros.

Temos, as seguintes regras:

  • Delete Restrict
Não permite deletar registros "pai" que possuem ligação (por meio de FK) em outra tabela.

  • Delete Cascade
Deleta o registro na "tabela pai" e automaticamente todos os demais registros associados a ele nas demais tabelas do DB.

  • Delete SET NULL
Ao deletar o registro na "tabela pai" que está sendo referenciado em outras tabelas, a coluna(s) de ligação (FK) na outra tabela tem o valor alterado nulo (já que a FK não vai existir mais, pois o registro pai foi deletado).


Para os exemplos, é utilizado a tabela carro e marca_carro, sendo que elas estão ligadas pela coluna cd_marca_carro. Deste modo, vários carros podem ser de uma marca. Veja abaixo o modelo de entidade e relacionamento (EER) das tabelas:

Modelo EER para carro e marca_carro

Neste modelo podemos deletar qualquer registro da tabela carro ("tabela filha") sem complicações. Entretanto, ao executar um SQL para excluir alguma marca de carro que esteja associada a algum carro será aplicado a regra definida na FK da tabela carro.

A tabela marca_carro neste modelo possui a ligação de ser a "tabela pai", assim ela foi criada primeiro com a seguinte instrução SQL:
           CREATE TABLE `blog`.`marca_carro` (
                        `cd_marca_carro` INT         NOT NULL
                      , `nm_marca_carro` VARCHAR(45) NOT NULL
                      , PRIMARY KEY (`cd_marca_carro`));

Já a tabela carro, foi criada posteriormente com o SQL:
           CREATE TABLE `blog`.`carro` (
                        `cd_carro`       INT         NOT NULL
                      , `nm_carro`       VARCHAR(45) NOT NULL
                      , `cd_marca_carro` INT         NOT NULL
                      , PRIMARY KEY (`cd_carro`)
                      , INDEX `cd_marca_carro_idx` (`cd_marca_carro` ASC)
             CONSTRAINT `cd_marca_carro`
            FOREIGN KEY (`cd_marca_carro`)
             REFERENCES `blog`.`marca_carro` (`cd_marca_carro`)
                     ON DELETE RESTRICT
                     ON UPDATE NO ACTION);

A definição da regra a ser aplicada caso seja executado uma instrução DELETE na tabela marca_carro está neste caso na penúltima linha: ON DELETE RESTRICT.

Com os seguintes registros abaixo em cada tabela, é demonstrado os exemplos do impacto de cada regra ao ser executado instruções DELETE:


Tabela carro
Tabela marca_carro

Note que o primeiro e segundo registro da tabela carro está associado a marca Fiat, e o carro com código 3 está associado a marca Jeep. Também, veja que não há nenhum carro associado a marca Mercedes.


  • Impacto com a regra Delete Restrict
Ao executar o comando para deletar a marca Fiat que possui associação com dois carros, SQL: 
           DELETE FROM marca_carro WHERE cd_marca_carro = 1;

Resultado:
Não possível deletar o registro de marca_carro, pois ele está sendo referenciado na tabela carro. Para que o SQL Delete aconteça, é necessário primeiramente que os registros que fazem referencia ao registro da tabela marca_carro sejam deletados ou atualizados para fazer referência a outro registro. Ou seja, o registro da tabela marca_carro somente será deletado se não estiver sendo referenciado em outra tabela.

Já ao executar o comando para excluir a marca Mercedes que não tem nenhuma ligação, SQL:
           DELETE FROM marca_carro WHERE cd_marca_carro = 3;

Resultado:
Deletado com sucesso pois não está sendo referenciado em nenhuma tabela.

Assim, após a execução das instruções Delete, a tabela marca_carro fica com os seguintes registros:
Tabela: marca_carro


  • Impacto com a regra Delete Cascade
Ao executar o comando para deletar a marca Fiat, SQL:
           DELETE FROM marca_carro WHERE cd_marca_carro = 1;

Automaticamente todos os registros da tabela carro vinculados a marca Fiat também são deletados, veja o estado de cada tabela após a execução do SQL :
Tabela marca_carro tem a marca Fiat deletada com sucesso:
Tabela: marca_carro
A tabela carro possui a exclusão automática de todos os registros associados a marca deletada:
Tabela: carro


  • Impacto com a regra Delete SET NULL
Primeiramente é necessário habilitar que a coluna cd_marca_carro na tabela carro possa receber valor nulo, pois note que no comando de criação da tabela há a definição de NOT NULL para essa coluna.

Ao executar o SQL:
           DELETE FROM marca_carro WHERE cd_marca_carro = 1;

A marca de código 1 é deletada com sucesso, e automaticamente todos os registros da tabela carro que faziam referência ao registro deletado teve o valor da coluna cd_marca_carro alterado para nulo, conforme:
Tabela: carro

Além dessas três regras, existe o SET DEFAULT que é semelhante ao SET NULL, porem atribui um valor definido para a FK dos registros associados ao registro "pai" deletado. 

E por fim, se nenhuma dessas regras forem atribuídas, a definição da tabela constará com:
ON DELETE NO ACTION. Assim, nenhuma ação/verificação é executada.

Observação: verifique se o mecanismo de armazenamento do DB permite a utilização dessas regras. Pois, por exemplo, o MySql com InnoDB não permite usar ON DELETE SET DEFAULT.

Consultar a relação de Termos e Abreviaturas acesse aqui.
FELIPE BARBOSA FERREIRA

Até o próximo post!

domingo, 26 de março de 2017

Função CONCAT() - Concatenar

Olá!

Na tabela de exemplo abaixo temos o armazenamento do nome e sobrenome da pessoa em colunas diferentes, veja:

PESSOA
CD_PESSOANOMESOBRENOMEIDADE
1FelipeBarbosa23
2AnaVieira20
3JoãoSantos19
4Alinenull21
5MairaDantas25
6Ananull19
7AlineFerreira22

Deste modo, se a aplicação necessitar apresentar o nome completo da pessoa em uma única linha, será realizado a concatenação dos valores dessas colunas pelo front-end (HTML; PHP; Java; etc), ou, previamente pela instrução SQL.

Para concatenar valores de colunas no SQL utilizamos a função CONCAT(), sintaxe:
  • CONCAT (expressão-1, expressão-2, ...)
Onde, "expressão" pode ser um valor fixo, ou uma coluna, ou o resultado de outra função.

Exemplos:
1) - Concatenar as colunas NOME e SOBRENOME

SQL:
SELECT CONCAT(NOME, SOBRENOME)
  FROM PESSOA;

Resultado:
  1. FelipeBarbosa
  2. AnaVieira
  3. JoãoSantos
  4. null
  5. MairaDantas
  6. null
  7. AlineFerreira

2) - Concatenar coluna com valor fixo

SQL:
SELECT CONCAT(NOME, " valorFixoTeste")
  FROM PESSOA
 WHERE CD_PESSOA = 1;

Resultado:
  1. Felipe valorFixoTeste

3) - Concatenar coluna com o resultado de outra função

SQL:
SELECT CONCAT(NOME, COALESCE(SOBRENOME, " Sobrenome não cadastrado"))
  FROM PESSOA;

Resultado:
  1. FelipeBarbosa
  2. AnaVieira
  3. JoãoSantos
  4. Aline Sobrenome não cadastrado
  5. MairaDantas
  6. Ana Sobrenome não cadastrado
  7. AlineFerreira

Note que com o resultado dos exemplos, podemos constatar algumas características da função CONCAT(), são:
  • Os valores das colunas são concatenados sem a adição de espaços. No primeiro exemplo o nome e sobrenome ficaram juntos.
  • Quando o valor de uma expressão é nulo, o resultado da concatenação é nulo.

Para adicionar o espaço entre o nome e sobrenome, veja a solução:
SQL:
SELECT CONCAT(NOME, " ", SOBRENOME)
  FROM PESSOA;

Consultar a relação de Termos e Abreviaturas acesse aqui.
Felipe Barbosa Ferreira
Até o próximo post!

sábado, 11 de março de 2017

Função COALESCE( )

Olá!

Ao executar uma instrução SQL que esteja manipulando colunas que possuem valores nulos, é possível realizar a troca do valor nulo por outro valor, isso em tempo de execução, ou seja, não é realizado o update do valor na base de dados.

Tabela de exemplo:

PESSOA
CD_PESSOANOMESOBRENOMEIDADE
1FelipeBarbosa23
2Ananull20
3JoãoSantos19
4Alinenull21
5Mairanull25
6AnaHavana19
7AlineFerreira22

Na tabela PESSOA há registros com valor null para a coluna SOBRENOME. Com a função COALESCE() em uma instrução Select podemos fazer com que seja retornado "Sobrenome não cadastrado" para os registros que possuírem valor null.

Sintaxe:

  • COALESCE (expressão-1, expressão-2, ...)

Caso a primeira expressão tenha valor nulo, será retornado o valor da próxima expressão que não seja nulo.


Exemplo:
Trocar o valor null pelo texto: "Sobrenome não cadastrado", para os registros que possuam nulo na coluna SOBRENOME.

SQL:

SELECT NOME
, COALESCE(SOBRENOME, "Sobrenome não cadastrado")
, IDADE
FROM PESSOA;


Resultado:
NOMESOBRENOMEIDADE
FelipeBarbosa23
AnaSobrenome não cadastrado20
JoãoSantos19
AlineSobrenome não cadastrado21
MairaSobrenome não cadastrado25
AnaHavana19
AlineFerreira22


Consultar a relação de Termos e Abreviaturas acesse aqui.
Felipe Barbosa Ferreira
Até o próximo post!

sábado, 25 de fevereiro de 2017

With Default - Valor padrão para a coluna

Olá!

O comando With Default é utilizado para definir um valor padrão a uma coluna, ele entra em ação quando é feito a inclusão de um registro sem atribuir valor a coluna.

Veja o exemplo abaixo da utilização desse comando para definir o valor padrão para a coluna SOBRENOME e DATA_INSCRICAO:

       CREATE TABLE INSCRICOES
           (
               CODIGO_PESSOA  INT         NOT NULL
           ,   NOME           VARCHAR(30) NOT NULL
           ,   SOBRENOME      VARCHAR(50) WITH DEFAULT 'em branco'
           ,   DATA_INSCRICAO DATE        WITH DEFAULT GETDATE()
           )

Deste modo, se na inserção de um registro na tabela de INSCRICOES não ser informado o sobrenome ou a data de inscrição, será respectivamente atribuído o valor 'em branco' ou a data atual do sistema para a coluna cujo valor não foi especificado.

Para criar o valor padrão a coluna de uma tabela existente ou alterar o valor definido pelo comando With Default, é necessário usar o comando Alter Table, veja:

       ALTER TABLE INSCRICOES
       ALTER SOBRENOME SET DEFAULT 'Não informado'

Após a execução do comando acima, será atribuído o valor 'Não informado' para a coluna SOBRENOME quando não definido um valor a está coluna no momento da inserção.

O procedimento da exclusão do valor padrão é semelhante ao processo de alteração, veja o comando abaixo para excluir a definição feita pelo With Default:

       ALTER TABLE INSCRICOES
       ALTER SOBRENOME DROP DEFAULT

Consultar a relação de Termos e Abreviaturas acesse aqui.
Felipe Barbosa Ferreira
Até o próximo post!