Pular para o conteúdo
  • Este tópico contém 5 respostas, 3 vozes e foi atualizado pela última vez 16 anos, 1 mês atrás por willmga.
Visualizando 6 posts - 1 até 6 (de 6 do total)
  • Autor
    Posts
  • #92202
    willmga
    Participante

      sou novo no forum e acabei de terminar um treinamento de programação oracle
      e eu nao compreendi muito bem o conceito de trigger

      e 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 ?

      #92204
      VitorLeandro
      Participante

        Mais 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 ROW

        BEGIN

        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;

        #92209
        burga
        Participante

          Primeiramente 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 ROW

          BEGIN
          .
          . [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)

          #92212
          VitorLeandro
          Participante

            Bem 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.

            #92214
            burga
            Participante

              Opa, eu não vi o post direito, achei que fossem colunas da mesma tabela!!!

              Bom, então a resposta esta pronta 😆

              #92217
              willmga
              Participante

                obrigado mesmo galera, fico devendo essa a vcs 😀

              Visualizando 6 posts - 1 até 6 (de 6 do total)
              • Você deve fazer login para responder a este tópico.