domingo, 26 de agosto de 2012

Um Pouco Sobre Joins


Olá pessoal, espero que estejam todos bem.

Hoje vou atender a um pedido de um colega que confessou não ter entendido como funciona um Join.
Primeiramente devo mencionar que a teoria de banco de dados é, em grande parte, retirada da teoria de conjuntos matemáticos. Um join (junção) é utilizado na consulta de tabelas em conjunto, serve para que possamos fazer consultas comparativas entre tabelas relacionadas.

Certo, então como funciona um Join?

Fazemos isso todos os dias e se tornou tão natural para nós q não paramos mais para pensar em com é 
feito.
Se tivermos três conjuntos numéricos, “Números de 1 a 10”, “Números pares” e “Números impares” e eu quiser saber quais são os números pares, podemos fazer um Join.


Funcionará da seguinte forma. Verificaremos quais números estão no conjunto dos pares e em seguida compararemos esses números para ver quais se encontram na tabela dos números de 1 a 10.


Desta forma através de comparação entre os conjuntos chegamos a um resultado que não é nem a 1ª e nem a 2ª tabela, mas sim uma nova tabela temporária para nossa pesquisa.
Imaginemos agora que não são conjuntos e sim tabelas e que elas não possuem apenas um dado, mas sim PKs e Fks, digamos que é temos três tabelas:
Funcionários {Cod_Func(PK), Nome, Telefone}
Gerentes{Cod_Func(PK e FK), Cod_Departamento(FK)}
Departamentos{Cod_Departamento(PK), Nome}


Então quero saber o nome e o número de telefone dos funcionários que são gerentes e somente destes. Na tabela funcionários não há essa indicação e na tabela de gerentes não tenho o nome nem número de telefone. Nesse caso devo fazer um join que me gerará uma tabela temporária com essa informação.
Então seleciono os nomes e telefones da tabela funcionário onde o código de funcionário da tabela funcionário seja igual ao código de funcionário da tabela gerentes.
Em SQL:

 select FUNCIONARIOS.NOME, FUNCIONARIOS.TELEFONE
from FUNCIONARIOS, GERENTES
where FUNCIONARIOS.COD_FUNC=GERENTES.COD_FUNC;
O será gerado através da comparação entre os campos relacionados, e serão mostrados somente os campos pedidos na seleção.


Existem três tipos de Join:
·        Inner Join: Que trará somente os resultados que  atenderem as condições nas duas
tabelas.
select  FUNCIONARIOS .NOME, FUNCIONARIOS .TELEFONE
from FUNCIONARIOS inner join GERENTES
on FUNCIONARIOS.COD_FUNC=GERENTES.COD_FUNC;
O resultado desta pesquisa será igual ao do join simples.


·        Right Join: Que irá trazer como resposta todos os resultados da tabela da direita, mesmo que não atendam a ou as condições informadas e mais os dados que atenderem as condições e estiverem na tabela da esquerda.
select FUNCIONARIOS.NOME, FUNCIONARIOS.TELEFONE
from FUNCIONARIOS right join GERENTES
on FUNCIONARIOS.COD_FUNC=GERENTES.COD_FUNC;


·        Left Join: Que irá trazer como resposta todos os resultados da tabela da esquerda, mesmo que não atendam a  ou as condições informadas  e mais os dados que atenderem essas condições e estiverem na tabela da direita.
select  GENRETES.COD_FUNCIONARIO, GENRETES.COD_DEPARTAMENTO
from FUNCIONARIOS left join GENRETES
on GENRETES.COD_FUNCIONARIO=FUNCIONARIOS.COD_FUNCIONARIO;


Repare que tanto em Rigth Join quanto em Left Join ocorre repetição de elementos da tabela para evitar isso devemos usar a clausula group by no final da sintaxe e assim agrupar os resultados.

Obrigado pela visita. Espero ter elucidado um pouco sobre o Join!
Até o próximo post.

Bibliografia:

segunda-feira, 13 de agosto de 2012

Procedures Cursores - Básico

Olá, pessoal!
Hoje vou falar sobre cursores. Uma possibilidade existente em PL/SQL e procedures que pode ser muito útil.
O que é um Cursor?
Um cursor em PL/SQL armazena uma área da memória para guardar o resultado de uma pesquisa. Esta pesquisa pode conter nenhum, um ou muitos dados que serão armazenados em linhas e colunas.
Então dentro de uma procedure podemos utilizar um cursor, que terá um nome e poderá se comportar como uma variável, porém uma variável que armazena mais de um campo dos dados. Através deste armazenamento é possível manipular ou comparar as informações
Os cursores podem ser Implícitos ou Explícitos sendo que o Explícito acaba por consumir mais recursos de memória.
Em uma procedure ou function o cursor deve ser declarado junto das variáveis, ou seja, antes do Begin e depois do create procedure/function. E podemos utiliza-lo de duas formas.
Forma Extensa ou Forma Resumida.


A Forma Extensa não é a forma mais utilizada e usamos os seguintes comandos:
·         Open: Abre o cursor e executa o comando de pesquisa select informado na declaração, tendo executado a pesquisa o cursor separa um espaço da memória para guardar temporariamente esses dados de linhas e colunas. Já que agora esses dados estão armazenados na memória, o cursor não precisará mais acessar o banco para obtê-los. É nesse momento, também, que é passado para o cursor os parâmetros, caso tenha utilizado de parâmetros de entrada.
·         Fetch:   Informará qual valor do cursor uma determinada variável receberá. Funciona através do conceito de ponteiro, onde ele irá informar a esta variável qual a linha corrente e em seguida posicionar o ponteiro na linha seguinte para a próxima repetição da operação. As linhas no cursor somente poderão ser acessadas quando seus valores forem passados para uma variável possível de ser manipuladas em PL/SQL.
·         Close: Fecha o cursor após sua execução e assim libera a área de memória onde o cursor estava armazenado.
Cursor Implícito Extenso:
O cursor implícito leva esse nome por suas ações ficarem “escondidas”. Ele não informa o que está fazendo, apenas faz. E assim podemos utilizar alguns comandos de manipulação.


Cursor Implícito Resumido
No Cursor Implícito Resumido utilizamos somente um comando que irá substituir os outros três. Este comando a estrutura de repetição FOR. Este comando irá abrir o cursor, criar a variável do tipo registro que irá receber os dados sem necessidade de declara-la, realizar cópias das linhas, uma a uma a cada repetição, controlará o final do cursor e seu fechamento.


Cursor Explícito
Os cursores explícitos são utilizados para controle de processamento, sempre que é necessário que apareça o que o cursor está fazendo.


Neste exemplo o que o cursor faz é simplesmente informar os valores encontrado na tabela para aquele campo especifico.
Ele é chamado explícito porque sua forma de ação é declarada, ele informa algo que está acontecendo em sua execução.

É isso, pessoal! Quado acontecem erros nas ferramentas de ETL temos como observar qual o código que foi gerado. Tendo essa noção sobre PL/SQL e principalmente sobre procedures e cursores podemos entender o que foi feito e analisar para descobrir qual o erro na geração do código para corrigirmos as definições de carga.

Espero ter ajudado, até o próximo post!

Bibliografia:

quarta-feira, 1 de agosto de 2012

Procedures PL/SQL - Básico


Uma parte importante sobre o ETL é entender como essas ferramentas trabalham na camada semântica. O ETL é feito através de procedures em SQL.

E o que é uma procedure?

Uma procedure é um bloco de SQL nomeado. Funciona logicamente como uma programação estruturada, se você já teve a oportunidade de estudar Pascal ou C sabe muito bem como funciona. De qualquer forma vamos ver o básico para termos uma ideia.
Para poder criar uma procedure o usuário deve ter permissão create procedure (GRANT CREATE PROCEDURE TO NOME_USUARIO) e para criar a procedure em outro schemas o usuário deve ter permissão alter any procedure (GRANT ALTER ANY PROCEDURE TO NOME_USUARIO).
Vou utilizar a linguagem PL/SQL
Esta é a sintaxe básica para a criação de uma procedure:


Onde:
·         Replace: Indica que se já existe uma procedure como nome indicado, esta será eliminada e substituída pela procedure que o código criará.
·         Bloco PL/SQL: Inicia-se com um BEGIN e termina com um END ou um END NOME_PROCEDURE. No corpo, entre o inicio e fim, escrevemos os comandos que a procedure irá executar.
·         Parâmetro: Indica o nome da variável que é passada na chamada da procedure ou retornará os valores.
·         Modo: Indicará se o parâmetro é de entrada (IN), saída (OUT) ou os dois (IN OUT). Caso não informemos default será IN.
·         Tipo de Dado: Como o nome diz, indicará o tipo de dados da variável. Pode ser declarado qualquer tipo de dado do SQL ou do PLSQL e não será necessário informar o tamanho.
·         IS|AS: A sintaxe do comando aceita os dois, por convenção usamos IS para criação de procedures. Indica que o algoritmo que se segue deve ser executado quando chamada a procedure.

Esse é um exemplo de procedure simples.


Certo, esta é uma procedure que tem uma única função, inserir um registro de uma determinada tabela.
Vamos analisar sua estrutura.
Começa com a sintaxe de criação ou reposição de uma procedure e seu nome, no caso “inserir”.
A seguir temos o parâmetro, tipo de parâmetro (se é de entrada ou saída) e seu datatype, entre parênteses, seguido pela palavra IS.
Após isso iniciamos nosso algoritmo. Abrimos com “Begin” e se segue em PL/SQL o que queremos que ela faça. Inserir os dados passados pelos parâmetros para tabela chamada “Tb_funcionarios”.
Dizemos também que depois de cumprida esta tarefa ela deve confirmar a alteração com o “commit”. E encerramos a procedure com o “End inserir;” sinalizando que sua função foi cumprida e sua execução terminou.
Para executarmos a procedure, com parâmetros, o comando é:
Exec nome_procedure (valor_parametro);
No caso exemplo então:

 Exec inserir (215, 9, 'Emerson Fitipaldi', 'R ficticia, 101', 'Sao Paulo', 'SP').

Claro que inserir um registro é simples o suficiente, criar uma procedure se torna mais trabalhoso que digitar o próprio comando diretamente. Para que, então, precisaremos de uma procedure. Simples, podemos fazer com que mais de um comando sejam executados, nos poupando tempo. Por exemplo, podemos criar uma procedure que não só insira, mas que caso já exista código de funcionário informado ela atualize os valores passados nos parâmetros.
Vamos ver essa alternativa:


Nesta alternativa mantivemos os parâmetros passados o algoritmo de inclusão de dados. Só que quando um valor de um campo unique já existe na tabela, não poderá ser repetido na inserção gerando um erro. A novidade desta alternativa está em pedir para a procedure que se houver o erro ela deve atualizar todos os campos daquele registro na tabela e depois confirmar a alteração.
Após a execução do programa a procedure confirmará a alteração e encerrará a atividade.
No caso a clausula “exception when” trata exatamente do erro. Através dessa clausula podemos dizer qual o erro esperado e dizer o que fazer quando este aparecer. Quando eu informo o “others” estou dizendo que deve proceder com a atualização seja o erro que for. Como sempre, não existe uma única solução e sim soluções mais eficazes que possam prever outros erros ou ações.

Outras soluções podem ser criadas por procedures no banco de dados. As ferramentas de ETL funcionam com criação e execução de procedures mais complexas que estas.
Caso queira se aprofundar no assunto e buscar por exercícios de procedure recomento o seguinte endereço http://www.univasf.edu.br/~mario.godoy/Aulas-BDII/BD%20II%20-%20Aula%209.pdf, os exercícios começam na pág. 24.

Obrigado pela visita e até o próximo post. 

Bibliografia: