- Este tópico contém 5 respostas, 3 vozes e foi atualizado pela última vez 16 anos, 1 mês atrás por
willmga.
-
AutorPosts
-
20 de janeiro de 2010 às 7:10 pm #92202
willmga
Participantesou novo no forum e acabei de terminar um treinamento de programação oracle
e eu nao compreendi muito bem o conceito de triggere o instrutor pediu para que eu desenvolvece um projeto de uma locadora
e ele pediu para que eu creace uma trigger assim
1) Criar uma trigger de banco de dados que ao inserir ou atualizar dados na tabela MOVLOC, de
acordo com o campo ST_LOCACAO da tabela MOVLOC, automaticamente atualize o campo
ST_MIDIA da tabela MIDIA. Lembre-se que na tabela MOVLOC os valores disponíveis para o
campo ST_LOCAÇÃO são:
“L” – Locado
“D” – Devolvido, porém não pago.
“P” – Pago, porém não devolvido
“Q” – Quitado, ou seja, pago e devolvido.
E os valores disponíveis para o campo ST_MIDIA da tabela MIDIA são:
“D” – Disponível
“L” – Locada
“R” – Reservada
Situações:
· se uma midia foi locada (MOVLOC.ST_LOCACAO = ‘L’) ou já foi devolvida ou paga
(MOVLOC.ST_LOCACAO in (‘P’,’D’)) seu status na tabela MIDIA é “L” (locada).
· se uma midia foi quitada (MOVLOC.ST_LOCACAO = ‘Q’) seu status na tabela
MIDIA é “D” (disponível)alguem pode me ajuda ?
20 de janeiro de 2010 às 8:32 pm #92204VitorLeandro
ParticipanteMais ou menos assim…
Caso o código da midia seja cod_midia e exista nas duas tabelas!
CREATE OR REPLACE TRIGGER ATUALIZA_MIDIA
BEFORE INSERT OR UPDATE
ON MOVLOC
REFERENCING NEW AS NEW OLD AS OLD
FOR EACH ROWBEGIN
IF :NEW.ST_LOCACAO IN ('L','P','D') THEN UPDATE MIDIA SET ST_MIDIA = 'L' WHERE MIDIA.COD_MIDIA = (:NEW.COD_MIDIA); ELSIF :NEW.ST_LOCACAO = 'Q' THEN UPDATE MIDIA SET ST_MIDIA = 'D' WHERE MIDIA.COD_MIDIA = (:NEW.COD_MIDIA); END IF;END ATUALIZA_MIDIA;
20 de janeiro de 2010 às 8:48 pm #92209burga
ParticipantePrimeiramente bem-vindo ao fórum willmga,
Bom, quanto ao conceito de trigger, nada mais é do que um bloco de comandos a ser executado antes ou depois (BEFORE/AFTER) da ocorrência de um determinado evento no banco de dados (insert, update, delete, logon, servererror, …).
No seu caso você deverá criar a trigger que inicia nos eventos de insert e update da coluna ST_LOCACAO da tabela MOVLOC. Então acertando o código do VitorLeandro ficaria assim:
CREATE OR REPLACE TRIGGER ATUALIZA_MIDIA
BEFORE INSERT OR UPDATE
OF ST_LOCACAO ON MOVLOC
REFERENCING NEW AS NEW OLD AS OLD
FOR EACH ROWBEGIN
.
. [bloco de comandos]
.
END ATUALIZA_MIDIA;E ainda, existe outra maneira que você pode alterar o valor da coluna sem utilizar o comando UPDATE, que neste caso provavelmente ocasionará em uma exceção de “tabela mutante”. Isto você poderá fazer utilizando o :NEW.ST_MIDIA recebendo diretamente o valor necessário. Exemplo:
:NEW.ST_MIDIA := 'L';O resto fica pra você se virar e estudar… 8)
20 de janeiro de 2010 às 9:03 pm #92212VitorLeandro
ParticipanteBem observado, só disparar quando houver alteração no campo ST_LOCACAO. Um detalhe, como ocorrerá o erro “tabela mutante” se o update é eu outra tabela?
Eu realizei alguns teste aqui e funcionou.
20 de janeiro de 2010 às 9:06 pm #92214burga
ParticipanteOpa, eu não vi o post direito, achei que fossem colunas da mesma tabela!!!
Bom, então a resposta esta pronta 😆
20 de janeiro de 2010 às 9:17 pm #92217willmga
Participanteobrigado mesmo galera, fico devendo essa a vcs 😀
-
AutorPosts
- Você deve fazer login para responder a este tópico.