sql – select avançado
TRANSCRIPT
04/05/2012
1
SQL – Select Avançado
Equi-Junção (junção por igualdade)
• É definido como sendo o relacionamento existente entreduas ou mais tabelas, pois os valores de colunas dastabelas são iguais;
• A Equi-junção é possível apenas quando for definido deforma adequada a chave estrangeira de uma tabela e suareferencia a chave primaria da tabela precedente;
Equi-Junção (junção por igualdade)
Ex.: listar o nome do cinema e a sua respectiva cidade:
SELECT nome_cinema AS “Cinema”, cinema.cod_cidade, cidade.nome_cidade AS “Cidade”FROM cinema, cidadeWHERE cidade.cod_cidade = cinema.cod_cidade
Select nome_cidade as “Cidade”, nome_estado as “Estado”, sigla_estado as “UF”from estado, cidadewhere estado.cod_estado = cidade.cod_estado
As junções SQL são utilizadas quando precisamos selecionar dados de duas ou maistabelas.
Exemplo: Selecionar o nome das Cidades, nome dos seus respectivos Estados e a Sigla:
Listar o nome dos cinemas, nome dacidade correspondente a cada cinema e onome do estado correspondente a cidadeselecionada.
Desafio:
SELECT nome_cinema as "Cinema", nome_cidade as"Cidade",nome_estado as "Estado"FROM cinema, cidade, estadoWHERE cinema.cod_cidade = cidade.cod_cidade and
cidade.cod_estado = estado.cod_estado
Resposta:
04/05/2012
2
Exercícios:1. Liste o nome dos atores cuja nacionalidade seja “Brasileira”.2. Liste o nome do filme, a censura e o pais de origem que
pertençam ao gênero “Suspense”.3. Liste o nome do filme e o nome do gênero.4. Liste o nome do ator e o nome dos filmes onde esse ator
participou.5. Conte o numero de filmes em que cada ator participou.6. Liste o nome dos filmes que estão em cartaz + o nome do cinema
e + o nome da cidade + data inicial e data final. Levar emconsideração que a data de encerramento do filme seja menorque a data atual.
7. Liste o nome dos filmes que estão em cartaz + o nome do cinemae + nome dos atores que participam dos filmes.
Analisando a situação abaixo:
MER
Construindo as tabelas físicas no banco de dados:
Vendedor
Cod_Vendedor Nome_vendedor
Integer – PK Varchar(30) - NN
Cliente
Cod_Cliente Nome_cliente Status
Integer – PK Varchar(30) - NN Char(1) - NN
Produto
Cod_Produto Nome_Produto Qtde_estoque
Integer – PK Varchar(30) - NN Integer
Venda
Cod_Venda Cod_cliente Cod_vendedor Data
Integer – PK Integer - FK Integer - FK Date
Itens_Venda
Cod_Ivenda Cod_Venda Cod_produto Qtde_vendida
Integer – PK Integer- FK Integer – FK Numeric(8,2)
Inserindo dados:
Vendedor
Cod_Vendedor Nome 58 João dos Santos78 Maria das Dores100 Humberto Silva
Cliente
Cod_Cliente Nome_Cliente Status100 Fabrício Santos I250 Carolina da Cruz A340 Ângelo Fonseca A
Produto
Cod_Produto Nome_Produto Qtde_Estoque546 Arroz 100897 Feijao 500713 Farinha 20256 Acucar 80456 Leite 45
Venda
Cod_Venda Cod_Cliente Cod_Vendedor123 100 58569 250 100789 250 78457 100 100
Itens_ Venda
Cod_IVenda Cod_Venda Cod_Produto Qtde_Vendida
100 123 546 2101 123 897 3102 569 546 5103 569 713 5104 569 256 8105 457 713 2
Usando JOIN
As junções com JOIN podem ser de dois tipos:▫ as INNER JOINS e as OUTER JOINS (LEFT JOIN, RIGHT JOIN ouFULL JOIN)
INNER JOIN
04/05/2012
3
INNER JOINS: seleciona apenas osregistros em comum entre AS DUAS
TABELAS.
SELECT Vendedor.nome_vendedor AS "Nome do Vendedor", cliente.nome_cliente AS "Nome do Cliente"
From VendedorINNER JOIN venda ON venda.cod_vendedor = Vendedor.cod_vendedorINNER JOIN cliente ON cliente.cod_cliente = venda.cod_cliente
SELECT nome_cinemaAS "Cinema", nome_cidade AS "Cidade"FROM cidadeINNER JOIN cinema ON cidade.cod_cidade = cinema.cod_cidade
Usando INNER JOIN em mais tabelas....
SELECT Vendedor.nome_vendedor AS "Nome do Vendedor", cli.nome_clienteAS "Nome do Cliente"from vendedorINNER JOIN venda ON vendedor.cod_vendedor = Venda.cod_vendedorINNER JOIN cliente AS CLI ON Venda.cod_cliente = cli.cod_clienteORDER BY nome_cliente
SELECT nome_cinema AS "Nome do Cinema", nome_cidade AS "Nome da Cidade", nome_estado AS "Nome do Estado", sigla_estado AS "UF"FROM cinemaINNER JOIN cidade ON cidade.cod_cidade = cinema.cod_cidadeINNER JOIN estado ON estado.cod_estado = cidade.cod_estadoORDER BY nome_cidade
SELECT cliente.nome_clienteAS "Nome do Cliente", produto.nome_produto AS "Nome do Produto"
from clienteinner join venda inner join itens_venda inner join produtoon venda.cod_cliente = cliente.cod_clienteon itens_venda.cod_venda = venda.cod_vendaon itens_venda.cod_produto = produto.cod_produto
Usando INNER JOIN em mais tabelas....
Select cliente.nome_cliente as "Nome do Cliente", produto.nome_produto as "Nome do Produto"from clienteinner join venda on venda.cod_cliente = cliente.cod_clienteinner join itens_venda on itens_venda.cod_venda = venda.cod_vendainner join produto on itens_venda.cod_produto = produto.cod_produto
Usando INNER JOIN SELECT cliente.nome_clienteAS "Nome do Cliente", vendedor.nome_vendedorAS "Nome do
Vendedor", produto.nome_produto as "Nome do Produto"FROM vendedorINNER JOIN venda INNER JOIN cliente INNER JOIN itens_venda INNER JOIN produtoON venda.cod_vendedor = vendedor.cod_vendedorON venda.cod_cliente = cliente.cod_clienteON venda.cod_venda = itens_venda.cod_vendaON itens_venda.cod_produto = produto.cod_produto
Select cliente.nome_cliente as "Nome do Cliente", produto.nome_produto as "Nome do Produto", vendedor.nome as "Nome do Vendedor"
from clienteinner join venda on venda.cod_cliente = cliente.cod_clienteinner join vendedor on vendedor.cod_vendedor = venda.cod_vendedorinner join itens_venda on itens_venda.cod_venda = venda.cod_vendainner join produto on itens_venda.cod_produto = produto.cod_produto
Usando INNER JOIN
Select titulo as "Titulo do Filme", nome_genero as "Genero do Filme"From filmes as filInner join genero on genero.cod_Genero = fil.cod_genero
Atividade:
1. Selecionar o nome dos filmes, o nome do gênero e duração dos filmes que estão em cartaz nos cinemas da cidade Umuarama.
2. Selecionar o nome dos filmes e o nome dos cinemas onde os mesmos estejam em cartaz. Devera ser levado em conta somente os filmes classificados no gênero de suspense. Ordenar os registros por nome de filme.
3. Listar o nome dos cinemas da cidade de Maringá e o nome dos filmes que estão em cartaz apenas do gênero “Suspense”.
1. Listar todos produtos que foram adquiridos pelo cliente “Fabricio Santos”.2. Listar todos os clientes que compraram o produto “Arroz”.3. Listar o nome dos clientes, nome dos produtos, data da venda e quantidade vendida
para todas as vendas efetuadas.
04/05/2012
4
Outras formas de usar inner joins...
select nome_cinema, nome_cidadefrom cidadeINNER JOIN cinema USING (cod_cidade)
select nome_cinema, nome_cidadefrom cidadeJOIN cinema USING (cod_cidade)
Select titulo as "Titulo do Filme", nome_genero as "Genero do Filme"From filmes JOIN genero USING (cod_genero)
Ou...
Conexão Natural
Conexões naturais são utilizadas somente quando a coluna a qual se esta conectadopossui o mesmo nome nas duas tabelas.
... também é uma conexão interna
SELECT nome_cinema, nome_cidade, nome_estadoFROM estadoNATURAL JOIN cidadeNATURAL JOIN cinema
Exemplos:
Select nome_ator as "Nome do Ator", titulo as "Nome do Filme"from atoresNATURAL JOIN elencoNATURAL JOIN filmes
Relacione o nome dos atores e o filme que cada um participou:
Select titulo as "Nome do Filme", nome_cinema as "Nome do Cinema", nome_cidade as "Nome da Cidade"from cinemaNATURAL JOIN filme_cartazNATURAL JOIN filmesNATURAL JOIN cidade
Listar os filmes que estão em cartaz, ocinema onde os mesmos estão em cartaz e acidade de cada cinema.
Select titulo as "Nome do Filme", nome_cinema as "Nome do Cinema", nome_cidade as "Nome da Cidade"from cinemaNATURAL JOIN filme_cartazNATURAL JOIN filmesNATURAL JOIN cidadeWHERE cidade.cod_cidade = 1
Tarefa:
1. Listar o nome do cliente, nome do vendedor e a data de cada venda realizada.2. Listar o nome do cliente, nome do vendedor, data de venda e o nome dos
produtos vendidos.3. Listar todos os clientes e a data de venda apenas dos clientes que compraram
“feijão”.4. Listar todos os clientes, vendedor e produto que foram vendidos na data de
28/06/2011.
OUTER JOINS
Usando OUTER JOINS Retornam todas as linhas de uma das tabelas bemcomo as informações compatíveis de outra tabela.
Junções externas....
� LEFT OUTER JOIN.� RIGHT OUTER JOIN.� FULL OUTER JOIN.
04/05/2012
5
LEFT JOIN
• Somente os registros da tabela da esquerda (left) serão retornados,tendo ou não registros relacionados na tabela da direita;• A conexão externa esquerda combina cada linha na tabela esquerdacom uma linha na tabela direita.• A tabela à esquerda do operador de junção exibirá cada um dos seusregistros, enquanto que a da direita exibirá somente seus registrosque tenham correspondentes aos da tabela da esquerda.• Para os registros da direita que não tenham correspondentes naesquerda serão colocados valores NULL.• Utilizada quando temos um relacionamento um-para-muitos.
Exemplo: LEFT JOIN
SELECT vendedor.nome_vendedorAS "Nome do Vendedor", cod_venda
FROM vendedor
LEFT OUTER JOIN venda ON vendedor.cod_vendedor = Venda.cod_vendedor
Selecionar todos os vendedores cadastrados e as vendasrealizadas pelos mesmos.
A tabela que vem depois de FROM e ANTESdo LEFT é a tabela ESQUERDA, e a tabela que vem DEPOIS da conexão é a tabela
DIREITA.
DireitaEsquerda
SELECT vendedor.nome_vendedor AS "Nome do Vendedor", cod_vendaFROM vendaLEFT OUTER JOIN vendedor ON venda.cod_vendedor = Vendedor.cod_vendedor
Selecionar todos os vendedores cadastrados eas vendas realizadas pelos mesmos.
SELECT vendedor.nome_vendedor AS "Nome do Vendedor", cod_vendaFROM vendedorLEFT OUTER JOIN venda using (cod_vendedor)
Assim o resultado fica correto....
SELECT vendedor.cod_vendedor, vendedor.nome_vendedor AS "Nome do Vendedor", cliente.cod_cliente,cliente.nome_cliente AS "Nome do Cliente"
from vendedor
LEFT JOIN venda ON vendedor.cod_vendedor = Venda.cod_vendedor
LEFT JOIN cliente ON venda.cod_cliente = cliente.cod_cliente
ORDER BY nome_cliente
Exemplo: LEFT JOIN
SELECT vendedor.cod_vendedor, vendedor.nome_vendedor AS "Nome do Vendedor", cliente.cod_cliente, cliente.nome_cliente AS "Nome do Cliente"
FROM vendedor
LEFT JOIN venda LEFT JOIN cliente
ON vendedor.cod_vendedor = Venda.cod_vendedor
ON venda.cod_cliente = cliente.cod_cliente
ORDER BY nome_cliente
SELECT vendedor.cod_vendedor, vendedor.nome_vendedor AS "Nome do Vendedor", cliente.cod_cliente, cliente.nome_cliente AS "Nome do Cliente"FROM vendedorLEFT JOIN venda USING (cod_vendedor)LEFT JOIN cliente USING (cod_cliente)ORDER BY nome_cliente
Usando OUTER JOINS
RIGHT JOIN - Inverso do LEFT, este retorna todos os registrossomente da tabela da direita (Right).
SELECT Data_Venda AS "Data da venda realizada", cliente.nome_cliente AS "Nome do Cliente"FROM venda RIGHT JOIN cliente ON venda.cod_cliente = cliente.cod_cliente
Direita SELECT Data_Venda AS "Data da venda realizada", cliente.nome_clienteAS "Nome do Cliente"FROM vendaRIGHT JOIN cliente USING(cod_cliente)
04/05/2012
6
SELECT VD.nome_vendedor AS "Nome do Vendedor", cliente.nome_cliente AS"Nome do Cliente"FROM vendedor AS VDRIGHT JOIN venda ON VD.cod_vendedor = Venda.cod_vendedorRIGHT JOIN cliente ON venda.cod_cliente = cliente.cod_cliente
Cliente e Vendedor:
SELECT data_venda, VD.nome_vendedor AS "Nome do Vendedor", cliente.nome_clienteAS "Nome do Cliente"FROM vendedor AS VDRIGHT JOIN venda USING (cod_vendedor)RIGHT JOIN cliente USING (cod_cliente)
SELECT data_venda, cliente.cod_cliente, cliente.nome_cliente AS "Nome do Cliente", vendedor.cod_vendedor, vendedor.nome_vendedor AS "Nome do Vendedor"FROM vendaRIGHT JOIN cliente ON venda.cod_cliente = cliente.cod_clienteLEFT JOIN vendedor ON vendedor.cod_vendedor = Venda.cod_vendedorORDER BY nome_cliente
RIGHT JOIN e LEFT JOIN ....
Seleção de todos os clientes independentes dos mesmos terem uma venda realizada.Dos clientes que possuírem uma venda deverá ser apresentado o nome dos vendedoresque atendeu aquele determinado cliente.
Usando OUTER JOINS
FULL JOIN - Seleciona todos os registros de todas as tabelas.
SELECT cliente.nome_cliente AS "nome do cliente", vendedor.nome_vendedorFROM clienteFULL JOIN venda on venda.cod_cliente = cliente.cod_clienteFULL JOIN vendedor on venda.cod_vendedor = vendedor.cod_vendedor
SELECT data_venda, cliente.cod_cliente, cliente.nome_clienteAS "Nome do Cliente", vendedor.cod_vendedor, vendedor.nome_vendedorAS "Nome do Vendedor"FROM vendaFULL JOIN cliente ON venda.cod_cliente = cliente.cod_clienteFULL JOIN vendedor ON vendedor.cod_vendedor = Venda.cod_vendedorORDER BY nome_cliente
Desenvolver os seguintes SELECT:
1 – Listar o nome dos filmes e o nome dos atores que participaram dos filmes. Obs.: OSELECT deve apresentar todos os atores cadastrados independente de ter participado de umfilme.2 – Listar o nome dos atores e dos filmes em que os mesmos participam e o nome do cinemaonde os filmes estão em cartaz.3 - Listar o nome dos atores e dos filmes em que os mesmos participam, o nome do cinemaonde os filmes estão em cartaz e o nome da cidade onde se localiza o cinema.4 - Listar o nome dos atores, dos filmes em que os mesmos participam, o nome do cinemaonde os filmes estão em cartaz e o nome da cidade onde se localiza o cinema. Obs.: levarem consideração todos os atores cadastrados.5 – Listar o nome de todos os filmes em cartaz na cidade de Umuarama do mês de Junho.6 – Listar o nome e o gênero dos filmes em que o ator “Antônio Fagundes” participa.
Group By
• As operações de grupo operam sobre grupos de linhas(tuplas), retornando os resultados baseado no grupocriado.• É usada para dividir tuplas em grupos menores.• Omitir a clausula Group By significa agrupar toda a tabela.• Sintaxe:SELECT <coluna_agrupamento>,<função>FROM <nome_tabela>GROUP BY <coluna_agrupamento>;
Exemplo:
• SELECT cod_produto, SUM(qtde_vendida)FROM itens_vendaGROUP BY cod_produto
• SELECT cod_produto, count (qtde_vendida)FROM itens_vendaGROUP BY cod_produto
• SELECT cinema.cod_cidade, count(cod_cidade)FROM cinemaGROUP BY cinema.cod_cidade
04/05/2012
7
SELECT vendedor.nome_vendedor, SUM(qtde_vendida)FROM vendaINNER JOIN vendedor ON venda.cod_vendedor = vendedor.cod_vendedorINNER JOIN itens_venda ON venda.cod_venda = itens_venda.cod_VendaGROUP BY nome_vendedor
Exemplo no banco de dados Venda:
SELECT vendedor.nome_vendedor,nome_cliente, SUM (qtde_vendida)FROM vendaINNER JOIN cliente ON cliente.cod_cliente = venda.cod_clienteINNER JOIN vendedor ON venda.cod_vendedor = vendedor.cod_vendedorINNER JOIN itens_venda ON venda.cod_venda = itens_venda.cod_VendaGROUP BY nome_vendedor, nome_cliente
Quantidade de produtos vendido separado por vendedor
Quantidade de produtos vendido separado por cliente e por vendedor
select cinema.cod_cidade, cidade.nome_cidade, count (cinema.cod_cidade)from cinemainner join cidade on cidade.cod_cidade = cinema.cod_cidadegroup by cinema.cod_cidade, cidade.nome_cidade
Número de cinema agrupados por cidade:
select elenco.cod_ator, atores.nome_ator, count (elenco.cod_ator)from elencoinner join atores on elenco.cod_ator = atores.cod_atorgroup by elenco.cod_ator, atores.nome_ator
Numero de filmes feito por cada ator:
Cláusula Having
A cláusula HAVING é opcional.HAVING é semelhante a WHERE, que determina quaisregistros são selecionados.Depois que os registros são agrupados com GROUP BY,HAVING determina quais registros são exibidos.A cláusula Group By deve vir antes da cláusula Having.
Exemplo:select cinema.cod_cidade, cidade.nome_cidade, count (cinema.cod_cidade)from cinemainner join cidade on cidade.cod_cidade = cinema.cod_cidadegroup by cinema.cod_cidade, cidade.nome_cidadehaving count(cinema.cod_cidade) > 1
SELECT cod_produto, count(qtde_vendida)FROM itens_vendaGROUP BY cod_produtoHaving count(qtde_vendida) > 1
SELECT cod_produto, SUM(qtde_vendida)FROM itens_vendaGROUP BY cod_produtohaving sum(qtde_vendida) > 2
Visões• É como uma janela quer permite visualizar ou modificarseletivamente informações armazenadas em tabelas.• É utilizada para:▫ Poder restringir o acesso a informações contidas emtabelas;▫ Permitir que os usuários efetuem consultas simples sobreconsultas complicadas;▫ Consultar dados de diversas tabelas.• Uma visão é considerada uma tabela virtual, isto é,funciona como uma tabela mas não contém dados. Osdados de uma visão são calculados a partir de outrastabelas.
Exemplo:
Create View v_cinema (nome_cinema)
As Select nome_cinema
From cinema
Where cod_cidade = 1
Create View v_cinema (nome_cinema)As Select nome_cinemaFrom cinemaWhere cod_cinema is not null
ou...
04/05/2012
8
Visões
Exemplo:
1) CREATE VIEW v_comediasAS SELECT *FROM filmesWHERE cod_genero = 1
2) SELECT * FROM V_comedias
3) DROP v_comedias
Para visualizar as informações da View:SELECT *FROM v_cinema;
Para remover uma visão:
DROP VIEW (nome_da_visão);
Exemplo: DROP VIEW v_cinema
CREATE VIEW v_cinemacidade(nome_cinema, nome_cidade)AS Select nome_cinema, nome_cidadeFROM cinemaJOIN cidade USING (cod_cidade)
GENERATOR
Cria um auto-incremento de número inteiros e sequenciais. É utilizado em conjunto com Trigger e ou Stored Procedure.
Sintaxe:CREATE GENERATOR “nome_do_generator”
Exemplo:CREATE GENERATOR GEN_CINEMACREATE GENERATOR GEN_CIDADE
Função: GEN_ID()Retorna o valor do GENERATOR, isto é, pode retornar ovalor do GENERATOR e ou incrementar/decrementar. Éinformado o nome do Generator e o valor do retorno doGENERATOR.
Sintaxe:
GEN_ID(“generator”,ID);
Exemplo:
Criação:
Create generator Gen_cidade;Create generator Gen_cliente;
Inicialização do Generator:
Set generator gen_cidade to 0 Set generator gen_cidade to 10
Utilização:
insert into cidade values (gen_id(gen_cidade,1),’Cascavel')
Exclusão:
Drop Generator “nome_generator”
Exemplo: (banco venda)Insert into cliente values (gen_id(gen_cliente,1),upper('Marcos Paulo'), upper ('a'))
Triggers
Uma Trigger, ou um gatilho, é um bloco de comandos que éautomaticamente executado quando um comando INSERT , DELETEou UPDATE for executado em uma tabela do banco de dados.
As Triggers são usadas para realizar tarefas relacionadas comvalidações, restrições de acesso, rotinas de segurança e consistênciade dados; desta forma estes controles deixam de ser executados pelaaplicação e passam a ser executados pelas Triggers em determinadassituações.
Triggers
• A ativação de uma trigger está associada à ocorrência deum evento:– INSERT– UPDATE– DELETE
• Quanto ao instante de ativação: refere-se ao momento emque a condição e a ação são executadas▫ BEFORE: antes do comando SQL ser executado▫ AFTER: depois da execução do comando SQL
TriggersSintaxe:CREATE TRIGGER name FOR {table, view}[ACTIVE | INACTIVE] {BEFORE AFTER} {DELETE INSERT UPDATE}[POSITION number]AS
<variable_declaration_list> =DECLARE VARIABLE variable datatype; [DECLARE VARIABLE variable datatype;...]BEGIN
<trigger_body>END
Explicação:
•table view : é o nome tabela ou view queestará associada à trigger.•active inactive: indica se a trigger estaráativa ou não.•Before (antes) after (depois): indica emque momento a trigger será disparada. Atrigger pode ser dispara antes ou depois deum evento de DELETE, UPDATE ou INSERT.delete insert update : indica em qual eventoa trigger será executada.Position: é utilizado para definir a sequênciade execução de triggers que estãoassociadas a um mesmo momento e evento.Por exemplo, posso ter duas triggers do tipoBEFORE DELETE. Como saber qual delasserá executada primeiro? O parâmetroPOSITION indicará isso.trigger body : é o corpo da trigger, o códigodela.
04/05/2012
9
Exemplo:
• SET TERM ^ ; Create Trigger TCidade For CidadeBefore Insert Position 0ASBegin
if (new.cod_cidade is null) thenBeginnew.cod_cidade = gen_id(gen_cidade,1);
EndEnd ^SET TERM ; ^
Exemplo:
Insert into cidade (nome_cidade,cod_estado) values (‘Curitiba‘,1);Insert into cidade (nome_cidade,cod_estado) values (‘Maraba‘,1);Insert into cidade (nome_cidade,cod_estado) values (‘Cruzeiro do Oeste‘,1);Insert into cidade (nome_cidade,cod_estado) values (‘Londrina‘,1);
Triggers - As variáveis NEW e OLD
• O Firebird disponibiliza duas variáveis muito úteis para serem usadas nocontexto de uma trigger. São elas: NEW e OLD.
• A variável NEW, no caso do INSERT, armazena o registro que está sendoinserido. No caso do UPDATE, armazena o registro depois de atualizado.
• A variável OLD, no caso do DELETE, armazena o registro que está sendoexcluído. No caso do UPDATE, armazena o registro antes de sofrer aatualização.• Quando esta sendo usando o Insert, não é possível fazer referencia usando a
variável old.• Quando esta sendo usando o Delete não é possível fazer referencia usando a
variável new.
Exemplo:
• SET TERM !! ; Create Trigger TCidade For CidadeBefore Insert Position 0ASBegin
new.cod_cidade = gen_id(gen_cidade,1); End !!
SET TERM ; !!
Criando Mensagens de Exceção
Sintaxe:• CREATE EXCEPTION “Nome_Exceção” ‘Mensagem’;
• Exemplo:▫ CREATE EXCEPTION "NAO_DELETE_UF“ 'Não é possível excluir um estado';
▫ CREATE EXCEPTION "ACABOUESTOQUE" ‘ Não existe quantidade suficiente deste produto em estoque’.
Exemplo:
CREATE EXCEPTION "NAO_DELETE_UF" 'Não é possívelexcluir um estado';
Criar as regras de exceção:
CREATE EXCEPTION "ACABOUESTOQUE“ ‘Não existe quantidade suficiente deste produto em estoque’.
04/05/2012
10
Exemplo: SET TERM !;CREATE TRIGGER TUF FOR ESTADO BEFORE DELETE ASBEGIN
EXCEPTION NAO_DELETE_UF; END!SET TERM;!
Exemplo: Delete From Estado;
Exemplo:SET TERM ! ;CREATE TRIGGER TItensVenda FOR Itens_vendaBEFORE INSERTPOSITION 0 ASBEGINIF ( NOT EXISTS ( SELECT * FROM PRODUTO
WHERE COD_PRODUTO = NEW.COD_PRODUTO ANDQTDE_ESTOQUE >= NEW.QTDE_VENDIDA ) )
THENEXCEPTION ACABOUESTOQUE;
END !SET TERM ; !
Exemplo:
• Valor menor▫ Insert into itens_venda values (201,456,123,30)
• Valor maior• Insert into itens_venda values (202,456,123,300)
Exemplo: SET TERM !!;ALTER TRIGGER TITENSVENDA BEFORE INSERTPOSITION 0 ASBEGIN
IF ( NOT EXISTS ( SELECT * FROM PRODUTOWHERE COD_PRODUTO = NEW.COD_PRODUTO ANDQTDE_ESTOQUE >= NEW.QTDE_VENDIDA ) )
THENEXCEPTION ACABOUESTOQUE;
UPDATE PRODUTOSET QTDE_ESTOQUE = QTDE_ESTOQUE - NEW.QTDE_VENDIDAWHERE COD_PRODUTO = NEW.COD_PRODUTO;
END !!SET TERM ; !!
Exemplo:
• Valor menor• insert into itens_venda• values (203,456,123,10)
• Valor maior• insert into itens_venda• values (204,456,123,100)
SET TERM !!;CREATE TRIGGER TITENSCOMPRA_ESTOQUE FOR ITENS_COMPRABEFORE INSERTPOSITION 0 ASBEGIN
UPDATE PRODUTOSET QTDE_ESTOQUE = QTDE_ESTOQUE + NEW.QTDE_icompraWHERE COD_PRODUTO = NEW.produto_COD_PRODUTO;
END !!SET TERM ; !!
Atualização da quantidade do produto na tabela de produto
04/05/2012
11
Exemplo:
Create Table Pessoa (Cod_Pessoa Integer Not Nullprimary key,Pessoa_Idade Int Not Null,Pessoa_Tipo Char(1) );
SET TERM !;CREATE TRIGGER ATUALIZA_PESSOATIPOFOR PESSOABEFORE INSERT OR UPDATEPOSITION 0AS BEGIN
IF (NEW.PESSOA_IDADE < 18)THEN
BEGINNEW.PESSOA_TIPO = ‘J’;
ENDELSENEW.PESSOA_TIPO = ‘A’;
END!SET TERM;!
Exemplo:
Update Pessoa Set Pessoa_Idade = 5;
insert into pessoa (cod_pessoa,pessoa_idade)values (1,10)
insert into pessoa (cod_pessoa,pessoa_idade)values (2,20)
INSERT:
UPDATE:
Triggers
• Excluindo uma triggers:
• DROP TRIGGER nome_trigger;
• Ativando/Desativando uma triggers:
• ALTER TRIGGER nome_trigger INACTIVE;
Exercícios
• Usar o exemplo feito na ultima aula e aplicar os conceitos vistos.
Stored Procedures
• Stored Procedure é um conjunto de comandos, ao qual éatribuído um nome.• Este conjunto fica armazenado no Banco de Dados e podeser chamado a qualquer momento tanto pelo SGBD(Sistema Gerenciador de Banco de Dados) quanto por umsistema que faz interface com o mesmo.• Stored Procedures são pre-compiladas. Portanto, não énecessário mandar o comando pela rede para ser validadoe executado. Elas são simplesmente executadas.• Procedures podem possuir parâmetros e, assim como oSELECT, retornar dados de uma tabela.
Stored Procedures
CREATE PROCEDURE NomedaProcedure <parâmetros de entrada> RETURNS <parâmetros de saída> AS <declaração de variáveis locais> BEGIN <comandos da procedures> END
04/05/2012
12
Exemplo:
SET TERM !;CREATE PROCEDURE Cliente_CountRETURNS ( ClienteCount Integer)ASBEGIN
SELECT COUNT(*) FROM ClienteINTO :ClienteCount;SUSPEND;
END !SET TERM ; !
Exemplo:
• Select *from Cliente_Count
• Execute “Nome da Procedure”
• DROP PROCEDURE Nome_Procedure;
Exemplo:SET TERM !;CREATE PROCEDURE RESUMO_VENDAS ( VENDEDOR INTEGER)RETURNS (VALOR_TOTAL DOUBLE PRECISION, MEDIA DOUBLE PRECISION, VALOR_MIN DOUBLE PRECISION, VALOR_MAX DOUBLE PRECISION )
ASBEGIN
SELECT SUM(VALOR), AVG(VALOR), MIN(VALOR), MAX(VALOR)FROM VENDAWHERE COD_VENDEDOR = :VENDEDORINTO :VALOR_TOTAL, :MEDIA,:VALOR_MIN,:VALOR_MAX;SUSPEND;
END!SET TERM ; !
Exercícios
• Usar o exemplo feito na ultima aula e aplicar os conceitos vistos.