Você está na página 1de 12

04/05/2012

Equi-Juno (juno por igualdade)


definido como sendo o relacionamento existente entre duas ou mais tabelas, pois os valores de colunas das tabelas so iguais; A Equi-juno possvel apenas quando for definido de forma adequada a chave estrangeira de uma tabela e sua referencia a chave primaria da tabela precedente;

SQL Select Avanado

Equi-Juno (juno por igualdade)


Ex.: listar o nome do cinema e a sua respectiva cidade:

As junes SQL so utilizadas quando precisamos selecionar dados de duas ou mais tabelas.

Exemplo: Selecionar o nome das Cidades, nome dos seus respectivos Estados e a Sigla:

SELECT nome_cinema AS Cinema, cinema.cod_cidade, cidade.nome_cidade AS Cidade FROM cinema, cidade WHERE cidade.cod_cidade = cinema.cod_cidade

Select nome_cidade as Cidade, nome_estado as Estado, sigla_estado as UF from estado, cidade where estado.cod_estado = cidade.cod_estado

Desafio:

Resposta:

Listar o nome dos cinemas, nome da cidade correspondente a cada cinema e o nome do estado correspondente a cidade selecionada.

SELECT nome_cinema as "Cinema", nome_cidade as "Cidade",nome_estado as "Estado" FROM cinema, cidade, estado WHERE cinema.cod_cidade = cidade.cod_cidade and cidade.cod_estado = estado.cod_estado

04/05/2012

Exerccios:
1. Liste o nome dos atores cuja nacionalidade seja Brasileira. 2. Liste o nome do filme, a censura e o pais de origem que pertenam ao gnero Suspense. 3. Liste o nome do filme e o nome do gnero. 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 esto em cartaz + o nome do cinema e + o nome da cidade + data inicial e data final. Levar em considerao que a data de encerramento do filme seja menor que a data atual. 7. Liste o nome dos filmes que esto em cartaz + o nome do cinema e + nome dos atores que participam dos filmes.

Analisando a situao abaixo:

MER

Construindo as tabelas fsicas no banco de dados:


Vendedor Cod_Vendedor Integer PK Nome_vendedor Varchar(30) - NN Cliente Cod_Cliente Integer PK Nome_cliente Varchar(30) - NN Status Char(1) - NN

Inserindo dados:
Vendedor Cod_Vendedor 58 78 100 Produto Cod_Produto 546 897 713 256 456 Nome Joo dos Santos Maria das Dores Humberto Silva

Cliente Cod_Cliente 100 250 340

Nome_Cliente Fabrcio Santos Carolina da Cruz ngelo Fonseca Venda Cod_Venda 123 569 789 457 Itens_ Venda Cod_IVenda Cod_Venda 100 101 102 103 104 105 123 123 569 569 569 457

Status I A A

Produto Cod_Produto Integer PK Nome_Produto Varchar(30) - NN Qtde_estoque Integer

Venda Cod_Venda Integer PK Cod_cliente Integer - FK Cod_vendedor Integer - FK Data Date

Nome_Produto Arroz Feijao Farinha Acucar Leite

Qtde_Estoque 100 500 20 80 45

Cod_Cliente 100 250 250 100

Cod_Vendedor 58 100 78 100

Cod_Produto Qtde_Vendida 546 897 546 713 256 713 2 3 5 5 8 2

Itens_Venda Cod_Ivenda Integer PK Cod_Venda Integer- FK Cod_produto Integer FK Qtde_vendida Numeric(8,2)

Usando JOIN

As junes com JOIN podem ser de dois tipos:


as INNER JOINS e as OUTER JOINS (LEFT JOIN, RIGHT JOIN ou
FULL JOIN)

INNER JOIN

04/05/2012

INNER JOINS: seleciona apenas os


registros em TABELAS. comum entre AS DUAS

Usando INNER JOIN em mais tabelas....


SELECT Vendedor.nome_vendedor AS "Nome do Vendedor", cli.nome_cliente AS "Nome do Cliente" from vendedor INNER JOIN venda ON vendedor.cod_vendedor = Venda.cod_vendedor INNER JOIN cliente AS CLI ON Venda.cod_cliente = cli.cod_cliente ORDER BY nome_cliente

SELECT nome_cinema AS "Cinema", nome_cidade AS "Cidade" FROM cidade INNER JOIN cinema ON cidade.cod_cidade = cinema.cod_cidade

SELECT Vendedor.nome_vendedor AS "Nome do Vendedor", cliente.nome_cliente AS "Nome do Cliente" From Vendedor INNER JOIN venda ON venda.cod_vendedor = Vendedor.cod_vendedor INNER JOIN cliente ON cliente.cod_cliente = venda.cod_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 cinema INNER JOIN cidade ON cidade.cod_cidade = cinema.cod_cidade INNER JOIN estado ON estado.cod_estado = cidade.cod_estado ORDER BY nome_cidade

Usando INNER JOIN em mais tabelas....


SELECT cliente.nome_cliente AS "Nome do Cliente", produto.nome_produto AS "Nome do Produto" from cliente inner join venda inner join itens_venda inner join produto on venda.cod_cliente = cliente.cod_cliente on itens_venda.cod_venda = venda.cod_venda on itens_venda.cod_produto = produto.cod_produto

Usando INNER JOIN


SELECT cliente.nome_cliente AS "Nome do Cliente", vendedor.nome_vendedor AS "Nome do Vendedor", produto.nome_produto as "Nome do Produto" FROM vendedor INNER JOIN venda INNER JOIN cliente INNER JOIN itens_venda INNER JOIN produto ON venda.cod_vendedor = vendedor.cod_vendedor ON venda.cod_cliente = cliente.cod_cliente ON venda.cod_venda = itens_venda.cod_venda ON itens_venda.cod_produto = produto.cod_produto

Select cliente.nome_cliente as "Nome do Cliente", produto.nome_produto as "Nome do Produto" from cliente inner join venda on venda.cod_cliente = cliente.cod_cliente inner join itens_venda on itens_venda.cod_venda = venda.cod_venda inner join produto on 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 cliente inner join venda on venda.cod_cliente = cliente.cod_cliente inner join vendedor on vendedor.cod_vendedor = venda.cod_vendedor inner join itens_venda on itens_venda.cod_venda = venda.cod_venda inner 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 fil Inner join genero on genero.cod_Genero = fil.cod_genero

Atividade:
1. Selecionar o nome dos filmes, o nome do gnero e durao dos filmes que esto 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 gnero 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 esto em cartaz apenas do gnero 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

Outras formas de usar inner joins...


select nome_cinema, nome_cidade from cidade INNER JOIN cinema USING (cod_cidade) Ou... select nome_cinema, nome_cidade from cidade JOIN cinema USING (cod_cidade)

Conexo Natural

... tambm uma conexo interna

Conexes naturais so utilizadas somente quando a coluna a qual se esta conectado possui o mesmo nome nas duas tabelas.

Select titulo as "Titulo do Filme", nome_genero as "Genero do Filme" From filmes JOIN genero USING (cod_genero)

SELECT nome_cinema, nome_cidade, nome_estado FROM estado NATURAL JOIN cidade NATURAL JOIN cinema

Exemplos:

Relacione o nome dos atores e o filme que cada um participou:

Tarefa:
Select nome_ator as "Nome do Ator", titulo as "Nome do Filme" from atores NATURAL JOIN elenco NATURAL JOIN filmes Listar os filmes que esto em cartaz, o cinema onde os mesmos esto em cartaz e a cidade de cada cinema.

Select titulo as "Nome do Filme", nome_cinema as "Nome do Cinema", nome_cidade as "Nome da Cidade" from cinema NATURAL JOIN filme_cartaz NATURAL JOIN filmes NATURAL JOIN cidade

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 feijo. 4. Listar todos os clientes, vendedor e produto que foram vendidos na data de 28/06/2011.

Select titulo as "Nome do Filme", nome_cinema as "Nome do Cinema", nome_cidade as "Nome da Cidade" from cinema NATURAL JOIN filme_cartaz NATURAL JOIN filmes NATURAL JOIN cidade WHERE cidade.cod_cidade = 1

Usando OUTER JOINS

Retornam todas as linhas de uma das tabelas bem como as informaes compatveis de outra tabela.

OUTER JOINS

Junes externas....

LEFT OUTER JOIN. RIGHT OUTER JOIN. FULL OUTER JOIN.

04/05/2012

LEFT JOIN

Exemplo: LEFT JOIN


Selecionar todos os vendedores cadastrados e as vendas realizadas pelos mesmos.

Somente os registros da tabela da esquerda (left) sero retornados, tendo ou no registros relacionados na tabela da direita; A conexo externa esquerda combina cada linha na tabela esquerda com uma linha na tabela direita. A tabela esquerda do operador de juno exibir cada um dos seus registros, enquanto que a da direita exibir somente seus registros que tenham correspondentes aos da tabela da esquerda. Para os registros da direita que no tenham correspondentes na esquerda sero colocados valores NULL. Utilizada quando temos um relacionamento um-para-muitos.

SELECT vendedor.nome_vendedor AS "Nome do Vendedor", cod_venda FROM vendedor LEFT OUTER JOIN venda ON vendedor.cod_vendedor = Venda.cod_vendedor

Direita Esquerda A tabela que vem depois de FROM e ANTES do LEFT a tabela ESQUERDA, e a tabela que vem DEPOIS da conexo a tabela DIREITA.

Selecionar todos os vendedores cadastrados e as vendas realizadas pelos mesmos.

Assim o resultado fica correto....

SELECT vendedor.nome_vendedor AS "Nome do Vendedor", cod_venda FROM venda LEFT OUTER JOIN vendedor ON venda.cod_vendedor = Vendedor.cod_vendedor

SELECT vendedor.nome_vendedor AS "Nome do Vendedor", cod_venda FROM vendedor LEFT OUTER JOIN venda using (cod_vendedor)

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 ON vendedor.cod_vendedor = Venda.cod_vendedor LEFT JOIN cliente 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 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 vendedor LEFT 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 registros somente 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
SELECT Data_Venda AS "Data da venda realizada", cliente.nome_cliente AS "Nome do Cliente" FROM venda RIGHT JOIN cliente USING(cod_cliente)

Direita

04/05/2012

RIGHT JOIN e LEFT JOIN ....


Cliente e Vendedor:
SELECT data_venda, cliente.cod_cliente, cliente.nome_cliente AS "Nome do Cliente", vendedor.cod_vendedor, vendedor.nome_vendedor AS "Nome do Vendedor" FROM venda RIGHT JOIN cliente ON venda.cod_cliente = cliente.cod_cliente LEFT JOIN vendedor ON vendedor.cod_vendedor = Venda.cod_vendedor ORDER BY nome_cliente

SELECT VD.nome_vendedor AS "Nome do Vendedor", cliente.nome_cliente AS "Nome do Cliente" FROM vendedor AS VD RIGHT JOIN venda ON VD.cod_vendedor = Venda.cod_vendedor RIGHT JOIN cliente ON venda.cod_cliente = cliente.cod_cliente

SELECT data_venda, VD.nome_vendedor AS "Nome do Vendedor", cliente.nome_cliente AS "Nome do Cliente" FROM vendedor AS VD RIGHT JOIN venda USING (cod_vendedor) RIGHT JOIN cliente USING (cod_cliente)

Seleo de todos os clientes independentes dos mesmos terem uma venda realizada. Dos clientes que possurem uma venda dever ser apresentado o nome dos vendedores que 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_vendedor FROM cliente FULL JOIN venda on venda.cod_cliente = cliente.cod_cliente FULL JOIN vendedor on venda.cod_vendedor = vendedor.cod_vendedor
SELECT data_venda, cliente.cod_cliente, cliente.nome_cliente AS "Nome do Cliente", vendedor.cod_vendedor, vendedor.nome_vendedor AS "Nome do Vendedor" FROM venda FULL JOIN cliente ON venda.cod_cliente = cliente.cod_cliente FULL JOIN vendedor ON vendedor.cod_vendedor = Venda.cod_vendedor ORDER BY nome_cliente

Desenvolver os seguintes SELECT:


1 Listar o nome dos filmes e o nome dos atores que participaram dos filmes. Obs.: O SELECT deve apresentar todos os atores cadastrados independente de ter participado de um filme. 2 Listar o nome dos atores e dos filmes em que os mesmos participam e o nome do cinema onde os filmes esto em cartaz. 3 - Listar o nome dos atores e dos filmes em que os mesmos participam, o nome do cinema onde os filmes esto 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 cinema onde os filmes esto em cartaz e o nome da cidade onde se localiza o cinema. Obs.: levar em considerao todos os atores cadastrados. 5 Listar o nome de todos os filmes em cartaz na cidade de Umuarama do ms de Junho. 6 Listar o nome e o gnero dos filmes em que o ator Antnio Fagundes participa.

Group By
As operaes de grupo operam sobre grupos de linhas (tuplas), retornando os resultados baseado no grupo criado. usada para dividir tuplas em grupos menores. Omitir a clausula Group By significa agrupar toda a tabela. Sintaxe: SELECT <coluna_agrupamento>,<funo> FROM <nome_tabela> GROUP BY <coluna_agrupamento>;

Exemplo:
SELECT cod_produto, SUM(qtde_vendida) FROM itens_venda GROUP BY cod_produto SELECT cod_produto, count (qtde_vendida) FROM itens_venda GROUP BY cod_produto SELECT cinema.cod_cidade, count(cod_cidade) FROM cinema GROUP BY cinema.cod_cidade

04/05/2012

Exemplo no banco de dados Venda:


SELECT vendedor.nome_vendedor, SUM(qtde_vendida) FROM venda INNER JOIN vendedor ON venda.cod_vendedor = vendedor.cod_vendedor INNER JOIN itens_venda ON venda.cod_venda = itens_venda.cod_Venda GROUP BY nome_vendedor
Quantidade de produtos vendido separado por vendedor Quantidade de produtos vendido separado por cliente e por vendedor

Nmero de cinema agrupados por cidade:


select cinema.cod_cidade, cidade.nome_cidade, count (cinema.cod_cidade) from cinema inner join cidade on cidade.cod_cidade = cinema.cod_cidade group by cinema.cod_cidade, cidade.nome_cidade

Numero de filmes feito por cada ator:


select elenco.cod_ator, atores.nome_ator, count (elenco.cod_ator) from elenco inner join atores on elenco.cod_ator = atores.cod_ator group by elenco.cod_ator, atores.nome_ator

SELECT vendedor.nome_vendedor,nome_cliente, SUM (qtde_vendida) FROM venda INNER JOIN cliente ON cliente.cod_cliente = venda.cod_cliente INNER JOIN vendedor ON venda.cod_vendedor = vendedor.cod_vendedor INNER JOIN itens_venda ON venda.cod_venda = itens_venda.cod_Venda GROUP BY nome_vendedor, nome_cliente

Clusula Having
A clusula HAVING opcional. HAVING semelhante a WHERE, que determina quais registros so selecionados. Depois que os registros so agrupados com GROUP BY, HAVING determina quais registros so exibidos. A clusula Group By deve vir antes da clusula Having.

Exemplo:
select cinema.cod_cidade, cidade.nome_cidade, count (cinema.cod_cidade) from cinema inner join cidade on cidade.cod_cidade = cinema.cod_cidade group by cinema.cod_cidade, cidade.nome_cidade having count(cinema.cod_cidade) > 1 SELECT cod_produto, count(qtde_vendida) FROM itens_venda GROUP BY cod_produto Having count(qtde_vendida) > 1 SELECT cod_produto, SUM(qtde_vendida) FROM itens_venda GROUP BY cod_produto having sum(qtde_vendida) > 2

Vises
como uma janela quer permite visualizar ou modificar seletivamente informaes armazenadas em tabelas. utilizada para:
Poder restringir o acesso a informaes contidas em tabelas; Permitir que os usurios efetuem consultas simples sobre consultas complicadas; Consultar dados de diversas tabelas.

Exemplo:
Create View v_cinema (nome_cinema) As Select nome_cinema From cinema Where cod_cinema is not null

ou...

Uma viso considerada uma tabela virtual, isto , funciona como uma tabela mas no contm dados. Os dados de uma viso so calculados a partir de outras tabelas.

Create View v_cinema (nome_cinema) As Select nome_cinema From cinema Where cod_cidade = 1

04/05/2012

Vises
Para remover uma viso: DROP VIEW (nome_da_viso); Exemplo: DROP VIEW v_cinema
Exemplo: 1) CREATE VIEW v_comedias AS SELECT * FROM filmes WHERE cod_genero = 1 2) SELECT * FROM V_comedias 3) DROP v_comedias

Para visualizar as informaes da View: SELECT * FROM v_cinema;

GENERATOR
Cria um auto-incremento de nmero inteiros e sequenciais. utilizado em conjunto com Trigger e ou Stored Procedure. Sintaxe: CREATE GENERATOR nome_do_generator

CREATE VIEW v_cinemacidade (nome_cinema, nome_cidade) AS Select nome_cinema, nome_cidade FROM cinema JOIN cidade USING (cod_cidade)

Exemplo: CREATE GENERATOR GEN_CINEMA CREATE GENERATOR GEN_CIDADE


Funo: GEN_ID() Retorna o valor do GENERATOR, isto , pode retornar o valor do GENERATOR e ou incrementar/decrementar. informado o nome do Generator e o valor do retorno do GENERATOR.

Sintaxe:

GEN_ID(generator,ID);

Exemplo:
Criao:

Triggers
Inicializao do Generator: Set generator gen_cidade to 0 Set generator gen_cidade to 10 Uma Trigger, ou um gatilho, um bloco de comandos que automaticamente executado quando um comando INSERT , DELETE ou UPDATE for executado em uma tabela do banco de dados.

Create generator Gen_cidade; Create generator Gen_cliente;

Utilizao: insert into cidade values (gen_id(gen_cidade,1),Cascavel')


Exemplo: (banco venda) Insert into cliente values (gen_id(gen_cliente,1),upper('Marcos Paulo'), upper ('a'))

As Triggers so usadas para realizar tarefas relacionadas com validaes, restries de acesso, rotinas de segurana e consistncia de dados; desta forma estes controles deixam de ser executados pela aplicao e passam a ser executados pelas Triggers em determinadas situaes.

Excluso:

Drop Generator nome_generator

Triggers
A ativao de uma trigger est associada ocorrncia de um evento:
INSERT UPDATE DELETE

Triggers
Sintaxe:
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 Explicao: table view : o nome tabela ou view que estar associada trigger. active inactive: indica se a trigger estar ativa ou no. Before (antes) after (depois): indica em que momento a trigger ser disparada. A trigger pode ser dispara antes ou depois de um evento de DELETE, UPDATE ou INSERT. delete insert update : indica em qual evento a trigger ser executada. Position: utilizado para definir a sequncia de execuo de triggers que esto associadas a um mesmo momento e evento. Por exemplo, posso ter duas triggers do tipo BEFORE DELETE. Como saber qual delas ser executada primeiro? O parmetro POSITION indicar isso. trigger body : o corpo da trigger, o cdigo dela.

Quanto ao instante de ativao: refere-se ao momento em que a condio e a ao so executadas


BEFORE: antes do comando SQL ser executado AFTER: depois da execuo do comando SQL

04/05/2012

Exemplo:
SET TERM ^ ;
Create Trigger TCidade For Cidade Before Insert Position 0 AS Begin if (new.cod_cidade is null) then Begin new.cod_cidade = gen_id(gen_cidade,1); End End ^ 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 variveis NEW e OLD


O Firebird disponibiliza duas variveis muito teis para serem usadas no contexto de uma trigger. So elas: NEW e OLD. A varivel NEW, no caso do INSERT, armazena o registro que est sendo inserido. No caso do UPDATE, armazena o registro depois de atualizado. A varivel OLD, no caso do DELETE, armazena o registro que est sendo excludo. No caso do UPDATE, armazena o registro antes de sofrer a atualizao. Quando esta sendo usando o Insert, no possvel fazer referencia usando a varivel old. Quando esta sendo usando o Delete no possvel fazer referencia usando a varivel new.

Exemplo:
SET TERM !! ; Create Trigger TCidade For Cidade Before Insert Position 0 AS Begin new.cod_cidade = gen_id(gen_cidade,1); End !! SET TERM ; !!

Criando Mensagens de Exceo


Sintaxe: CREATE EXCEPTION Nome_Exceo Mensagem; Exemplo:
CREATE EXCEPTION "NAO_DELETE_UF 'No possvel excluir um estado'; CREATE EXCEPTION "ACABOUESTOQUE" No existe quantidade suficiente deste produto em estoque.

Exemplo:
Criar as regras de exceo:

CREATE EXCEPTION "NAO_DELETE_UF" 'No possvel excluir um estado';

CREATE EXCEPTION "ACABOUESTOQUE No existe quantidade suficiente deste produto em estoque.

04/05/2012

Exemplo:

Exemplo:
SET TERM !; CREATE TRIGGER TUF FOR ESTADO BEFORE DELETE AS BEGIN EXCEPTION NAO_DELETE_UF; END! SET TERM;!
SET TERM ! ; CREATE TRIGGER TItensVenda FOR Itens_venda BEFORE INSERT POSITION 0 AS BEGIN IF ( NOT EXISTS ( SELECT * FROM PRODUTO WHERE COD_PRODUTO = NEW.COD_PRODUTO AND QTDE_ESTOQUE >= NEW.QTDE_VENDIDA ) ) THEN EXCEPTION ACABOUESTOQUE; END ! SET TERM ; !

Exemplo: Delete From Estado;

Exemplo:
Valor menor Insert into itens_venda values (201,456,123,30)

Exemplo:
SET TERM !!; ALTER TRIGGER TITENSVENDA BEFORE INSERT POSITION 0 AS BEGIN IF ( NOT EXISTS ( SELECT * FROM PRODUTO WHERE COD_PRODUTO = NEW.COD_PRODUTO AND QTDE_ESTOQUE >= NEW.QTDE_VENDIDA ) ) THEN EXCEPTION ACABOUESTOQUE; UPDATE PRODUTO SET QTDE_ESTOQUE = QTDE_ESTOQUE - NEW.QTDE_VENDIDA WHERE COD_PRODUTO = NEW.COD_PRODUTO; END !! SET TERM ; !!

Valor maior Insert into itens_venda values (202,456,123,300)

Exemplo:
Valor menor insert into itens_venda values (203,456,123,10)

Atualizao da quantidade do produto na tabela de produto


SET TERM !!; CREATE TRIGGER TITENSCOMPRA_ESTOQUE FOR ITENS_COMPRA BEFORE INSERT POSITION 0 AS BEGIN UPDATE PRODUTO SET QTDE_ESTOQUE = QTDE_ESTOQUE + NEW.QTDE_icompra WHERE COD_PRODUTO = NEW.produto_COD_PRODUTO; END !! SET TERM ; !!

Valor maior insert into itens_venda values (204,456,123,100)

10

04/05/2012

Exemplo:
Create Table Pessoa ( Cod_Pessoa Integer Not Null primary key, Pessoa_Idade Int Not Null, Pessoa_Tipo Char(1) ); SET TERM !; CREATE TRIGGER ATUALIZA_PESSOATIPO FOR PESSOA BEFORE INSERT OR UPDATE POSITION 0 AS BEGIN IF (NEW.PESSOA_IDADE < 18) THEN BEGIN NEW.PESSOA_TIPO = J; END ELSE NEW.PESSOA_TIPO = A; END! SET TERM;!

Exemplo:
INSERT:
insert into pessoa (cod_pessoa,pessoa_idade) values (1,10) insert into pessoa (cod_pessoa,pessoa_idade) values (2,20)

UPDATE: Update Pessoa Set Pessoa_Idade = 5;

Triggers
Excluindo uma triggers: DROP TRIGGER nome_trigger; Ativando/Desativando uma triggers: ALTER TRIGGER nome_trigger INACTIVE;

Exerccios
Usar o exemplo feito na ultima aula e aplicar os conceitos vistos.

Stored Procedures
Stored Procedure um conjunto de comandos, ao qual atribudo um nome. Este conjunto fica armazenado no Banco de Dados e pode ser chamado a qualquer momento tanto pelo SGBD (Sistema Gerenciador de Banco de Dados) quanto por um sistema que faz interface com o mesmo. Stored Procedures so pre-compiladas. Portanto, no necessrio mandar o comando pela rede para ser validado e executado. Elas so simplesmente executadas. Procedures podem possuir parmetros e, assim como o SELECT, retornar dados de uma tabela.

Stored Procedures
CREATE PROCEDURE NomedaProcedure <parmetros de entrada> RETURNS <parmetros de sada> AS <declarao de variveis locais> BEGIN <comandos da procedures> END

11

04/05/2012

Exemplo:
SET TERM !; CREATE PROCEDURE Cliente_Count RETURNS ( ClienteCount Integer) AS BEGIN SELECT COUNT(*) FROM Cliente INTO :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 ) AS BEGIN SELECT SUM(VALOR), AVG(VALOR), MIN(VALOR), MAX(VALOR) FROM VENDA WHERE COD_VENDEDOR = :VENDEDOR INTO :VALOR_TOTAL, :MEDIA,:VALOR_MIN,:VALOR_MAX; SUSPEND; END! SET TERM ; !

Exerccios
Usar o exemplo feito na ultima aula e aplicar os conceitos vistos.

12

Você também pode gostar