Vous êtes sur la page 1sur 8

Execuo da etapa 2.

Aula-tema: SQL: Procedures, SQL: Triggers.


Esta atividade importante para voc aprender a criar procedures e triggers para realizar
a programao no banco de dados. Para realiz-la, devem ser seguidos os passos
descritos.
Passo 1 (Aluno)
Fazer uma pesquisa no livro texto ou nos livros complementares da disciplina sobre os
fundamentos para criao e utilizao de Triggers e Procedures. Em seguida, elaborar
um tutorial mostrando os procedimentos para programar procedures e triggers. O
tutorial deve conter pelo menos cinco pginas.
Bibliografia Complementar
HEUSER, Carlos Alberto. Projeto de Banco de Dados. 6 ed. Porto Alegre: Bookman,
2009.
DATE, C. J. Introduo a Sistemas de Bancos de Dados. 8 ed. Rio de Janeiro:
Campus - Elsevier, 2004.
ELMASRI, Ramez; NAVATHE, Shamkant (orgs.). Sistemas de Banco de Dados. 4
ed. Rio de Janeiro: Pearson - Addison Wesley, 2005.

Sites sugeridos para pesquisa


Triggers e Procedures (Captulos 38.9 e 38.10) para PostgreSQL. Disponvel em: .
Acesso em: 03 abr. 2013.
Procedures e Triggers (Captulos 19.2 e 19.3) para MySQL. Disponvel em: . Acesso
em: 03 abr. 2013.

Passo 1
Neste tutorial iremos abordar sobre os fundamentos para a criao de uma trigger e e
procedore.
Mas no caso o que seria uma procedure e um conjunto de rotinas a ser executado.
Um procedimento consiste em um conjunto de declaraes agrupadas como uma
unidade para solucionar um problema especifico ou executar um conjunto de tarefas

relacionadas um procedimento criado e armazenado de uma forma compilada no


banco de dados e pode ser executado por um ou mais usurios
ou por um aplicativo de banco de dados.
Uma procedure um grupo de comandos SQL que executam uma determinada tarefa
ao contrrios de uma trigger que executada automaticamente quando um evento de
disparo ocorre uma procedure precisa ser chamada a partir de um programa ou ser
executada manualmente por um usurio uma procedure pode ser utilizada por diferentes
ususrios ou por muitas aplicaes uma procedure totalmente porttil dentro de um
banco de dados.
Uma procedure pode reduzir seu trafico de rede porque depois de chamada a primeira
vez ela fica no cach de memria. E podemos criar 5 procedimetos bsicos que so
Procedimentos Locais So criados a partir de um banco de dados do prprio usurio;
Procedimentos Temporrios Existem dois tipos de procedimentos temporrios:
Locais, que devem comear com # e Globais, que devem comear com ##;
Procedimentos de Sistema Armazenados no banco de dados padro do SQL Server
(Master), podemos indentifica-los com as siglas sp, que se origina de stored procedure.
Tais procedures executam as tarefas administrativas e podem ser executadas a partir de
qualquer banco de dados. Procedimentos Remotos Podemos usar Queries Distribudas
para tais procedures. So utilizadas apenas para compatibilidade.Procedimentos
Estendidos Diferente dos procedimentos j citados, este tipo de procedimento recebe a
extenso .dll e so executadas fora do SGBD SQL Server. So identificadas com o
prefixo xp.
Quando utilizar uma procedure.
Quando temos vrias aplicaes escritas em diferentes linguagens, ou rodam em
plataformas diferentes, porm executam a mesma funo. Quando damos prioridade
consistncia e segurana.
Exemplo de criao de procedure.
Este um exemplo de uma stored procedure que executa uma consulta utlizando um
filtro por descrio, em uma tabela especfica de nosso banco de dados.
USE BancoDados
GO
CREATE PROCEDURE Busca Declarando o nome da procedure
@CampoBusca VARCHAR (20) Declarando varivel (note que utilizamos o @
antes do nome da varivel)
AS
SELECT Codigo, Descrio Consulta
FROM NomeTabela
WHERE Descricao = @CampoBusca Utilizando varivel como filtro para a consulta
Para executar uma procedure basta utiilizar a clusula EXECUTE seguido pelo nome da
procedure e na frente o valor a ser utilizado como parmetro.
Exemplo:
EXECUTE Busca teste.

Bem finalizo por aqui o assunto sobre procedure e vamos falar um pouco agora sobre as
trigger e sua utilizao.
Uma trigger um procedimento que permite executar automaticamente diversas
operaes como de insero atualizao ou excluso em uma tabela em seu banco de
dados. As triggers de banco de dados pode ser utilizadas de diversas maneiras como
para o gerenciamento do banco das informaes em seu banco de dados .Por exemplo
pode ser usado para automatizar a gerao a gerao de dados fazer a auditoria das
modificaes em banco implantar as restries complexas de integridade e personalizar
as autorizaes complexas de segurana.
Trigger uma das maneiras mais praticas de implementar rotinas para garantir
integridade de dados ou de operaes. As triggers so rotinas ou procedimentos que so
utilizados quando um comando insert, update ou delete executado em uma tabela ou
ate mesmo uma viso.
Uma trigger executada automaticamente sem a interferncia do usurios j uma
procedure por sua vez precisa ser explicitamente invocada. Esta que a grande
diferena entre os dois.
A principal aplicao de uma triggger a criao de consistncias de restrio de
acesso ao banco de dados como rotina de segurana. Ela pode executar comandos
contidos em seu bloco ou acionar as procedures para executar determinada tarefas e ela
esta associada a uma tabela e, em alguns casos a uma viso. O trigger pode fazer o papel
de uma constraint para forar alguma integridade de banco.
A trigger possue algumas restries como por exemplo no pode executar os comandos
commit, rollback ou savepoint, nem tampouco chamar procedures ou funes que
executam tarefas.
Uma trigger serve para:
Criar o contedo de uma coluna derivadas de outras .
Criar mecanismos de validao que envolvam pesquisas em mutiplas tabela.
Criar logs para registrar a utilizao de uma tabela
Atualizar outras tabelas em funo de incluso ou alterao da tabela atual.

Exemplo de criao de uma trigger.


Podemos criar um Trigger usando o comando Create Trigger do SQL Server ou atravs
do Enterprise Manager. A Sintaxe de um Trigger a seguinte:
CREATE TRIGGER trigger_name
ON { table | view }
[ WITH ENCRYPTION ]
{
{ { FOR | AFTER | INSTEAD OF } { [ INSERT ] [ , ] [ UPDATE ] }

[ WITH APPEND ]
[ NOT FOR REPLICATION ]
AS
[ { IF UPDATE ( column )
[ { AND | OR } UPDATE ( column ) ]
[ ...n ]
| IF ( COLUMNS_UPDATED ( ) { bitwise_operator } updated_bitmask )
{ comparison_operator }
column_bitmask [ ...n ]
}]
sql_statement [ ...n ]
}
}
a. ON Table - a tabela para o qual o trigger esta sendo criado
b. FOR - deve ser seguido do tipo de comando que acionam o trigger
c. AFTER - determina que o trigger somente sera disparado quando todas as rotinas
especificadas no comando de disparo forem executadas com sucesso
d. INSTEAD OF - Determina que o trigger ser executado ao invs do comando de
disparo do mesmo.
e. [ DELETE ] [INSERT] [UPDATE] - indicam o tipo de ao que deve disparar o
trigger.
Quando voc for criar um Trigger dever definir :
1. O nome
2. A Tabela para o qual o Trigger ir ser criado
3. Quando o Trigger dever ser disparado
4. Os comandos que determinam qual ao o Trigger dever executar.
E aqui encerro minha fala sobre as trigges.
Inicio do passo 2.
Elaborar um arquivo texto contendo os comandos para criao das procedures para o
sistema SIG atendendo os requisitos descritos a seguir:
Procedure ret_comissao_funcionario: calcula o valor da comisso dos funcionrios
baseado no valor de vendas e na porcentagem de comisso (campo comisso da tabela
funcionrio). A procedure deve calcular a comisso de todos os funcionrios do ms
informado se o parmetro cdigo funcionrio for igual a zero ou caso informado o
cdigo do funcionrio, calcular apenas a comisso do funcionrio informado.
Parmetros:
o Ms: o nmero referente ao ms a ser consultado.
o Ano: ano a ser consultado.
o Cdigo do funcionrio: 0 para todos os funcionrios ou o cdigo do funcionrio.
Campos Exibidos:

o nome funcionrio, valor da comisso.

create or replace ret_cimissao_funcionario( p_codigo in number,


p_mes in number,
p_ano in number
)
is
curso c_comi(cp_codigo in nunber) in
select f.nome,
f.comicao,
v.valortotal
from funcionario f,
venda v
where f.id_funcionario = v.funcionario_venda
and to_char(v.date,'mm/yyyy') = to_char(p_mes)||'/'to_char(p_ano)
and f.id_funcionario = nvl(cp_codigo,f.id_funcionario);
v_comicao number;
begin
if p_codigo = 0 then
for r_comi in c_comi(null)
loop
v_comicao := r_comi.valortotal * comicao;
dbms_output.put_line('Nome: '||r_comi||' Comisso: '||v_comicao);
end loop;
else
for r_comi in c_comi(p_codigo )
loop
v_comicao := r_comi.valortotal * comicao;
dbms_output.put_line('Nome: '||r_comi||' Comisso: '||v_comicao);
end loop;
end if;
end;
Procedure inc_item_venda. Insere o item de venda no banco de dados, calculando
valor total do item baseado em seu preo unitrio, quantidade e desconto. A procedure
deve calcular o valor do desconto conforme o tipo informado como parmetro
(porcentagem ou valor).
Parmetros:
o Cdigo venda: cdigo da venda que o item faz parte.
o Cdigo produto: cdigo do produto.
o Quantidade: quantidade do produto a ser vendido.
o Valor Unitrio: preo de venda do produto.

o Tipo do desconto: p para porcentagem ou v para valor.


o Valor do desconto: zero para nenhum desconto ou
valor.
create or replace procedure inc_item_venda(p_cod_venda number,
p_cod_produto number,
p_qtd number,
p_valor_uni number,
p_tipo_desconto VARCHAR2,
p_valor_desconto number) is
v_valor number;
v_valor_desconto number;
begin
if p_tipo_desconto = 'v' then
v_valor := (p_valor_uni * p_qtd) - p_valor_desconto;
v_valor_desconto := p_valor_desconto;
elsif p_tipo_desconto = 'P' then
v_valor_desconto := (p_valor_uni * p_qtd) * (p_valor_desconto / 100);
v_valor := (p_valor_uni * p_qtd) - v_valor_desconto;
else
raise_appication_error(-20100, 'Valor inesistente');
end if;
begin
insert into itemvenda
(iditemvenda,
venda_itemvenda,
produto_itemvenda,
qtd,
valorunitario,
valordesconto,
valortotal)
values
(seq_itemvenda.nextvall,
p_cod_venda,
p_cod_produto,
p_qtd,
p_valor_uni,
v_valor_desconto,
v_valor);
exception
when others then
raise_appication_error(-20100, 'Erro ao inserir item de venda');

end;
commit;
end;

Inicio do passo 3.
Elaborar um arquivo texto contendo os comandos para criao das trigger para o
sistema SIG atendendo os requisitos descritos a seguir:
Trigger atualiza_valor_venda: Aps a incluso, alterao ou excluso de um item de
venda a trigger deve
somar os valores totais de todos os itens da venda que ela pertence e atualizar o campo
valortotal da tabela de venda.
create or replace trigger tg_atualiza_valor_venda
BEFORE DELETE OR INSERT OR UPDATE ON itemvenda
for each row
declare
total number;

cada otimizao justificar o motivo das alteraes a serem realizadas e qual sua
importncia no desempenho da consulta.
Nesta consulta abaixo realizei uma contagem dos funcionrios que trabalham na
empresa a mais de 4 anos e ganham acima de quatro mil reis e sua comisso no pode
ser nula agrupando por seus cargos e ordenado de forma decresente.
select count(IDFUNCIONARIO)
from funcionario
where trunc(months_between(SYSDATE, DATAADMISAO) / 12)> 4
and sal > 4000
and COMISAO is not null
group by cargo
order by count(IDFUNCIONARIO) desc;
Nesta consulta abaixo pegamos o id , nome dos cliente e o id da venda onde o valor do
desconto foi maior que a total de descontos para os clientes que compraram mais que
trs produtos no ms de fevereiro.
select c.idcliente, c.nome, v.idvenda
from cliente c, venda v, itemvenda iv
where c.idcliente = v.cliente_venda
and v.idvenda = iv.venda_itemvenda
and iv.valordesconto > (select sum(valordesconto)

from itemvenda)
and qtd > 3
and data between '01/02/2013' and '28/02/2013';
Nesta consulta abaixo contamos a quantidade de produtos que temos em estoque.
select count(IDPRODUTO)
from produtos;
Nesta consulta abaixo pegamos o id e nome do funcionrio que deu o maior desconto no
ano de 2012.
select v.funcionario_venda, nome
max(iv.valordesconto)maior_desconto
from vendas v, itevenda iv, funcionario f
where v.idvenda = iv.venda_itemvenda
and v.funcionario_venda = f.idfuncionario
and data >= '01/01/2012'
and data = '01/01/2012'
and data = '01/01/2012'
and data
begin
select sum(totalvalor) into total
from itemvenda;
if inserting then
update venda set valortotal = total;
elsif inserting then
update venda set valortotal = total;
elsif deliting then
update venda set valortotal = total;
end if;