de Banco de Dados
STORED PROCEDURE
Procedimento armazenado um mdulo de lgica
procedimental mantido, administrado e executado
pelo SGBD.
A razo primria para ser utilizado mover as
regras de negcio da aplicao para o banco de
dados. Um procedimento armazenado no
fisicamente associado a outro objeto do banco de
dados, como os gatilhos de banco de dados,
podendo acessar e modificar uma ou mais tabelas.
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
Oracle PL/SQL
CREATE [OR REPLACE] PROCEDURE nomeproc [ (parmetro,...) ]
IS
corpo do procedimento: [declaraes]
(bloco PL/SQL)
BEGIN
[EXCEPTION]
END;
onde
parmetro: nomepar [IN | OUT | IN OUT] tipo
[ { := | DEFAULT } expresso ]
STORED PROCEDURE
CREATE PROCEDURE ELIMINA_CLIENTE
(IDCLIENTE IN INTEGER)
AS
ULTIMO VARCHAR2(50);
PRIMEIRO VARCHAR2(50);
BEGIN
SELECT SOBRENOME, NOME INTO ULTIMO, PRIMEIRO
FROM CLIENTE WHERE ID = IDCLIENTE;
INSERT INTO HISTORICO_CLIENTE
VALUES (IDCLIENTE, ULTIMO, PRIMEIRO);
DELETE FROM CLIENTE WHERE ID = IDCLIENTE;
EXCEPTION
WHEN NO_DATA_FOUND THEN
EXIBE_MSG_ERRO (ID DE CLIENTE INVLIDA);
END ELIMINA_CLIENTE;
Stored Procedures
Sintaxe MySQL
CREATE PROCEDURE sp_name
([parameter[,...]])
[characteristic ...]
BEGIN
<corpo da rotina>
END
[parameter:
[ IN | OUT | INOUT ] nome_parametro tipo
tipo:
Qualquer tipo de dados vlidos no MySQL
characteristic:
LANGUAGE SQL
[NOT] DETERMINISTIC
SQL SECURITY {DEFINER | INVOKER}
COMMENT string
procedure
Param1, Param2 parmetros
Corpo:
Select * from INFORMATION_SCHEMA.ROUTINES
Declaraes de procedimento em SQL vlida
Ronaldo Celso Messias Correia
ronaldo@fct.unesp.br
END $$
DELIMITER ;
CALL simpleproc()
DELIMITER //
CREATE PROCEDURE inserecliente(v_nome VARCHAR(60),
v_endereco VARCHAR(20))
BEGIN
ELSE
END;
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 ENDEREO devem ser fornecidos para o cadastro!' AS Msg;
END IF;
END;
Variveis de Usurio
MYSQL
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= ...]
Variveis de Usurio
MYSQL
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
Variveis Locais
Variveis locais no so case sensitives, ou seja, VAR, var, VaR e vAr so a mesma
coisa. O que devemos nos atentar quanto ao seu escopo.
O escopo das variveis locais no MySQL definido pela sua posio, aninhada em
blocos de uma procedimento armazenado no servidor de bancos de dados
MySQL.
Estudo de Caso
Sistema para Aluguel de Carros
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;
IF condition THEN
statement/;s
ELSE statement/s;
ENDIF
CASE variable
WHEN condio1 statement/s;
WHEN condio2 statement/s;
ELSE
statement/s
END CASE
REPEAT
statement/s;
UNTIL condio
END REPEAT
WHILE condio DO
statement/s;
END WHILE
Manipuladores e
Cursores
Com o advento das stored procedures, certas condies podem
exigir tratamento especfico. Estas condies podem ser
relacionadas a erros, bem como controle de fluxo geral dentro da
rotina.
Manipuladores permitem executar declaraes caso certa
condio esteja presente
Cursores permitem interar atravs de um resultset, processandoo linha a linha.
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
Tratamento de Erros
O tratamento de erros dentro de procedimentos armazenados no MySQL
baseado em condies.
Caso uma determinada condio for atendida, um erro que podemos
personalizar, baseado nos tipos de condies existentes, ser disparado.
Tratamento de Erros
DECLARE handler_type HANDLER FOR condition_value[,...] sp_statement
handler_type:
CONTINUE
| EXIT
| UNDO
condition_value:
SQLSTATE [VALUE] sqlstate_value
| condition_name
| SQLWARNING
| NOT FOUND
| SQLEXCEPTION
| mysql_error_code
O SQLSTATE aparecer sempre que um erro for enviado a um usurio quando este
executa uma operao ilegal ou que viole a integridade dos dados.
Quando tentar inserir uma informao duplicada em uma coluna que chave
primria de uma tabela, o erro 1062 com o SQLSTATE 23000 retornado
Ao enviar um dado do tipo CHAR para ser inserido em uma coluna do tipo INT,
causar um WARNING e uma mensagem de truncamento dos dados, condio
declarada no HANDLER com a condio EXIT que encerrar o procedure.
Cursores em MySQL
O MySQL no suporta todas as recursos dos cursores
Os Cursores no MySQL so no sensitivos (no devemos atualizar uma tabela
enquanto estamos usando um cursor); so somente leitura (no podemos fazer
atualizaes usando a posio do cursor); e s podemos avanar para o prximo
registro e no para traz e/ou para frente
So usados para acessar um resultset que possa recuperar uma ou mais linhas.
So usados para posicionar um ponteiro em uma linha especfica
TRIGGER (Gatilhos)
Triggers - Gatilhos
Diferem da stored procedures pelo fato de no serem chamados diretamente pelo usurio: quando ocorre um determinado evento
na tabela, eles so executados
Possibilitam:
Triggers - Sintaxe
CREATE
[DEFINER = {user | CURRENT_USER}
TRIGGER nome_trigger tempo_trigger evento_trigger
ON nome_tabela FOR EACH ROW
BEGIN
declarao_trigger
END
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.
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 //
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;
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
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 //
Generators (MySQL)
ou
Sequence (Oracle)
Generators - Sintaxe
CREATE GENERATOR <nome>
Nome nico em todo o banco de dados
SET GENERATOR <nome> TO <nmero>
Pode ter qualquer valor inteiro entre 264 e 264 1
GEN_ID(<nome>,<passo>)
Retorna o valo do generator. Para obter o valor atual do
generator, usar a funo com passo 0
Ronaldo Celso Messias Correia
ronaldo@fct.unesp.br
Oracle PL/SQL
CREATE [OR REPLACE] TRIGGER nome_do_trigger
tempo do trigger: BEFORE ou AFTER
evento disparador: DELETE ou INSERT ou UPDATE [OF coluna]
nome da tabela:
ON tabela
tipode trigger:
de comando ou de linha [FOR EACH ROW]
condio:
WHEN clusula
corpo do trigger: [declaraes]
(bloco PL/SQL)
BEGIN
[EXCEPTION]
END;
TRIGGER (Gatilhos)
CREATE TRIGGER DELETA_CLIENTE
BEFORE DELETE ON CLIENTE
FOR EACH ROW
BEGIN
INSERT INTO HISTORICO_CLIENTE
VALUES (:OLD.ID, :OLD.SOBRENOME, :OLD.NOME);
END DELETA_CLIENTE;
OBS: Referncias a atributos em eventos
DELETE :OLD (valores deletados)
INSERT :NEW (valores inseridos
UPDATE :OLD :NEW
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
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
Funes
Uma funo definida pelo usurio computa
e retorna um resultado baseado num
conjunto de valores de entrada. Uma vez
definida e criada dentro do SGBD, torna-se
disponvel para ser utilizada at mesmo em
sentenas SQL
Funes Oracle
CREATE FUNCTION procuraid(primeiro IN CHAR(50), ultimo IN CHAR(50))
RETURN INTEGER AS
idcli INTEGER;
BEGIN
SELECT id INTO idcli FROM cliente
WHERE sobrenome=ultimo AND renome=primeiro;
RETURN idcli;
EXCEPTION
WHEN NO_DATA_FOUND THEN
raise_application_error(-20130,'ID de Cliente Invlida');
END procuraid;
SELECT *
FROM pedidos
WHERE id_cliente=procuraid('Renata','Terra');
MySQL Funo
CREATE FUNCTION saudacao (s CHAR(20))
RETURNS CHAR(50)
-RETURN CONCAT(Boa Noite ',s,'!');
Executando > SELECT saudacao(Turma');
Resposta da Funo: Boa Noite Turma!
Definio de vises
CREATE VIEW <nome-de-viso> [ (lista-de-colunas) ]
AS <comando-de-seleo>