PROGRAMAÇÃO PROCEDURAL EM
BANCO DE DADOS - PARTE I
Prof. Me. Edvar Bergmann Araujo
Universidade Feevale | www.feevale.br/digital | (51) 3586 8800
PROBLEMA
• Como resolver problemas complexos diretamente no Banco de Dados???
• Imagine todas as Regras de Negócio envolvidas no Faturamento de uma Empresa.
• Seria possível contemplar todas as particularidades e regras somente com a
Linguagem SQL???
• Pensando em um exemplo mais específico, vamos imaginar o Processo de
Faturamento da Feevale:
– Regras de Negócio distintas para Alunos, Bolsistas, Funcionários, Professores, ...
– Cursos de Idioma, Extensão, Graduação, Pós-Graduação, Impressões, Biblioteca, ...
PROBLEMA (CONTINUAÇÃO)
• Linguagem SQL não permitiria tratar tantas regras de negócios e características
complexas.
• Necessidade de uma Linguagem de Programação Procedural, com uso de
Variáveis, Estruturas Condicionais, Estruturas de Repetição, etc.
É possível fazer isto diretamente em um SGBD???
SIM, com Stored Procedures
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.
STORED PROCEDURES - CARACTERÍSTICAS
• 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;
• Elas permitem que se manipule diretamente os dados em banco, sem
qualquer intervenção do cliente e sem impor tráfego sobre a rede.
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
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.
LINGUAGENS
Específicas de cada SGBD:
• Oracle: PL/SQL
• PostgreSQL: PL/PgSQL
• SQL Server: Transact-SQL
• DB2: SQL PL
• MySQL: PL/MySQL
DESVANTAGEM: como não há uma linguagem padrão, o código é dependente do SGBD.
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)
TIPOS DE BLOCOS
Procedure Função Anônimo
PROCEDURE name FUNCTION name [DECLARE]
IS RETURN datatype
BEGIN IS BEGIN
-- comandos BEGIN -- comandos
-- comandos
[EXCEPTION] RETURN value; [EXCEPTION]
[EXCEPTION]
END;
END;
END;
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)
DECLARAÇÃO DE VARIÁVEIS
Sintaxe:
identificador [CONSTANT] datatype [NOT NULL] [:= expressão];
Exemplos:
vDataNasc DATE;
vCodDepto NUMBER(2) := 10;
vCidadeVARCHAR2(30) := 'Novo Hamburgo';
cComissao CONSTANT NUMBER := 1400;
ATRIBUINDO VALORES PARA VARIÁVEIS
Sintaxe:
identificador := expressão ;
Exemplos:
vCodDepto := 50;
vCidade:= 'Novo Hamburgo';
vDataNasc := TO_DATE('01/05/2013', 'DD/MM/YYYY');
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;
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 vContador
vContador := vContador + 1; -- pode ser utilizado no final
/*
Bloco de comentário.
Inicia por /* e termina por */
*/
ESTRUTURA DE UMA PROCEDURE
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;
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;
COMANDO IF
Sintaxe IF simples: Sintaxe IF com ELSE:
IF condição THEN IF condição THEN
comandos;
comandos;
ELSE
END IF; comandos;
END IF;
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.
LOOP BÁSICO
Sintaxe:
LOOP --delimitador de início
comando_1;
comando_2;
... --comandos
EXIT [WHEN condição]; --saída 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 cláusula REVERSE, após o IN, para que a variável 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 condição é avaliada no início de cada repetição. O loop se encerra
quando a condição for FALSE.
COMO RECUPERAR DADOS ARMAZENADOS NO BANCO?
IMPORTANTE: teremos necessidade de recuperar dados armazenados no banco,
colocá-los em variáveis, para que possam ser manipulados dentro das Procedures e
Functions.
Como fazer isto???
• SELECT .. INTO possui limitações
• CURSORES flexível, pode manipular result sets com qualquer número de
linhas.
COMANDOS SELECT EM PL/SQL
Utilizado para recuperar dados do banco de dados
Sintaxe:
SELECT lista_de_colunas
INTO {variavel1[, variavel2, ...]
| record_name
FROM tabela
WHERE condição;
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;
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)
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;
OPERAÇÕES DML EM PL/SQL
É possível executar comandos DML (INSERT, UPDATE e DELETE) da mesma
forma como seriam utilizados fora de um bloco PL/SQL.
BEGIN
...
INSERT INTO ...
DELETE ...
UPDATE ...
...
END;
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.
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;
COMO TESTAR?
SELECT C.*,
funcObtemNumeroCartoes(C.NRO_CONTA) AS NRO_CARTOES
FROM CONTA C
OU
SELECT funcObtemNumeroCartoes(30002) AS NRO_CARTOES
FROM DUAL
REFERÊNCIAS
DAMAS, Luís. SQL - Structured Query Language. 6. Ed. Rio de Janeiro: LTC, 214.
ISBN 9788521632443.
https://integrada.minhabiblioteca.com.br/#/books/9788521632450/cfi/6/58!/4
@0:0
ELMASRI, Ramez; NAVATHE, Shamkant B.. Sistemas de banco de dados, 7ª ed.
2016. Pearson. 1152p. ISBN 9788543025001.
https://search.ebscohost.com/login.aspx?direct=true&db=cat02123a&AN=feev.
5089763&lang=pt-br&site=eds-live&scope=site