Академический Документы
Профессиональный Документы
Культура Документы
Programao Procedural em
Banco de Dados
Objetivos de utilizao
Melhorar o desempenho das aplicaes
Reduzir o volume de dados trafegados na
rede
Melhorar a manuteno do software
Melhorar a segurana no acesso aos dados
Vantagens
Stored procedures podem executar operaes
muito mais complexas que uma simples query.
Se mais de uma aplicao ir acessar o banco
de dados, as stored procedures podem
tambm economizar tempo de manuteno e
desenvolvimento j que qualquer aplicao
poder cham-la.
Alterar a stored procedure sem ter que alterar
ou mesmo recompilar cada aplicao cliente.
As alteraes tornam-se imediatamente
disponveis para todos os aplicativos clientes
que o utilizam.
Vantagens
Segurana - Stored procedures tem uma
grande importncia na segurana do banco de
dados uma vez que elas podem acessar
tabelas que o usurio no tem o direito de
faz-lo.
Clientes magros: como a regra de negcio est
no servidor, aplicativos clientes podem ser
menores, exigindo menos recursos do sistema
(disco, memria e CPU) e consequentemente
hardware de menor custo;
Quando utilizar
Se a operao pode ser feita no servidor,
sem a necessidade de obter informaes do
usurio enquanto a operao estiver sendo
processada.
Se a operao requer o processamento de
um grande nmero de linhas, que implicaria
em custos em termos de trfego na rede
para envi-las atravs da rede para a
aplicao cliente.
Quando utilizar
Se a operao uma que deve ser feita
periodicamente ou frequentemente.
tais como um fechamento de fim de ms ou uma
operao de arquivamento.
Linguagens
Especficas de cada SGBD
Oracle: PL/SQL
PostgreSQL: PL/PgSQL
SQL Server: Transact-SQL
DB2: SQL PL
MySQL: PL/MySQL
Desvantagens
Dependncia do SGBD
Falta de Padro
BEGIN (obrigatrio)
Comandos SQL
Comandos PL/SQL
EXCEPTION (opcional)
Aes para executar quando ocorrer um erro
END; (obrigatrio)
Tipos de Blocos
Annimo
Procedure
Funo
[DECLARE]
PROCEDURE name
IS
BEGIN
-- comandos
FUNCTION name
RETURN datatype
IS
BEGIN
-- comandos
RETURN value;
BEGIN
-- comandos
[EXCEPTION]
[EXCEPTION]
[EXCEPTION]
END;
END;
END;
Variveis
Declaradas e inicializadas na seo de
Declarao
Podem ter o contedo alterado no corpo da
Procedure
Linguagem Tipada: quando cria-se uma
varivel, define-se o seu tipo especificando o
formato de armazenamento, restries e faixa
de valores vlidos.
Tipos de dados escalares (os mesmos usados
para definir as colunas das tabelas do Oracle,
com suporte a boolean)
Tipos de dados compostos (registros)
Declarao de Variveis
Sintaxe:
identificador [CONSTANT] datatype [NOT NULL]
[:= | DEFAULT expresso];
Exemplos:
vDataNasc DATE;
vCodDepto NUMBER(2) NOT NULL := 10;
vCidade VARCHAR2(30) := 'Novo Hamburgo';
cComissao CONSTANT NUMBER := 1400;
Atributo %TYPE
Utilizado para declarar uma varivel de acordo
com:
uma coluna do banco de dados
outra varivel previamente declarada
conta.NRO_CONTA%TYPE;
Comentando o Cdigo
Comente o cdigo para documentar cada fase e
auxiliar na depurao. O comentrio pode ser:
uma nica linha, usando dois hifens (--)
vrias linhas, usando os delimitadores /* e */
Exemplos:
-- Incrementar a varivel vContador
vContador := vContador + 1; -- pode ser utilizado no final
/*
Bloco de comentrio.
Inicia por /* e termina por */
*/
IS
<declarao de variveis e cursores>
BEGIN
<comandos da procedure>
END;
BEGIN
<comandos da funo>
RETURN value;
END;
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;
Comando IF
Sintaxe IF simples:
IF condio THEN
comandos;
END IF;
Sintaxe IF com
ELSE:
IF condio THEN
comandos;
ELSE
comandos;
END IF;
Controle de Repeties
O PL/SQL possui algumas estruturas para
controles de repetio:
O LOOP bsico fornece aes repetitivas sem
condies globais;
O FOR loop fornece controle de repeties de
aes baseado em um contador
O WHILE loop fornece controle de repeties de
aes baseado em uma condio
O comando EXIT encerra um loop
O comando CONTINUE interrompe a iterao atual
e vai para a prxima iterao do lao.
LOOP bsico
Sintaxe:
LOOP
--delimitador
comandos;
--comandos
...
--comandos
EXIT [WHEN condio]; --sada do loop
END LOOP;
--delimitador de fim
FOR LOOP
Sintaxe:
FOR contador IN vlr_inicial..valor_final LOOP
comando 1;
comando 2;
...
comando N;
END LOOP;
Obs.: pode-se utilizar a clusula REVERSE,
aps o IN, para que a varivel de controle
varie de um valor maior para um menor.
WHILE LOOP
Sintaxe:
WHILE condicao LOOP
comando 1;
comando 2;
...
comando N;
END LOOP;
Obs.: A condio avaliada no incio de cada
repetio. O loop se encerra quando a
condio for FALSE.
Exemplo
Desenvolver uma funo que retorne o
nmero de cartes de crdito de uma conta
corrente.
Obs.: exemplo simples, apenas com fins
didticos, para demonstrar o funcionamento.
Como testar?
Exerccios
Atributo %ROWTYPE
Utilizado para declarar uma varivel
A varivel poder armazenar um
conjunto de colunas
O nmero, tipo e nome das colunas
obtido a partir da tabela ou view de
origem
Exemplo:
vConta conta%ROWTYPE;
Cursores
Oracle utiliza reas de memria para
executar comandos SQL e para
armazenar informaes
Cursores PL/SQL so usados para
nomear uma destas reas e acessar as
informaes armazenadas
Cursores
Result Set
Cursor
7369
7566
7788
7876
7902
Jonas
Marta
Cristina
Carolina
Marcos
DBA
Gerente
Analista
Testador
Programador
Registro Atual
Cursores
No
Sim
DECLARE
DECLARE
OPEN
OPEN
FETCH
FETCH
Cria um
Executa o
Carrega a
SQL e
obtm o
Resul Set
linha atual
para
vairveis
cursor
EMPTY?
CLOSE
CLOSE
Verifica se Libera a
ainda
existem
linhas,
executando
um novo
FETCH
rea de
memria
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;
Cursores
BEGIN
...
OPEN cContas30;
LOOP
FETCH cContas30 INTO vContas30;
EXIT WHEN cContas30%NOTFOUND;
...
-- Processa os dados recuperados
...
END LOOP;
CLOSE cContas30;
...
END;
Cursores
Existem 4 atributos para obter informaes
de status de um cursor:
1. %ISOPEN retorna TRUE se o cursor estiver
aberto
2. %NOTFOUND retorna TRUE se o FETCH
mais recente no retornou uma linha
3. %FOUND retorna TRUE se o FETCH mais
recente retornou uma linha
4. %ROWCOUNT retorna o nmero total de linhas
recuperadas at o momento
Exerccio
3. Desenvolver uma stored procedure para
calcular as faturas de todos os cartes com
vencimento em um determinado dia (obtido a
partir da data recebida como parmetro).
Como testar?
Em uma janela do SQL Developer
BEGIN
prcGeraFatura(to_date('05/03/2015', 'dd/mm/yyyy'));
END;
Trabalho