Sie sind auf Seite 1von 51

Aula 3

SISTEMA GERENCIADOR
DE BANCO DE DADOS

Prof. Martin Morães


Conversa Inicial
Programas Armazenados

 Procedures, triggers
e funções
 Programação dentro
do DB.
 Como criá-los e
utilizá-los.
Contextualizando
Programas Armazenados
 Automatizar rotinas:
 Log
 Atualização de estoque
 Validações
 Etc...
Pesquisa
Programas
Armazenados
Programas Armazenados
 Cada SGDB
implementa a sua
própria linguagem de
programação
 Comumente
denominadas de PL,
acrônimo para
“Procedural
Language”.
Programas Armazenados
 Cada SGDB
implementa a sua
própria linguagem de
programação
 Comumente
denominadas de PL,
acrônimo para
“Procedural
Language”.
Programas Armazenados
 As “procedures”
 As “function”
 As “trigger”
Delimitadores
Programas Armazenados
Delimitadores
 Toda instrução SQL
tem de terminar com
um caractere
delimitador.
Programas Armazenados
Delimitadores
 Os programas
armazenados são
instrução SQL do tipo
CREATE
 Precisa ser encerrado
com um delimitador.
Programas Armazenados
Delimitadores

seq Código
1 Delimitador *
2 Cria procedure totaliza()
INÍCIO
Instrução SQL 1;
Instrução SQL 2;
Instrução SQL 3;
FIM*

3 Delimitador ;
Variáveis
Variáveis

 A sintaxe é:
DECLARE var_name [, var_name]
... type [DEFAULT value]

 Exemplo
DECLARE vlr, vlrUm int;
DECLARE vlrDois int
DEFAULT 5;
Variáveis

 Default NULL
 Atribuição
 SET vlr = 10;
 SELECT MIN(id),
MAX(id)
INTO num1, num2
FROM alunos;
Controle de fluxo
Controle de fluxo

 If
 Case
 While
 Repeat
Controle de fluxo - IF

 Sintaxe:
IF search_condition THEN
statement_list
[ELSEIF
search_condition THEN
statement_list] ...
[ELSE statement_list]
END IF
Controle de fluxo - IF

 Exemplo:
IF num1 = 1 THEN
SELECT "UM";
ELSEIF num1 > 1 THEN
SELECT "MAIOR";
END IF;
Controle de fluxo - CASE

 Sintaxe:
CASE case_value
WHEN when_value
THEN statement_list
[WHEN when_value
THEN statement_list] ...
[ELSE statement_list]
END CASE
Controle de fluxo - CASE

 Exemplo
CASE num1
WHEN 0 THEN
SELECT "ZERO";
WHEN 1 THEN
SELECT "UM";
WHEN 2 THEN
SELECT "DOIS";
END CASE;
Controle de fluxo - WHILE

 Sintaxe:
WHILE search_condition DO
statement_list
END WHILE
Controle de fluxo - WHILE

 Exemplo:
WHILE num2 > 10 DO
SET num2 =
num2 - 100;
END WHILE;
Controle de fluxo - REPEAT

 Sintaxe:
REPEAT
statement_list
UNTIL search_condition
END REPEAT
Controle de fluxo - REPEAT

 Exemplo:
REPEAT
SET num2 =
num2 - 10;
UNTIL num2 < 10
END REPEAT;
Procedimentos -
Procedure
Procedure

 Sintaxe:
CREATE PROCEDURE sp_name
([proc_parameter[,...]])
routine_body
Procedure

 Exemplo
CREATE PROCEDURE lista_prof_aluno()
BEGIN
SELECT p.nome, a.nome
from aula
left join alunos a
on aula.idaluno = a.id
left join professores p
on aula.idprofessor = p.id;
END
Procedure

 Executar a procedure
 Sintaxe:
CALL sp_name
([parameter[,...]])

CALL sp_name[()]
Procedure

 Exemplo
CALL lista_prof_aluno();
CALL lista_prof_aluno;
Procedure

 Especificando parâmetros
 IN
 OUT
 INOUT
Procedure - IN

 Exemplo:
CREATE PROCEDURE `lista_prof_aluno`(in idProf
int)
BEGIN
SELECT p.nome, a.nome
from aula
left join alunos a on
aula.idaluno = a.id
left join professores p on
aula.idprofessor = p.id
where
aula.idprofessor = idProf;
END
Procedure - IN

 Exemplo:
call lista_prof_aluno(101);
Procedure - OUT

 Variáveis de ambiênte
 SET @NUM = 10, @nome =
"MARTIN";
 SELECT @NUM, @nome;
Procedure - OUT
CREATE PROCEDURE
`lista_prof_aluno_TOTAL`(in idProf int, out
total int)
BEGIN
SELECT count(*) into total
from aula
left join alunos a on
aula.idaluno = a.id
left join professores p on
aula.idprofessor = p.id
where
aula.idprofessor = idProf;
END
Procedure - OUT
 set @total_registros = 0;
 call lista_prof_aluno_TOTAL (101,
@total_registros);
 select @total_registros;
Procedure - INOUT
CREATE PROCEDURE
`lista_prof_aluno_TOTAL`(inout total int)
BEGIN
SELECT count(*) into total
from aula
left join alunos a on
aula.idaluno = a.id
left join professores p on
aula.idprofessor = p.id
where
aula.idprofessor = total;
END
Procedure - INOUT
 set @total_registros = 101;
 call lista_prof_aluno_TOTAL
(@total_registros);
 select @total_registros;
Gatilhos - Triggers
Triggers
 Na criação define-se:
 Um nome
 Ocasião
 “BEFORE” ou “AFTER”.
 Eventos
 “insert”
 “update”
 “delete”.
 Tabela
 Ordem
Triggers
 Sintaxe:
CREATE TRIGGER trigger_name
trigger_time trigger_event
ON tbl_name
FOR EACH ROW
[trigger_order]
trigger_body
Triggers

 Exemplo
DELIMITER //
CREATE TRIGGER contador
AFTER INSERT
ON professores
FOR EACH ROW
BEGIN
SET @Total = @Total+1;
END//
DELIMITER ;
Triggers

 Os operadores
 “OLD”
 “NEW”
Triggers

CREATE TRIGGER contador


AFTER INSERT ON professores
FOR EACH ROW
BEGIN
SET @Total =
@Total+1;

SET @NOMES =
CONCAT_WS(';',
@NOMES,
NEW.nome);
END
Triggers

SET @NOMES = "A";


INSERT INTO
professores(nome)
VALUES("Aurélio")
,("David"),("João“
);

SELECT @NOMES;
# @NOMES
'A;Aurélio;David;João'
Triggers

 INSERT só tem
(NEW), não tem
(OLD).
 DELETE só tem
(OLD), não tem
(NEW).
 UPDATE temos
(NEW) e (OLD).
Síntese
Programas Armazenados

 Procedures, triggers
e funções
 Programação dentro
do DB.
 Como criá-los e
utilizá-los.
Programas Armazenados
 Automatizar rotinas:
 Log
 Atualização de estoque
 Validações
 Etc...