46
Edvar Bergman Araujo Banco de Dados II Programação Procedural em Banco de Dados

09 BD2 Stored Procedures(3)

Embed Size (px)

DESCRIPTION

INTRODUCAO STORED PROCEDURE EM ORACLE

Citation preview

Page 1: 09 BD2 Stored Procedures(3)

Edvar Bergman Araujo

Banco de Dados II

Programação Procedural emBanco de Dados

Page 2: 09 BD2 Stored Procedures(3)

O que são Stored Procedures?

• Stored procedures são programas armazenados no banco de dados

• São trechos de códigos que realizam tarefas específicas

• Chamadas como comandos• Podem receber parâmetros e retornar valores• SQL e linguagens específicas• Possibilidade de executar comandos DML como

SELECT, INSERT, UPDATE e DELETE• Suporte a variáveis, comentários, instruções

declarativas, testes condicionais, desvios e laços.

Page 3: 09 BD2 Stored Procedures(3)

• Cada stored procedure é um módulo independente de código que pode ser executado a partir de:– uma outra procedure;– uma Trigger;– de uma aplicação cliente;– como parte de uma instrução SELECT, retornando

valores como se o procedimento fosse uma subconsulta;

• Eles permitem que se manipule diretamente os dados em banco, sem qualquer intervenção do cliente e sem impor tráfego sobre a rede.

O que são Stored Procedures?

Page 4: 09 BD2 Stored Procedures(3)

Objetivos de utilização

• Melhorar o desempenho das aplicações• Reduzir o volume de dados trafegados na

rede• Melhorar a manutenção do software• Melhorar a segurança no acesso aos dados

Page 5: 09 BD2 Stored Procedures(3)

Vantagens

• Stored procedures podem executar operações muito mais complexas que uma simples query.

• Se mais de uma aplicação irá acessar o banco de dados, as stored procedures podem também economizar tempo de manutenção e desenvolvimento já que qualquer aplicação poderá chamá-la.

• Alterar a stored procedure sem ter que alterar ou mesmo recompilar cada aplicação cliente.

• As alterações tornam-se imediatamente disponíveis para todos os aplicativos clientes que o utilizam.

Page 6: 09 BD2 Stored Procedures(3)

Vantagens

• Segurança - Stored procedures tem uma grande importância na segurança do banco de dados uma vez que elas podem acessar tabelas que o usuário não tem o direito de fazê-lo.

• Clientes magros: como a regra de negócio está no servidor, aplicativos clientes podem ser menores, exigindo menos recursos do sistema (disco, memória e CPU) e consequentemente hardware de menor custo;

Page 7: 09 BD2 Stored Procedures(3)

Quando utilizar

• Se a operação pode ser feita no servidor, sem a necessidade de obter informações do usuário enquanto a operação estiver sendo processada.

• Se a operação requer o processamento de um grande número de linhas, que implicaria em custos em termos de tráfego na rede para enviá-las através da rede para a aplicação cliente.

Page 8: 09 BD2 Stored Procedures(3)

Quando utilizar

• Se a operação é uma que deve ser feita periodicamente ou frequentemente.– tais como um fechamento de fim de mês ou uma

operação de arquivamento.

• Se a operação é efetuada por vários módulos ou processos diferentes dentro de sua aplicação ou por aplicações diferentes.

Page 9: 09 BD2 Stored Procedures(3)

Linguagens

• Específicas de cada SGBD– Oracle: PL/SQL– PostgreSQL: PL/PgSQL– SQL Server: Transact-SQL– DB2: SQL PL– MySQL: PL/MySQL

Page 10: 09 BD2 Stored Procedures(3)

Desvantagens

• Dependência do SGBD• Falta de Padrão

Page 11: 09 BD2 Stored Procedures(3)

Estrutura de um Bloco PL/SQL

DECLARE (opcional)– Variáveis, cursores, exceções definidas pelo

usuário

BEGIN (obrigatório)– Comandos SQL– Comandos PL/SQL

EXCEPTION (opcional)– Ações para executar quando ocorrer um erro

END; (obrigatório)

Page 12: 09 BD2 Stored Procedures(3)

Tipos de Blocos

[DECLARE]

BEGIN-- comandos

[EXCEPTION]

END;

PROCEDURE nameISBEGIN

-- comandos

[EXCEPTION]

END;

FUNCTION nameRETURN datatypeISBEGIN

-- comandosRETURN value;

[EXCEPTION]

END;

Anônimo Procedure Função

Page 13: 09 BD2 Stored Procedures(3)

Variáveis

• Declaradas e inicializadas na seção de Declaração

• Podem ter o conteúdo alterado no corpo da Procedure

• Linguagem Tipada: quando cria-se uma variável, define-se o seu tipo especificando o formato de armazenamento, restrições e faixa de valores válidos.

• Tipos de dados escalares (os mesmos usados para definir as colunas das tabelas do Oracle, com suporte a boolean)

• Tipos de dados compostos (registros)

Page 14: 09 BD2 Stored Procedures(3)

Declaração de Variáveis

Sintaxe:identificador [CONSTANT] datatype [NOT NULL]

[:= | DEFAULT expressão];Exemplos:

vDataNascDATE;vCodDepto NUMBER(2) NOT NULL := 10;vCidade VARCHAR2(30) := 'Novo Hamburgo';cComissao CONSTANT NUMBER := 1400;

Page 15: 09 BD2 Stored Procedures(3)

Atribuindo Valores para Variáveis

Sintaxe:identificador := expressão ;

Exemplos:vCodDepto := 50;vCidade := 'Porto Alegre';vDataNasc := TO_DATE('01/05/2013', 'DD/MM/YYYY');

Page 16: 09 BD2 Stored Procedures(3)

Atributo %TYPE

• Utilizado para declarar uma variável de acordo com:– uma coluna do banco de dados– outra variável previamente declarada

• A variável criada terá o mesmo tipo e precisão da coluna da tabela ou variável base.

Exemplo:vNroConta conta.NRO_CONTA%TYPE;

Page 17: 09 BD2 Stored Procedures(3)

Comentando o Código

• Comente o código para documentar cada fase e auxiliar na depuração. O comentário pode ser:– uma única linha, usando dois hifens (--)– várias linhas, usando os delimitadores /* e */

• Exemplos: -- Incrementar a variável vContadorvContador := vContador + 1; -- pode ser utilizado no final

/*Bloco de comentário.Inicia por /* e termina por */

*/

Page 18: 09 BD2 Stored Procedures(3)

Estrutura de uma Procedure - Parâmetros

CREATE PROCEDURE Nome_da_Procedure( nome_parametro1 tipo_parametro1, nome_parametro2 tipo_parametro2,

...nome_parametroN tipo_parametroN)

IS<declaração de variáveis e cursores>

BEGIN

<comandos da procedure>

END;

Page 19: 09 BD2 Stored Procedures(3)

Estrutura de uma FUNCTION

CREATE FUNCTION Nome_da_Funcao(nome_parametro tipo_parametro)

RETURN <tipo de dados que a função retorna>

IS<declaração de variáveis locais>

BEGIN<comandos da função>

RETURN value;

END;

Page 20: 09 BD2 Stored Procedures(3)

Comandos SELECT em PL/SQL

• Utilizado para recuperar dados do banco de dados

Sintaxe:SELECT lista_de_colunas INTO {variavel1[, variavel2, ...] | record_nameFROM tabelaWHERE condição;

Page 21: 09 BD2 Stored Procedures(3)

Comandos SELECT em PL/SQL - Exemplo

DECLARE vSaldo NUMBER(15,2); vLimite conta.LIMITE%TYPE;BEGIN SELECT saldo, limite INTO vSaldo, vLimite FROM conta WHERE nro_conta = 30001; ...END;

Select into serve somente qdo retornar f1 linha

Quando for necessário trabalhar com mais de 1 linha, é necessário o uso de Cursores

Page 22: 09 BD2 Stored Procedures(3)

Comandos SELECT em PL/SQL

• Cuidado:– O comando SELECT deve retornar somente uma

linha.– Mais de uma linha ou nenhuma linha causa um

erro.– Exceções geradas:

• NO_DATA_FOUND (nenhuma linha)• TOO_MANY_ROWS (mais de uma linha)

Page 23: 09 BD2 Stored Procedures(3)

COMO EVITAR?BEGIN ... BEGIN SELECT saldo, limite INTO vSaldo, vLimite FROM conta WHERE nro_conta = 30001; EXCEPTION WHEN NO_DATA_FOUND THEN vSaldo := 0; vLimite := 0; END; ...END;

Page 24: 09 BD2 Stored Procedures(3)

Manipulando Dados em PL/SQL

• É possível executar comandos DML (INSERT, UPDATE e DELETE) da mesma forma como seriam utilizados fora de um bloco PL/SQL

Page 25: 09 BD2 Stored Procedures(3)

Comando IF

Sintaxe IF simples:

IF condição THEN comandos;END IF;

Sintaxe IF com ELSE:

IF condição THEN comandos;ELSE comandos;END IF;

Page 26: 09 BD2 Stored Procedures(3)

Controle de Repetições

• O PL/SQL possui algumas estruturas para controles de repetição:– O LOOP básico fornece ações repetitivas sem

condições globais;– O FOR loop fornece controle de repetições de

ações baseado em um contador– O WHILE loop fornece controle de repetições de

ações baseado em uma condição– O comando EXIT encerra um loop– O comando CONTINUE interrompe a iteração atual

e vai para a próxima iteração do laço.

Page 27: 09 BD2 Stored Procedures(3)

LOOP básico

Sintaxe:

LOOP --delimitador comandos; --comandos ... --comandos EXIT [WHEN condição]; --saída do loopEND LOOP; --delimitador de fim

Page 28: 09 BD2 Stored Procedures(3)

FOR LOOP

Sintaxe:

FOR contador IN vlr_inicial..valor_final LOOP comando 1; comando 2; ... comando N;END LOOP;

Obs.: pode-se utilizar a cláusula REVERSE, após o IN, para que a variável de controle varie de um valor maior para um menor.

Page 29: 09 BD2 Stored Procedures(3)

WHILE LOOP

Sintaxe:

WHILE condicao LOOP comando 1; comando 2; ... comando N;END LOOP;

Obs.: A condição é avaliada no início de cada repetição. O loop se encerra quando a condição for FALSE.

Page 30: 09 BD2 Stored Procedures(3)

Exemplo

Desenvolver uma função que retorne o número de cartões de crédito de uma conta corrente.

Obs.: exemplo simples, apenas com fins didáticos, para demonstrar o funcionamento.

Page 31: 09 BD2 Stored Procedures(3)

CREATE FUNCTION funcObtemNumeroCartoes (pNroConta conta.NRO_CONTA%TYPE)RETURN NUMBER IS vCont NUMBER;BEGIN SELECT COUNT(*) INTO vCont FROM CARTAO WHERE NRO_CONTA = pNroConta;

RETURN vCont;END;

Page 32: 09 BD2 Stored Procedures(3)

Como testar?

SELECT funcObtemNumeroCartoes(30002) AS NRO_CARTOESFROM DUAL

OU

SELECT C.*, funcObtemNumeroCartoes(C.NRO_CONTA) AS NRO_CARTOESFROM CONTA C

Page 33: 09 BD2 Stored Procedures(3)

Exercícios

1. Desenvolver uma função que retorne o valor total aplicado atualizado de uma conta corrente.

testar: SELECT C.NRO_CONTA, funcValorTotalAplicado(C.NRO_CONTA) AS VLR_APLICADO FROM CONTA C;

2. Desenvolver uma função que retorne a média de gastos com cartão de crédito por um determinado correntista em um período.

testar: SELECT C.nro_conta, funcValorMediaCartoes2(C.NRO_CONTA, to_date('01/01/2015','dd/mm/yyyy'),to_date('31/03/2015','dd/mm/yyyy')) AS vlrmediacartoes FROM CONTA C;

Page 34: 09 BD2 Stored Procedures(3)

Atributo %ROWTYPE

• Utilizado para declarar uma variável• A variável poderá armazenar um

conjunto de colunas• O número, tipo e nome das colunas é

obtido a partir da tabela ou view de origem

Exemplo:vConta conta%ROWTYPE;

Page 35: 09 BD2 Stored Procedures(3)

Cursores

• Oracle utiliza áreas de memória para executar comandos SQL e para armazenar informações

• Cursores PL/SQL são usados para “nomear” uma destas áreas e acessar as informações armazenadas

Page 36: 09 BD2 Stored Procedures(3)

Cursores

Result Set

Registro AtualCursor

7369 Jonas DBA

7566 Marta Gerente

7788 Cristina Analista

7876 Carolina Testador

7902 Marcos Programador

Page 37: 09 BD2 Stored Procedures(3)

Cursores

• Cria um cursor

DECLAREDECLARE

• Executa o SQL e obtém o Resul Set

OPENOPEN

• Carrega a linha atual para vairáveis

FETCHFETCH

• Verifica se ainda existem linhas, executando um novo FETCH

EMPTY?

Não

• Libera a área de memória

CLOSECLOSESim

Page 38: 09 BD2 Stored Procedures(3)

Cursores

Sintaxe:CURSOR nome_do_cursor IS comando_select;

Exemplo:CURSOR cContas30 IS SELECT NRO_CONTA, NOME, SALDO, LIMITE FROM CONTA WHERE COD_AGENCIA = 30;

vContas30 cContas30%ROWTYPE;

Page 39: 09 BD2 Stored Procedures(3)

Cursores

BEGIN ... OPEN cContas30; LOOP FETCH cContas30 INTO vContas30; EXIT WHEN cContas30%NOTFOUND; ... -- Processa os dados recuperados ... END LOOP; CLOSE cContas30; ...END;

Page 40: 09 BD2 Stored Procedures(3)

Cursores

• Existem 4 atributos para obter informações de status de um cursor:

1. %ISOPEN – retorna TRUE se o cursor estiver aberto

2. %NOTFOUND – retorna TRUE se o FETCH mais recente não retornou uma linha

3. %FOUND – retorna TRUE se o FETCH mais recente retornou uma linha

4. %ROWCOUNT – retorna o número total de linhas recuperadas até o momento

Page 41: 09 BD2 Stored Procedures(3)

Cursores – FOR loop

• O Oracle possui um tipo especial de laço FOR para ser utilizado com cursores.

• A principal vantagem é a facilidade de utilização, pois:O cursor é aberto automaticamenteOs registros são recuperados um a um, a

cada repetição do laçoO cursor é fechado automaticamenteNão é necessário declarar a variável

Page 42: 09 BD2 Stored Procedures(3)

Cursores – FOR loop

Exemplo:...FOR vCon30 IN cContas30 LOOP -- -- OPEN e FETCH implícitos -- os dados são carregados na variável vCon30 ...END LOOP; -- CLOSE implícito é feito...

Page 43: 09 BD2 Stored Procedures(3)

Exercício

3. Desenvolver uma stored procedure para calcular as faturas de todos os cartões com vencimento em um determinado dia (obtido a partir da data recebida como parâmetro).

– Calcular o valor total e gravar um registro na tabela FATURA

– Atualizar a tabela de movimentos com o código da fatura que gerou o desconto

– Sugere-se testar usando a data: 05/03/2015

Dica: para obter o dia de uma data, usar:extract(day from DATA_QUALQUER)Considerando a data acima, o retorno será 5.

Pegar o dia de vencto da tabela CARTAO (col DIA_VENCTO). Ler a tabela MOVTO_CARTAO, gerar fatura p\ todos os cartões com vencto no dia e cujo campo COD_FATURA esteja null. O código da fatura é a ultima fatura + 1

Page 44: 09 BD2 Stored Procedures(3)

Como testar?

Em uma janela do SQL Developer

BEGIN prcGeraFatura(to_date('05/03/2015', 'dd/mm/yyyy'));END;

Page 45: 09 BD2 Stored Procedures(3)

DEBUG no SQL Developer

• O SQL Developer possui recurso para depurar Stored Procedures.

• Demonstração prática de DEBUG no SQL Developer

Page 46: 09 BD2 Stored Procedures(3)

Trabalho

Desenvolver o trabalho conforme especificação disponível no documento “Trabalho de Stored Procedures”.