Anda di halaman 1dari 30

unesp

Variveis de Usurio
Para atribuir um valor a uma varivel em outras instrues
diferentes de SET utilizar o operador de atribuio := em vez de
=, porque = reservado para comparaes em instrues
diferentes de SET:
SET @t1=0, @t2=0, @t3=0;
mysql> SELECT @t1:=(@t2:=1)+@t3:=4,@t1,@t2,@t3;
+----------------------+------+------+------+
| @t1:=(@t2:=1)+@t3:=4 | @t1 | @t2 | @t3 |
+----------------------+------+------+------+
| 5 | 5 | 1 | 4 |
+----------------------+------+------+------+

mysql> SET @X=oi;


mysql> SELECT @X

Ronaldo Celso Messias Correia ronaldo@fct.unesp.br


unesp
Triggers - Gatilhos
So procedimentos especiais ativados quando ocorre uma insero, atualizao ou excluso em uma tabela ou em uma view
Diferem da stored procedures pelo fato de no serem chamados diretamente pelo usurio: quando ocorre um determinado evento na tabela, eles so executados
Possibilitam:
Manter a integridade dos dados: atualizar tabelas associadas
Cria logs do sistema: a cada incluso
Notificaes de alteraes no banco aos usurios
Validao de restries de integridade mais complexas que as suportadas diretamente pelo SGBD

Ronaldo Celso Messias Correia ronaldo@fct.unesp.br


unesp
Triggers - Sintaxe
CREATE
[DEFINER = {user | CURRENT_USER}
TRIGGER nome_trigger tempo_trigger
evento_trigger
ON nome_tabela FOR EACH ROW
BEGIN
declarao_trigger
END

Ronaldo Celso Messias Correia ronaldo@fct.unesp.br


unesp
Triggers - Sintaxe
DEFINER: Quando o TRIGGER for disparado, esta opo ser checada para
checar com quais privilgios este ser disparado. Utilizar os privilgios do
usurio informado em user (ronaldo@localhost) ou os privilgios do
usurio atual (CURRENT_USER). Caso essa sentena seja omitida da
criao do TRIGGER, o valor padro desta opo CURRENT_USER();
Nome_trigger: define o nome do procedimento, por exemplo, trg_test;
Tempo_trigger: define se o TRIGGER ser ativado antes (BEFORE) ou
depois (AFTER) do comando que o disparou;
Evento_trigger: aqui se define qual ser o evento, INSERT, REPLACE,
DELETE ou UPDATE;
nome_tabela: nome da tabela onde o TRIGGER ficar "pendurado"
aguardando o trigger_event;
declaraes_trigger: as definies do que o o TRIGGER dever fazer
quando for disparado.

Ronaldo Celso Messias Correia ronaldo@fct.unesp.br


unesp
Trigger Exemplo 1
Trigger que atualiza o campo VALOR da tabela VENDAS
cada vez que se alterar a tabela de itens

delimiter //
CREATE TRIGGER InsItem AFTER INSERT ON Itens
FOR EACH ROW
BEGIN
UPDATE Vendas set valor = valor + New.ValorTotal
WHERE Pedido = New.Pedido;
END //
O alias NEW indica o registro que
est sendo inserido
Ronaldo Celso Messias Correia ronaldo@fct.unesp.br
unesp
Trigger Exemplo 2
Sistema para aluguel de carros - Atualizao da quilometragem
rodada por um carro aps sua devoluo

DELIMITER //
CREATE TRIGGER tr_kmrodados after update on reservas
FOR EACH ROW
UPDATE carros SET quilometragem = quilometragem +
NEW.quilometrosrodados WHERE NEW.carro_reserva =
carros.id;

Ronaldo Celso Messias Correia ronaldo@fct.unesp.br


unesp
Trigger Exemplo 3
Excluso de um item da tabela

delimiter //
CREATE TRIGGER DelItem AFTER DELETE ON Itens
BEGIN
UPDATE Vendas set valor = valor - OLD.ValorTotal
WHERE Pedido = OLD.Pedido;
END //

O alias OLD indica o registro que


est sendo apagado

Ronaldo Celso Messias Correia ronaldo@fct.unesp.br


unesp
Trigger Exemplo 4
Trigger para atualizao de dados
Set term # ;
CREATE TRIGGER AtuItem AFTER UPDATE ON Itens
BEGIN
IF (New.ValTotal <> OLD.ValTotal) THEN
UPDATE Vendas set valor = valor - OLD.ValorTotal +
New.ValTotal WHERE Pedido = OLD.Pedido;
END //

Ronaldo Celso Messias Correia ronaldo@fct.unesp.br


unesp
Stored Procedures Exemplo 5
Exemplo de utilizao de parmetro tipo IN

CREATE PROCEDURE sp_in (p VARCHAR(10))


SET @X = P;

Exemplo de utilizao de parmetro tipo OUT


CREATE PROCEDURE sp_out (OUT p VARCHAR(10))
SET P = ola;

Exemplo de utilizao de parmetro tipo INOUT


CREATE PROCEDURE sp_inout (INOUT p int)
BEGIN
SET @X = P * 2;
SET P = @X;
END;

Ronaldo Celso Messias Correia ronaldo@fct.unesp.br


Estudo de Caso unesp
Sistema para Aluguel de Carros

Ronaldo Celso Messias Correia ronaldo@fct.unesp.br


unesp

Stored Procedure
e Triggers
MySQL
Ronaldo Celso Messias Correia
ronaldo@fct.unesp.br
Ronaldo Celso Messias Correia ronaldo@fct.unesp.br
unesp
Stored Procedures
So funes escritas usando SQL e ficam armazenadas no
servidor
Podem receber parmetros e executar funes complexas,
retornando ou no as informaes para o usurio
Vantagens:
Minimizam o trfego da rede
So mais rpidos, aproveitam a capacidade do servidor e da otimizao do
SGBD
Facilitam a manuteno. Pode ser acessada por diversos programas, se
houver alguma modificao a ser feita, basta faz-la no BD
A resposta curta , sempre que voc puder. No existem desvantagens em se
usar stored procedures.
Limitaes:
Passar qualquer informao varivel para a stored procedure como
parmetros ou coloca-las em uma tabela que a stored procedure possa
acessar.
A linguagem de escrita de stored procedures e triggers pode ser muito limitada
para operaes mais complexas.

Ronaldo Celso Messias Correia ronaldo@fct.unesp.br


unesp
Stored Procedures - Sintaxe
CREATE PROCEDURE sp_name ([parameter[,...]])
[characteristic ...] <nome> - o nome da store
BEGIN
<corpo da rotina>
procedure
END Param1, Param2 parmetros
[parameter: VendaDatas(Data1 Date, Data2 Date)
[ IN | OUT | INOUT ] nome_parametro tipo
tipo:
Qualquer tipo de dados vlidos no MySQL
Cada parmetro um
parmetro IN por default
characteristic: IN Parmetro de entrada
LANGUAGE SQL OUT Parmetro de
[NOT] DETERMINISTIC sada (seraassumido
SQL SECURITY {DEFINER | INVOKER} NULL como valor de
COMMENT string entrada)
Corpo:
INOUT Entrada e Sada
Declaraes de procedimento em SQL vlida

Ronaldo Celso Messias Correia ronaldo@fct.unesp.br


unesp
Stored Procedures Exemplo 1
DELIMITER $$

DROP PROCEDURE IF EXISTS simpleproc $$


CREATE PROCEDURE simpleproc()
BEGIN
SELECT 'OLA';
END $$ O exemplo usa o comando delimiter
para alterar o delimitador de instruo
para antes da definio do procedure.
DELIMITER ; Isto permite que o delimitador ;
(padro) usado no corpo de
procedure seja passado para o
Para executar o procedimento servidor em vez de ser interpretado
CALL simpleproc() pelo MySQL

Ronaldo Celso Messias Correia ronaldo@fct.unesp.br


unesp
Stored Procedures Exemplo 2
DELIMITER //
CREATE PROCEDURE inserecliente(v_nome VARCHAR(60), v_endereco
VARCHAR(20))
BEGIN
IF ((v_nome != '') && (v_endereco != '')) THEN
INSERT INTO cliente (nome, cpf) VALUES (v_nome, v_endereco);
ELSE
SELECT 'NOME e CPF devem ser fornecidos para o cadastro!' AS Msg;
END IF;
END; CREATE TABLE cliente (
codigo int auto_increment primary key,
nome varchar(60) not null unique,
endereco varchar(40) not null,
sexo varchar(1),
data_cadastro timestamp default current_timestamp);

Para executar o procedimento


CALL inserecliente (jose da silva', Rua das flores');
Ronaldo Celso Messias Correia ronaldo@fct.unesp.br
unesp
Stored Procedures Exemplo 3
DELIMITER //
CREATE PROCEDURE updatecliente(v_id int, v_nome VARCHAR(60),
v_endereco VARCHAR(20))
BEGIN
IF ((v_id > 0) && (v_id !='' ) && (v_nome != '') && (v_endereco != '')) THEN
UPDATE cliente SET nome = v_nome, endereco=v_endereco WHERE
id = v_id;
ELSE
SELECT 'NOME e CPF devem ser fornecidos para o cadastro!' AS Msg;
END IF;
END;

Para executar o procedimento


CALL updatecliente (10,jose da silva xavier', Rua do Amor Perfeito');

Ronaldo Celso Messias Correia ronaldo@fct.unesp.br


unesp
Stored Procedures Exemplo 4
DELIMITER //
CREATE PROCEDURE deletecliente(v_id int)
BEGIN
IF ((v_id > 0) && (v_id !='' )) THEN
DELETE FROM cliente WHERE id = v_id;
ELSE
SELECT ID no informado AS Msg;
END IF;
END;

Para executar o procedimento


CALL deletecliente (10);

Ronaldo Celso Messias Correia ronaldo@fct.unesp.br


unesp
Variveis de Usurio
O MySQL suporta variveis especficas da conexo com a sintaxe
@nomevarivel
As variveis no precisam ser inicializadas.
Elas contm NULL por padro e podem armazenar um valor
inteiro, real ou uma string.
Todas as variveis de uma thread so automaticamente liberadas
quando uma thread termina.
Variveis de usurios devem ser utilizadas em expresses onde
so permitidas.
O tipo padro de uma varivel baseada no tipo da varivel no
incio da instruo. (Assume-se que uma varivel no atribuda
possui o valor NULL e do tipo STRING).

SET @varivel= { expressao inteira | expressao real | expressao string }


[,@varivel= ...]
Ronaldo Celso Messias Correia ronaldo@fct.unesp.br
unesp
Stored Procedures Exemplo 6
Sistema para aluguel de carros - LOCAO

DELIMITER //
CREATE PROCEDURE registrarlocacao(v_diarias int, v_datalocacao DATE,
v_carro int, v_sede int)
BEGIN
// Inserindo registro de nova reserva
INSERT INTO reservas (diarias, datalocacao, carro_reserva, sedelocacao)
VALUES (v_diarias, v_datalocacao, v_carro, v_sede)

// Atualizando a situao do carro


UPDATE carros SET situacao = alugado WHERE id = v_carro
END;

Ronaldo Celso Messias Correia ronaldo@fct.unesp.br


unesp
Stored Procedures Exemplo 7
Sistema para aluguel de carros - DEVOLUO

DELIMITER //
CREATE PROCEDURE registrardevolucao(v_reserva int, v_dataretorno DATE, v_quilometrosrodados
float(8,2), v_multa float(10,2), v_total float(10,2), v_sedelocacao int, v_sededevolucao int))
BEGIN
// Atualizando registro de nova reserva
UPDATE reservas SET dataretorno = v_dataretorno, quilometrosrodados = v_quilometrosrodados,
multa = v_multa, total = v_total, sededevolucao = v_sededevolucao WHERE id = v_reserva;

// Atualizando a situao do carro


IF (v_sedelocacao != v_sededevolucao) THEN
UPDATE carros SET situacao = fora do ponto de origem WHERE id = v_carro;
ELSE
UPDATE carros SET situacao = disponivel WHERE id = v_carro;
END IF
END;

Ronaldo Celso Messias Correia ronaldo@fct.unesp.br


unesp
Desvios Condicionais e Iteraes
IF condition THEN
IF THEN ELSE statement/;s
ELSE statement/s;
ENDIF
ENDIF

create procedure sp_lista_clientes(in opcao integer)


begin
if opcao = 0 then
select * from cliente where sexo = F;
else
if opcao = 1 then
select * from cliente where sexo = M;
else
select * from cliente;
end if;
end if;
end $$ Ronaldo Celso Messias Correia ronaldo@fct.unesp.br
unesp
Desvios Condicionais e Iteraes
CASE variable
CASE WHEN condio1 statement/s;
WHEN condio2 statement/s;
ELSE
statement/s
END CASE
ENDIF

create procedure sp_lista_clientes(in opcao integer)


begin
CASE opcao
WHEN 0 THEN select * from cliente where sexo = F;
WHEN 1 THEN select * from cliente where sexo = M;
else
select * from cliente;
END CASE;
END
Ronaldo Celso Messias Correia ronaldo@fct.unesp.br
unesp
Desvios Condicionais e Iteraes
REPEAT
REPEAT UNTIL statement/s;
UNTIL condio
END REPEAT
ENDIF

create procedure sp_repeat(in var1 integer)


begin
REPEAT
SELECT var1;
set var1 = var1 + 1;
UNTIL var > 5;
END REPEAT;
END;

Ronaldo Celso Messias Correia ronaldo@fct.unesp.br


unesp
Desvios Condicionais e Iteraes
WHILE WHILE condioo DO
statement/s;
END WHILE
ENDIF

create procedure sp_while(in var1 integer)


begin
WHILE (var1 < 20) DO
SELECT var1;
set var1 = var1 + 1;
END WHILE;
END;

Ronaldo Celso Messias Correia ronaldo@fct.unesp.br


unesp
Manipuladores e Cursores
Manipuladores permitem executar declaraes caso certa condio
esteja presente
Cursores permitem interar atravs de um resultset, processando-o
linha a linha.
H dois tipo de manipuladores suportados pelo MySQL
EXIT: encerram imediatamente o bloco BEGIN/END corrente

CONTINUE: permite ao processo continuar depois que as aes


do manipulador foram executados
Cursores: O termo um acrnimo para CURrent Set Of Records
(conjunto de registros corrente)
So utilizados para posicionar um ponteiro em uma linha
especfica e podem permitir atualizaes para as linhas com base
na posio atual (O MySQL no suporta)

ENDIF

Ronaldo Celso Messias Correia ronaldo@fct.unesp.br


unesp
Stored Procedures Sintaxe Interbase
set term # ;
create procedure VendaData (Data1 Date, Data2 Date)
returns (Data Date, Val Numeric(18,4))
as
begin
for select Data, sum(Valor-Desconto) as Val From vendas
where Data between :Data1 and :Data2
group by Data
into : Data, :Val;
do
suspend;
end #
set term ; #
unesp
Exerccios
1 Considerando a tabela auditoria_salario
com os seguintes atributos:
func_codigo: cdigo do funcionrio
salrio_inicial: salrio antes de ser alterado
salrio_alterado: novo salrio do funcionario
data_alterao: data da alterao do salrio
nome_usurio: usurio que realizou a alterao do salrio do
funcionrio

Criar um trigger que, ao alterar o salrio de


um empregado, registrar corretamente na
tabela auditoria_salario as atualizaes.

Ronaldo Celso Messias Correia ronaldo@fct.unesp.br


unesp
Exerccios
2- Cria uma store procedure chamada alteraSalFunc,
que altera o salrio de um funcionrio de acordo com
o nmero de dependentes que ele possui. Por
exemplo, se o funcionrio possuir 1 dependente, ele
ter um aumento de 10%; se o funcionrio possuir 2
dependentes, ele ter um aumento de 20%; e assim
por diante. Deve ser passado como parmetro para a
funo o nome completo do funcionrio, e a funo
deve retornar a porcentagem de aumento do salrio
do empregado, alm de atualizar o salrio do
funcionrio de forma adequada no banco de dados.

Ronaldo Celso Messias Correia ronaldo@fct.unesp.br


unesp
Funes
Retornam valores (podem inclusive serem
calculados);
Tambm servem para criar UDF's (Funes
definidas por usurios);
Sintaxe do comando:
create function <identificador>
(<identificador_parmetro> <tipo> [,...]) returns <tipo>
begin
end;
unesp
Exemplo
Retornando a mdia:
create function calcMedia (codNota int)
returns numeric(4,1)
begin
declare n1 numeric(4,1);
declare n2 numeric(4,1);
select nNota1, nNota2 from tbNotas where iNota_id = codNota
into n1, n2;
return (n1 + n2) / 2;
end;
Executando:
select calcMedia (101);