BD2-2-procedimentos-2022 09 13 1124
BD2-2-procedimentos-2022 09 13 1124
BD2-2-procedimentos-2022 09 13 1124
Procedimentos Armazenados
Josenildo Silva
jcsilva@ifma.edu.br
MOTIVAÇÃO
Contexto: Sistemas em 2 camadas
SGBD
Contexto: Sistemas em 3 camadas
Aplicação
SGBD
Problema 1: Alto volume de dados na rede
Como reduzir o tráfego na rede?
Cliente
Aplicação
Exemplo 1
Aplicação
Exemplo 2
Realizar a sequência
Insert into VENDA ...
Insert into NOTAFISCAL ...
Update ESTOQUE ...
para cada venda. SGBD
Problema 1: Alto volume de dados na rede
Como reduzir o tráfego na rede?
Cliente
Aplicação
Exemplo 3
Realizar a sequência
Insert into PESSOA ...
Insert into ALUNO ...
Cliente
Aplicação
Entretanto ...
O gargalo pode ser provocado pelo
próprio servidor de banco de dados.
Caberá ao desenvolvedor, em
SGBD
conjunto com o DBA, identificar
cada caso.
Problema 2: Manutenção
Aplicação
SGBD
Ou seja
Rotinas periódicas
Procedimentos armazenados
Módulos de programa armazenados pelo SGBD no servidor de banco de
dados
<corpo do procedimento> ;
Sintaxe para Funções
<corpo da função> ;
Parâmetros
No Mysql
CALL <nome do proc ou func>(<args>) ;
No Oracle
BEGIN
END
Comando de Controle (IF)
...
END IF ;
Comando de Controle Laço (WHILE)
Comando de Controle Laço (FOR)
Exemplo
IFMA Monte Castelo
Depto. de Computação
Sistemas de Informação
END
$$
DELIMITER ;
CALL Quantidade_Produtos(@total);
SELECT @total;
a variável poderá ser usada
posteriormente
Exemplo 3: parâmetro de entrada e saída
DELIMITER $$
Exemplos
OPEN nome
para abrir o cursor , que fará com que ele executea consulta;
Logo em seguida inicia o loop com a seguinte instrução
– nome_cursor : loop
CLOSE nome
Exemplo de Cursor no MySQL
CREATE PROCEDURE cursordemo()
BEGIN
DECLARE done INT DEFAULT FALSE;
DECLARE a CHAR(16);
DECLARE b, c INT;
DECLARE cur1 CURSOR FOR SELECT id,data FROM t1;
DECLARE cur2 CURSOR FOR SELECT i FROM t2;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
OPEN cur1;
OPEN cur2;
read_loop: LOOP
FETCH cur1 INTO a, b;
FETCH cur2 INTO c;
IF done THEN
LEAVE read_loop;
END IF;
IF b < c THEN
INSERT INTO test.t3 VALUES (a,b);
ELSE
INSERT INTO test.t3 VALUES (a,c);
END IF;
END LOOP;
CLOSE cur1;
CLOSE cur2;
END;
Fonte: http://dev.mysql.com/doc/refman/5.7/en/cursors.html
Cenário: controle de estoque
declare
media INT := 10;
begin
select avg(SALARY) into media from EMPLOYEES;
DBMS_OUTPUT.PUT_LINE(‘Media:’|| TO_CHAR(media) );
end;
Procedure no Oracle
Efeito
SELECT * FROM EMPLOYEES
WHERE EMPLOYEE_ID = 176;
Exemplo de Procedure com parametro OUT
-- Execução
DECLARE
v_name varchar(100);
BEGIN
PROC_NAME(176,v_name);
DBMS_OUTPUT.PUT_LINE(Nome:'||TO_CHAR(v_name));
END;
Exemplo com parametros in out no Oracle
-- Execução
DECLARE
ret VARCHAR(100);
BEGIN
FOR emp_rec IN (SELECT LAST_NAME FROM EMPLOYEES )
LOOP
DBMS_OUTPUT.PUT_LINE(Nome: ' ||
TO_CHAR(emp_rec.LAST_NAME) );
PROC_CONCAT(emp_rec.LAST_NAME);
DBMS_OUTPUT.PUT_LINE(‘Nome: ' ||
TO_CHAR(emp_rec.LAST_NAME) );
END LOOP;
END;
Exemplo de parametro IN OUT
create or replace
procedure pAtualizaEstoque(
idProd ESTOQUE.ID%TYPE,
qtdeComprada ESTOQUE.QTDE%TYPE,
valorUnitario ESTOQUE.VALOR_UNITARIO%TYPE)
cont...
is
total number;
begin
select count(id_produto) into total
from estoque where id_produto = idProd;
if (total > 0) then
DBMS_OUTPUT.PUT_LINE('Antes de atualizar ....');
update estoque
set qtde = qtde + qtdeComprada,
valor_unitario = valorUnitario
where id_produto = idProd;
else
DBMS_OUTPUT.PUT_LINE('Antes de inserir ....');
insert into estoque (id, id_produto,
qtde, valor_unitario)
values (seq_idEstoque.nextval, idProd,
qtdeComprada, valorUnitario);
end if;
end pAtualizaEstoque;
Parametros default
-- Execução
BEGIN
PROC_DEFAULT();
PROC_DEFAULT(3);
END;
Leitura Adicional
http://www.mysqltutorial.org/introduction-to-sql-stored-
procedures.aspx
Links interessantes
http://dev.mysql.com/doc/refman/5.1/en/stored-routines.html
http://www.mysqltutorial.org
http://www.databasejournal.com/features/mysql/article.php/3525581/My
SQL-Stored-Procedures-Part-1.htm
http://www.oficinadanet.com.br/artigo/2088/criando_stored_procedures_no_mysql
http://www.brainbell.com/tutorials/MySQL/Using_Stored_Procedures.htm