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

      Bom dia!

      Pessoal será que alguem pode me ajudar, estou com o seguinte problema: Preciso inserir dados em outra tabela de log apenas 1 vez independente da quantidade de registros que foram alterados. o problema é que quando o retiro FOR EACH ROW não está compilando a procedure.
      Verifiquei tbm que quando a TRIGGER é do tipo statement não podemos utilizar new nem old será que existe uma maneira:

      Obrigado!

      CREATE OR REPLACE TRIGGER INT_TABELA_NOTA_ENTRADA
      AFTER
      INSERT OR DELETE OR UPDATE
      ON TABELA_NOTA_ENTRADA
      REFERENCING NEW AS NEW OLD AS OLD
      FOR EACH ROW
      DECLARE
      ID INTEGER;
      BEGIN

      IF INSERTING THEN

      SELECT
      INT_NOTA_ENTRADA_ID.NEXTVAL
      INTO
      ID
      FROM
      DUAL;

      INSERT
      INTO
      INT_NOTA_ENTRADA (
      SEQUENCIAL,
      ID_CNE_NUMERO,
      ID_SER_NOTA,
      ID_LJA_CODIGO,
      ID_CLF_CODIGO,
      TIPO,
      STATUS)
      VALUES (
      ID,
      :NEW.CNE_NUMERO,
      :NEW.SER_NOTA,
      :NEW.LJA_CODIGO,
      :NEW.CLF_CODIGO,
      'U',
      'N');
      END IF;

      IF UPDATING THEN

      SELECT
      INT_NOTA_ENTRADA_ID.NEXTVAL
      INTO
      ID
      FROM
      DUAL;

      INSERT
      INTO
      INT_NOTA_ENTRADA (
      SEQUENCIAL,
      ID_CNE_NUMERO,
      ID_SER_NOTA,
      ID_LJA_CODIGO,
      ID_CLF_CODIGO,
      TIPO,
      STATUS)
      VALUES (
      ID,
      :OLD.CNE_NUMERO,
      :OLD.SER_NOTA,
      :OLD.LJA_CODIGO,
      :OLD.CLF_CODIGO,
      'U',
      'N');
      END IF;

      IF DELETING THEN

      SELECT
      INT_NOTA_ENTRADA_ID.NEXTVAL
      INTO
      ID
      FROM
      DUAL;

      INSERT
      INTO
      INT_NOTA_ENTRADA (
      SEQUENCIAL,
      ID_CNE_NUMERO,
      ID_SER_NOTA,
      ID_LJA_CODIGO,
      ID_CLF_CODIGO,
      TIPO,
      STATUS)
      VALUES (
      ID,
      :OLD.CNE_NUMERO,
      :OLD.SER_NOTA,
      :OLD.LJA_CODIGO,
      :OLD.CLF_CODIGO,
      'D',
      'N');
      END IF;

      END;

      #104972
      rman
      Participante

        @jurupoc

        Está meio confuso, você ao mesmo tempo não quer utilizar o FOR EACH ROW e quer utilizar o NEW e OLD. 😯

        Não entendi.

        Fica a dica, é possível utilizar a sequence diretamente, sem a necessidade de uma variável.

        Exemplo:


        INSERT
        INTO
        INT_NOTA_ENTRADA (
        SEQUENCIAL,
        ID_CNE_NUMERO,
        ID_SER_NOTA,
        ID_LJA_CODIGO,
        ID_CLF_CODIGO,
        TIPO,
        STATUS)
        VALUES (
        INT_NOTA_ENTRADA_ID.NEXTVAL,
        :NEW.CNE_NUMERO,
        :NEW.SER_NOTA,
        :NEW.LJA_CODIGO,
        :NEW.CLF_CODIGO,
        'U',
        'N');

        #104973
        jurupoc
        Participante

          @Rman,

          valeu pela dica! na verdade eu preciso dos valores old e new mas eu gostaria de inserir o log apenas uma vez para cada transação. Ficou mais claro?

          #104974
          Fábio Prado
          Participante

            @jurupoc,

            Não há como utilizar os valores old e new em triggers de instrução. O que dá para fazer é uma “gambi” criando uma trigger de linha e verificando se a linha correspondente já existe na outra tabela. Se existir, não faça nada! Dessa forma vc irá inserir os dados uma única vez, simulando uma trigger de instrução.

            []s

            Fábio Prado
            http://www.fabioprado.net

            #104977
            jurupoc
            Participante

              Fábio Prado,

              Fiz a “gambi” e deu certo!! valeu!!!

              Abraços!!!

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