Você está na página 1de 45

BANCO DE DADOS 1: AULA 10

Lizianne P. M. Souto – liziannesouto@recife.ifpe.edu.br


2

OBJETIVOS
• Entender o que são Funções
• Entender o que são Triggers e sua importância prática na montagem de
rotinas após comandos de inserção, atualização ou remoção de dados
3

AGENDA
• STORED PROCEDURES
• FUNCTIONS
• Conceitos
• Tipos de Funções
• Exemplos
• TRIGGERS
• Conceitos
• Exemplos
4

STORED PROCEDURE (SP)


5

INTRODUÇÃO
• Stored Procedures são blocos de comandos que têm como objetivo
executar uma série de comandos SQL no servidor de banco de dados
• O conceito é análogo a criação de um método em uma linguagem de
programação, onde você pode chamar este método diversas vezes sem a
necessidade de reescrever código
• Exemplos de utilização:
• Implementação de rotinas de limpeza de dados não mais utilizados
• Correção de dados digitados errados
• Script para padronização da digitação de determinado campo
• Inserção conjunta de dados em mais de uma tabela
• etc
6

SINTAXE PARA STORED


PROCEDURE (SP)
• Essa é a forma básica para se construir um SP:
7

PARÂMETROS DE UM STORED
PROCEDURE
• Os parâmetros são opcionais e, caso não sejam necessários, devem
permanecer apenas os parênteses vazios na declaração do procedure
• Para que um procedimento receba parâmetros, é necessário seguir certa
sintaxe:
8

PARÂMETROS DE UM STORED
PROCEDURE
• Os valores possíveis para o modo são:
• IN: indica que o parâmetro é apenas uma entrada de dados, não podendo
ser usada para retorno;
• OUT: usado para parâmetros de saída;
• Para esse tipo não pode ser informado um valor direto (como ‘tese’, 1 ou 2.3),
deve ser passada uma “variável por referência”
• INOUT: como é possível imaginar, esse tipo de parâmetro pode ser usado
para os dois fins (entrada e saída de dados)
• Nesse caso também deve ser informada uma variável e não um valor direto
9

USANDO VARIÁVEIS NO CORPO


DO PROCEDIMENTO
• Sintaxe para declaração de variáveis:

• Formas de definir um valor para uma variável:


• SET (no caso de passagem direta de valor), ou
• INTO (no caso de associação de valores dentro de consultas)
• Uma variável definida dentro de um bloco BEGIN/END é válida somente
dentro dele
10

SP COM PARÂMETROS DE
ENTRADA
11

SP COM PARÂMETROS DE SAÍDA


12

SP COM PARÂMETROS DE
ENTRADA E SAÍDA
13

ATENÇÃO
• Ao trabalharmos com o SGBD PostgreSQL não temos necessariamente a
função Stored Procedure (SP) definida, como podemos encontrar em
diversos outros tipos de SGBD’s, como o MYSQL, por exemplo.
• As SPs no Postgres são definidas como FUNCTIONS, assim como as triggers,
tornando esse recurso um pouco mais complicado, dependendo inclusive
do seu tipo de retorno.

• Dessa forma, os exemplos apresentados nos slides sobre SP não executará


no PostgreSQL.
14

FUNÇÕES
15

FUNÇÕES
• Assim como ocorre com os Store Procedures, é possível ter uma
sequência de comandos SQL encapsulados em estruturas
denominadas funções
• Tanto os Stored Procedures como as Funções são procedimentos
executados diretamente no servidor SQL Server, porém o Stored
Procedure não tem obrigação de retornar valores para o usuário. Já
a Função sim, ela deve retornar sempre um determinado dado eu
até mesmo um conjunto de dados
16

FUNÇÕES (CONTINUAÇÃO)
• As funções internas já foram exploradas anteriormente (AVG, MIN,
SUM...). Aqui as funções são definidas de acordo com o que é
necessário para o usuário, com parâmetros de entrada e variáveis
locais.
• Uma função é executada como uma parte de uma expressão.
17

FUNÇÕES
As funções podem ser utilizadas do mesmo modo que uma função
interna, sendo mais usada como:
• uma expressão na lista de um comando SELECT;
• uma expressão em uma cláusula WHERE ou HAVING;
• uma expressão em uma cláusula ORDER BY ou GROUP BY;
• uma expressão na cláusula SET de um comando UPDATE;
• uma expressão na cláusula VALUES de um comando INSERT.
18

FUNÇÕES
• Construção sintática:

CREATE FUNCTION nome_da_funcao (parâmetros de entrada)


RETURNS tipo_de_retorno
BEGIN
comandos em SQL
RETURN valor_de_retorno
END;
19

FUNÇÕES
• Apagar Função :
• Sintaxe
• DROP FUNCTION nome_função;

• Chamar Função:
• Sintaxe
• SELECT nome_função;
20

FUNÇÕES: EXEMPLO 1

Tabela Fucnionario: insert into funcionario(nome, salario, idade)


Values ('Mario',2500, 35);
CREATE TABLE funcionario(
nome varchar, insert into funcionario(nome, salario, idade)
salario numeric, ('Joana', 2500, 28)
idade integer Inserção de registros
); insert into funcionario(nome, salario, idade)
('João da Silva', 8000, 38)

insert into funcionario(nome, salario, idade)


(‘Caroline', 1800, 48)
21

FUNÇÕES: EXEMPLO 1
• Criar função para selecionar a quantidade de funcionários no banco de dados

delimiter $$
Para termos o retorno da função por
create function total_funcionario() meio de uma variável, é necessário
returns int declará-la como variável local no
MySQL
begin
declare total_funcionarios int;
select count(*) into total_funcionarios from funcionario;
return total_funcionarios;
end $$
delimiter;
22

FUNÇÕES: EXEMPLO 1
• Chamar função:
• Select total_funcionario();

Existem 4 funcionários no BD
23

FUNÇÕES: EXEMPLO 2
• Criar função para somar os salários dos funcionários:

delimiter $$
create function totalsalario()
returns float
begin
declare soma float;
select sum(salario) into soma from funcionario;
return soma;
end $$
delimiter;
24

EXERCÍCIO 1
No MySQL:
1. Criar a tabela Funcionario(codigo, nome, email, telefone, profissao,
endereco, salario).
2. Inserir os dados na tabela Funcionario.
3. Criar uma função que recebe o código do funcionário como argumento
e dobra o salário dele.
25

EXEMPLO DE CRIAÇÃO DE FUNÇÕES NO


POSTGRESQL
26

SINTAXE PARA FUNTION


• Essa é a forma básica para se construir uma Função em SQL no PostgreSQL:
CREATE FUNCTION nomeFuncao (parametros)
RETURNS int AS
$$
//corpo da função
$$
language sql;

• Chamar uma Função:


Select nomeFuncao(parametros);

• Excluir uma Função:


DROP FUNCTION nome_Funcao(parametros);
27

EXEMPLO 1

Tabela Empregados:

CREATE TABLE funcionario ( insert into funcionario(nome, salario, idade)


nome varchar, Values ('Mario', 500, 35);
salario numeric,
idade integer Inserção de registros insert into funcionario (nome, salario, idade)
); ('Joana', 1000, 28)
28

EXEMPLO 1
Criação da Função:

create function dobrarSalario(funcionario ) returns numeric as


$$
select $1.salario * 2;
$$ language sql;

Chamando a Função:

SELECT nome, dobrarSalario(funcionario) AS novoSalario


FROM funcionario
saída
29

TRIGGERS (GATILHOS)
Exemplos MYSQL
30

TRIGGERS (GATILHOS)
• Vamos criar um banco de dados com as seguintes tabelas:

Estoque

QUANTIDADE: INT
31

TRIGGERS (GATILHOS)
• Procedimentos invocados quando um comando DML é executado (INSERT,
UPDATE ou DELETE)

Usuário faz um
pedido: Gatilho de Baixa Tabela ESTOQUE
INSERT NA TABELA Estoque Coluna Quantidade
ITEM
32

TRIGGERS (GATILHOS)
• Usos de um Trigger:
• Validação e Integridade de dados
• Rastreamento de logs de tabelas
• Arquivamento de registros históricos
• Um Trigger é associado a uma única tabela
• É executado automaticamente (diferente dos Stored Procedures e Funções)
33

TRIGGERS (GATILHOS)
• Sintaxe:

CREATE TRIGGER <nome-do-trigger>


BEFORE | AFTER <comando DML>
ON <nome-da-tabela>
FOR EACH ROW <comando>

• BEFORE | AFTER : O comando será executado antes ou depois da


ação do comando DML
• <comando DML>: INSERT, UPDATE ou DELETE
34

EXEMPLO DE GATILHOS
• Suponha clientes comprando produtos por meio de pedidos. Esses clientes
podem fazer vários pedidos e em cada pedido que fazem podem comprar
muitos produtos. Você realiza a venda de cada produto, registrando os
dados na tabela ItensVendidos. A cada item vendido, seu sistema deve
realizar a baixa da quantidade vendida desse produto no estoque. Para
fazer esta baixa de estoque, você pode utilizar um gatilho.
35

GATILHOS
• Criando o gatilho:
36

EXEMPLO DE GATILHOS
• Tabela Estoque:

• insert into item(pedido, produto, quantidade) values(1, 3, 10);

Tabela Estoque depois da inserção de 10 unidades do produto (código 3)


no pedido 1
37

EXEMPLO DE GATILHOS
• Para disparar o gatilho anterior, execute os seguintes comandos:
• Inserindo um novo pedido:
insert into pedido(pedcodigo, data, endereco, cliente)
values (9, '2017-12-01', 'rua x', 1)

• Inserindo um novo item:


insert into item (pedido, produto, quantidade)
values (9, 2, 15)
38

TRIGGERS (GATILHOS)
Exemplo de criação de Triggers no PostgreSQL
39

EXEMPLO 1
• Exemplo: Ao inserirmos um novo registro na tabela de Funcionarios,
gostaríamos de salvar em uma tabela Funcionário_Auditoria, o dia e a hora
que esse funcionário foi inserido na tabela Funcionários.
40

EXEMPLO 1
• Criar a tabela Funcionários

CREATE TABLE Funcionarios


(
codigo int,
nome varchar(30) NOT NULL,
email varchar(30) NOT NULL,
telefone varchar(30) NOT NULL,
profissao varchar(30) (150) NOT NULL,
endereco varchar(30) (100) NOT NULL,
salario float,
Primary key (codigo)
)
41

EXEMPLO 1
• Criar a tabela Funcionarios_Auditoria

CREATE TABLE Funcionarios_auditoria (


codigo INT NOT NULL,
data_alteracao TEXT NOT NULL
);
42

EXEMPLO 1
• Criar a Função da Trigger
A variável NEW é do tipo CREATE funcionario_log_func()
RECORD e contém uma nova RETURNS trigger AS $teste_trigger$
linha a ser armazenada com BEGIN
base nos comandos INSERT INTO funcionarios_auditoria
INSERT/UPDATE das triggers a (codigo, data_alteracao)
nível de linha
VALUES
(new.codigo, current_timestamp);
PLpgSQL é uma linguagem RETURN NEW;
estrutural estendida da SQL END;
que tem por objetivo auxiliar as
$teste_trigger$ LANGUAGE plpgsql;
tarefas de programação
no PostgreSQL
43

EXEMPLO 1
• Criar a Trigger

CREATE TRIGGER teste_trigger


AFTER INSERT ON funcionarios
FOR EACH ROW
EXECUTE PROCEDURE funcionario_log_func();
44

EXEMPLO 1
• Inserir os dados:
INSERT INTO FUNCIONARIOS (codigo, nome, email, telefone, profissao, endereco,
salario) VALUES (2, 'Marilia Késsia', 'mkessia.dionisio@gmail.com', '(81)997402844',
'Analista de desenvolvimento', 'rua testes', 6000.00);
INSERT INTO FUNCIONARIOS (codigo, nome, email, telefone, profissao, endereco,
salario) VALUES (3, 'Caroline França', 'carol@gmail.com', '(81)997402800', 'Analista de
testes', 'rua testes', 2500.00);
INSERT INTO FUNCIONARIOS (codigo, nome, email, telefone, profissao, endereco,
salario) VALUES (4, 'João da Silva', 'joao@gmail.com', '(81)997401654', 'Analista de
finanças', 'rua testes', 8000.00);
INSERT INTO FUNCIONARIOS (codigo, nome, email, telefone, profissao, endereco,
salario) VALUES (5, 'Maria das Dores', 'maria@gmail.com', '(81)997407845', 'Secretaria',
'rua testes', 1800.00);
45

EXEMPLO 1
• Select * From Funcionarios

• Select * From Funcionarios_Auditoria


Ao inserirmos um novo registro
na nossa tabela de funcionários,
podemos ver que um novo
registro foi criado também na
tabela de funcionarios_auditoria