segunda-feira, 17 de novembro de 2014

Nulo não é nada!!!






Encontrei esse título em um capítulo do livro OCA Oracle Database 11g:SQL Fundamentals I - Exam Guide (Exam 1Z0-051) e simplesmente me apaixonei pela definição na verdade o título é NULL Is Nothing traduzi para usar aqui no Blog!

Lembro quando comecei a estudar banco de dados lá em 2008 ainda na faculdade eu tinha o costume de considerar Null como 0 (zero), mas estava errada, nulo não era 0 e também não era um espaço em branco Null simplesmente não é nada, podemos considerar Null como a definição da não existência, ou a existência indefinida?

Antes de começar a estudar para a certificação, já tinha entendido e começado a trabalhar com o Null quase que diariamente, porém nunca havia encontrado uma definição tão simples objetiva e correta sobre a informação Null.

Resolvi escrever um post com essa definição após um dos simulados que fiz para a prova 1Z0-051 onde apareceu a questão abaixo:

Which expressions do not return NULL values? (Choose all that apply.)

A.select ((10 + 20) * 50) + null from dual;
B.select 'this is a '||null||'test with nulls' from dual;
C.select null/0 from dual;
D.select null||'test'||null as “Test” from dual;

Foi aí que me surgiu uma dúvida em relação a alternativa C, sabemos que qualquer numero divido por 0 vai dar um erro ORA-01476 e que qualquer conta onde um dos fatores seja igual a Null será Null.

Sendo assim ao dividir Null/0 qual regra seria prioritária?

Claro que eu poderia ir no banco e fazer o teste prático mas acabei entrando em um debate filosófico com alguns colegas de trabalho muitos argumentos bons surgiram entre eles que o Oracle iria primeiro validar se era possível executar a query e por isso o erro apareceria ou que o Null simplesmente iria anular tudo inclusive o erro.

Concluímos assim que ir no banco e executar a query seria a melhor solução portanto segue resultado:

O resultado foi Null, porque realmente o nulo não é nada e como dividir nada, como gerar um erro com nada?

Se tentarmos dividir uma palavra ou uma letra por 0 (zero) temos o erro ORA-01722 que é diferente do erro de divisão por 0 (zero) senda o Null igual a nada como seria possível o banco definir qual erro apresentar?


Desta forma podemos concluir com bases práticas e teóricas que o Null não é nada, não é (0) zero e nem um espaço em branco o Null é uma referência de que aquela variável não possui nada.

Null é diferente de Null

Essa é uma outra máxima que temos que lembrar sempre em banco de dados ( e em 99% das linguagens de programação, não escrevo 100% porque não estudei a fundo todas as linguagens de programação) se definir a variável  A como Null e a variável B como Null A nunca será igual a B.

Porque como vimos anteriormente Null não é nada é algo totalmente indefinido, como duas coisas indefinidas seriam iguais?

Para comparar variáveis ou colunas que podem ter o valor Null usamos a função NVL

NVL(VARIAVEL,0) 

 Desta forma ao comparar A com B a sintaxe mudaria de:
 Para:

 Podemos perceber que a única diferença entre a primeira e a segunda imagem é o uso da função NVL. Recomendo o uso desta função sempre que for comparar colunas que possam conter valores nulos.

Copyright:

O Conteúdo desde Blog não deve ser publicado, distribuído ou transmitido sem autorização prévia de seu autor.

ESTE É UM SITE INDEPENDENTE E NÃO REPRESENTA A ORACLE CORPORATION® (http://www.oracle.com) EM NENHUM SENTIDO. AS OPINIÕES E CONTEÚDOS AQUI ENCONTRADOS NÃO POSSUEM RELAÇÃO COM A VISÃO DA ORACLE CORPORATION®. ESTE SITE NÃO POSSUI NENHUM APOIO OU PATROCINIO DA ORACLE CORPORATION®.

terça-feira, 12 de agosto de 2014

Categorias de SQL


No post de hoje vou falar sobre as Categorias de SQL,  você pode conhecer por Tipo de SQL ou ate mesmo Tipo de Comandos de Banco de dados e vou apresentar os principais comandos de cada categoria.

O SQL (Strucuted Query Language) é uma linguagem de programação utilizada para gerenciamento de base de dados e pode ser agrupada nas categorias abaixo:


DDL - DATA DEFINITION LANGUAGE: 

São comandos que permitem que você crie, substitua, altere, objetos, permissões e configurações do banco de dados. Comandos

  • CREATE, ALTER, DROP ou RENAME: Podem ser usados em todos os objetos de banco de dados. Exemplo:  CREATE TABLE TESTE ( COLUMN1 NUMBER, COLUMN2 NUMBER);
  • TRUNCATE: Usado para apagar todas as linhas de um tabela, diferente de um DELETE sem WHERE ( que tambem apagaria todas as linhas da tabela), o TRUNCATE não permite a execusão de um ROLLBACK. Exemplo: TRUNCATE TABLE TESTE;
  • AUDIT, NOAUDIT: Permite ligar/desligar a auditoria de dados. Exemplos: AUDIT ALL BY USUARIO BY ACCESS; / NOAUDIT ALL BY USUARIO;
  • COMMENT: Inclui uma observação a um objeto no dicionário de dados. Exemplo: COMMENT ON TABLE RSE.TESTECINTYA IS 'COMENTARIO TABELATESTE';

DCL - DATA CONTROL LANGUAGE

São comandos que definem permissões de acessos dos usuários a determinados objetos do banco. Comandos:

  • GRANT: conceder privilégios de acesso ao usuário. Exemplo: GRANT SELECT ON TESTE  TO USUARIO;
  • REVOKE:  revogar conceder privilégios de acesso ao usuário. Exemplo: REVOKE SELECT ON TESTE FROM USUARIO;

DML - DATA MANIPULATION LANGUAGE

São comando de manipulação de dados, permitem que vocês inclua, altere ou exclua dados da sua base. Comandos:

  • INSERT: Inclui dados na tabela. Exemplo: INSERT INTO TESTE (COLUNA1,COLUNA2)  VALUES (1,'VALOR COLUNA 2');
  • UPDATE: altera dados já existentes na tabela.  Exemplo: UPDATE TESTE  SET COLUNA2 = 'NOVO VALOR' WHERE COLUNA1 = 1;
  • DELETE: Apaga os dados da tabela. Exemplo: DELETE TESTE WHERE COLUNA1 = 1;

TCL - Transaction Control Language

 São os comandos para controle de transação ( conjunto de comandos DML). Comandos: 

  • COMMIT: Efetiva as alterações realizadas pelos comandos DML.
  • ROLLBACK: Cancela as alterações realizadas pelos comandos DML.
  • SAVEPOINT: Definir pontos para possíveis rollbacks ou commits.

 DQL- DATA QUERY LANGUAGE


É a categoria de SQL mais utilizada, pois permite a busca de dados, seu principal comando é o SELECT, alguns autores colocam o SELECT como DML. Comando:

  •  SELECT: consulta de dados. Exemplo: SELECT * FROM DUAL;

Session Control (Controle de sessão)

São os comando para controle das propriedades de uma sessão de usuário, uma sessão é abeta cada vez que realizamos uma conexão com a base de dados.


  • ALTER SESSION: Altera as propriedades da sessão as alterações realizadas com esse comando serão perdidas assim que a conexão com o banco for fechada. Exemplo: ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY MM DD';


System Control (Controle do Sistema)

O único comando dessa categoria é o ALTER SYSTEM, permite gerenciar propriedades da base de dados, ao contrario da categoria anterior as alterações não são perdidas ao termina da sessão. Exemplo: ALTER SYSATEM SET NLS_DATE_FORMAT = 'YYYY MM DD';




segunda-feira, 4 de agosto de 2014

GUOB TECH DAY 2014 - Como foi!

Alex Zabala -
Palestra: How to Became an Oracle Master

Finalmente chegou agosto e com ele o GUOB TECH DAY!

A organização do evento foi muito boa, as palestras em geral foram boas, mas não consegui ver todas, como tivemos 3 salas com palestras simultâneas  tive que escolher algumas!!

As palestras apresentaram muita coisa nova sobre o Oracle, e eu que achava que ia sair de lá com algumas respostas, sai com muitas duvidas novas e com vontade de pesquisar muito mais, a palestra sobre Oracle Mobile me deixou muito curiosa,  em breve posto mais coisas sobre essa plataforma da Oracle que até então eu não conhecia.

As palestras que eu estava mais ansiosa para ver eram as sobre Tuning (quem nunca teve problema com lentidão no banco?) e claro não era só eu as duas palestras que teve desse tema estavam lotadas a primeira foi do Fabio Prado "Performance Tuning: o que é, por onde começar e o que fazer?" que deu ótimas dicas sobre como analisar onde esta o problema a segunda foi do Rodrigo Mufalani "SQL Tuning"  que deu muitas dicas sobre a otimização de querys!

Dana Singleterry -  Palestra: Oracle Mobile Platform - Simplifying Enterorise Mobility

terça-feira, 22 de julho de 2014

Programação GUOB TECH DAY


Como já postei aqui estão abertas as inscrições para o GUOB TECH DAY

O evento será no dia 02/08/2014 no Hotel Blue Tree Morumbi em frente ao Shopping Morumbi.


Segue a programação para o GUOB TECH DAY 2014,  e é bom já ir se programando esse ano as palestras estão muito boas e já estou triste de não poder ficar em dois lugares ao mesmo tempo!




segunda-feira, 9 de junho de 2014

GUOB TECH DAY / OTN TOUR 2014

Inscrições abertas!!!

Já estão abertas as inscrições para a 5º edição do principal evento da GOUB (Grupo de Usuários Oracle do Brasil) o GUOB TECH DAY, o evento será no dia 02/08 no Hotel Blue Tree Morumbi, em frente ao shopping Morumbi.





Este ano estarão presentes palestrantes como Alex Zaballa, Roy Swonger, Ronald Vargas, Francisco Alvarez, Gustavo Gonzalez, David Peake, Deiby Gomez, Gustavo Rene Antunez, Eduardo Guedes, Wagner Bianchi e Rodrigo Mufalani.


Este ano serão mais de 28 sessões em 5 linhas: DBA, Desenvolvimento, Business intelligence, Oracle E-Business Suite e Oracle APEX.



Quem quiser participar deste super - evento é só ir no site da GOUB e fazer sua inscrição. 


Minha inscrição já esta garantida!





sexta-feira, 23 de maio de 2014

IMPDP - import of dump

Nesse post quero tratar de um problema que enfrentei com o Oracle.

Tive que atualizar meus dados a partir de um arquivo dump enviado pelo cliente, isso é uma atividade normal no inicio dos projetos.

Podemos fazer pelo Oracle Enterprise Manager ou direto pela linha de comando.
Pela linha de comando a query é:

impdp use/senha  directory=IMPORT_DIR \ dumpfile= nome do dumpfile \ logfile= nome do logfile;

Onde:

IMPORT_DIR: Diretório onde o arquivo .dmp esta salva 
dumpfile: Nome do arquivo
logfile: Nome do arquivo de log ( este deve estar na mesma pasta que o arquivo .dmp)

Não é possível realizar o import como  usuário SYS ou SYSDBA temos que criar um usuário especifico para import com acesso ilimitado na tablespace USERS.

O meu problema foi que dessa vez esse comando não funcionou e deu o erro abaixo:

UDI - 31626: OPERATION GENERATEX ORALCE ERROR 361626
ORA - 31626: job does not exist
ORA - 06512: AT "SYS.DBMS_SYS_DATAPUMP", line 1137
ORA - 06512: AT "SYS.DBMS_SYS_DATAPUMP", line 3414
ORA - 06512: AT "SYS.DBMS_SYS_DATAPUMP", line 4593
ORA - 06512: AT line 1

Procurei por esse erro em vários fóruns e infelizmente demorei para encontrar a solução principalmente porque a solução foi justamente a combinação de algumas respostas, o primeiro passo para a solução é verificar se o seu usuário de import tem permissão no SYS.DBMS_SYS_DATAPUMP,caso ele já tenha permissão e esteja tudo OK com o usuário ( senha OK, acesso a tablespace USERS OK), temos que recriar a SYS.DBMS_SYS_DATAPUMP.

Recriando o  SYS.DBMS_SYS_DATAPUMP no Oracle 11g


Primeiro passo: rodar Catproc.sql
 
SQL >@ $ORACLE_HOME/rdbms/admin/catproc.sql
 
Segundo passo: se necessário recompilar os objetos inválidos
 
SQL >@ $ORACLE_HOME/rdbms/admin/utlrp.sql


Esses comandos levaram um tempo para executar, quando concluíram foi só rodar o impdp novamente.





terça-feira, 20 de maio de 2014

Funções Agrupadoras

Neste post vamos falar sobre os mecanismos do SQL para transformar dados em informações.

Esses mecanismos são as funções de agrupamento.

Imagine que você tem total acesso a todas as tabelas do banco mas a unica coisa que consegue fazer é um SELECT  simples das tabelas, e tem que saber o total de Mulheres cadastrada na sua tabela de clientes, sem as funções de agrupamento você teria que fazer o select abaixo esperar que o banco retorne todos os dados e contar o total de linhas.

SELECT * FROM tb_cliente WHERE sexo = 'F';

Alem de onerar muito o banco de dados o retorno vai trazer muita coisa que você não precisa e não quer, graças aos agrupadores você pode fazer esse outro SELECT e ter apenas a informação que você realmente precisa deixando sua consulta mais rápida e objetiva:

SELECT  count(*) FROM tb_cliente WHERE sexo = 'F';

No exemplo acima o segundo select retorna apena um numero  total de registro onde o sexo é igual a "F" ou seja o total de clientes Mulheres que você tem cadastrado.

Existem outras funções de agrupamento que podemos usar abaixo segue uma tabela com as principais funções de agrupamento e sua descrição:


segunda-feira, 17 de março de 2014

SQL Dinâmico - básico


Você tem que fazer uma procedure que retorna um cursor, porem no momento do desenvolvimento você não consegue definir os campos de retorno?

Você tem que executar um comando  DDL em tempo de execução de uma procedure?

Você tem que fazer uma procedure que faça um insert, mas a tabela só sera conhecida em tempo de execução?

O usuário quer poder gerar qualquer relatório, olhando qualquer tabela do sistema filtrando por qualquer campo sem ter que fazer uma solicitação para TI e a empresa não quer investir na ferramenta adequada? Ou isso tem que ser feito pra ontem?

Se você esta lendo este post para tentar sair de uma dessas situações ou uma parecida o SQLDinâmico pode ser sua solução. Antes optar pelo uso do SQL Dinâmico avalie sua real necessidade com cautela pois este recurso pode gerar uma lentidão no processo.

Neste post vou explicar apenas o básico sobre o uso de SQL Dinâmico pois esse recurso é muito complexo para explicar em uma unica postagem.

Para executar o SQL Dinâmico deve-se usar o comando Execute Imediate:

O exemplo a baixo mostra a sintaxe basica para a uso do SQL Dinâmico a partir do comando EXECUTE IMMEDIATE, para esse comando podemos passar qualquer string que ele vai executar:

BEGIN

  EXECUTE IMMEDIATE 'SELECT * FROM DUAL';

END;

No comando acima a string foi passada diretamente, porem o mais indicado é atribuir o texto a uma string e passar a string no comando  EXECUTE IMMEDIATE, como no exemplo abaixo:

DECLARE

  V_SQL VARCHAR2;

BEGIN

  V_SQL := 'SELECT * FROM DUAL'-- atribuindo valor na string

  EXECUTE IMMEDIATE V_SQL;  -- execução do script contido na string

END;

O segundo exemplo é o mais utilizado no desenvolvimento de procedures pois você pode não saber antecipadamente quais as colunas você deve retornar ou em qual tabela você vai buscar ou até mesmo você pode não saber em qual tabela a busca será realizada, veja a procedure abaixo:

-- Criação da  Procedure para receber como parâmetro nome do campo e nome da tabela onde a consulta será realizada
CREATE OR REPLACE PROCEDURE P_SQL_DINAMICO ( V_TABELA VARCHAR2, V_CAMPO VARCHAR2)

AS

  V_SQL VARCHAR2(100);

BEGIN

 V_SQL := 'SELECT ' || V_CAMPO || ' FROM ' ||  V_TABELA;--Concatenação do texto a ser executado

 EXECUTE IMMEDIATE V_SQL; -- execução do script contido na string

END;

Cada vez que for executada a procedure vai realizar uma consulta diferente dependendo dos parâmetros informados no momento em que ela for chamada.
É importante lembrar que não podemos usar ";" dentro da string que será executada pelo SQL Dinâmico.

terça-feira, 25 de fevereiro de 2014

Certificação - OCA


Oracle Certified Associate é o primeiro nível de certificação da Oracle.

Para obter a OCA é necessário ser aprovado em duas provas:

  • Oracle Database 11g: SQL Fundamentals I  - 1Z0-051
          Essa prova é composta pelo conhecimento basico de banco de dados a sua realização pode ser on line e não requer um curso especifico.

  • Oracle Database 11g: SQL Administration  I - 1Z0-052
          Já a segunda prova é mais especifica sobre administração de banco de dados e para realizar é preciso realizar um dos cursos reconhecidos pela Oracle e a prova também
deve ser realizada em uma instituição reconhecida.


http://education.oracle.com/






segunda-feira, 3 de fevereiro de 2014

Certificações Oracle


O primeiro passo para ser um profissional Oracle certificado é entender o processo de certificação.
Para um DBA existem 3 níveis de certificações.

  • OCA  - Oracle Certified Associte
  • OCP   - Oracle Certified Professional
  • OCM  - Oracle Certified Master
Para a imagem a baixo representa o fluxo para a certificação cada uma depende de mais de uma prova, nas próximas postagens vou tratar cada certificação individualmente.
fonte:http://dbaoracleinfnet.wordpress.com/
Para ler sobre outras Certificações da Oracle Clique Aqui