Pular para o conteúdo
Visualizando 5 posts - 1 até 5 (de 5 do total)
  • Autor
    Posts
  • #104971
    Avatar de jurupocjurupoc
    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
      Avatar de rmanrman
      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
        Avatar de jurupocjurupoc
        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
          Avatar de Fábio PradoFá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
            Avatar de jurupocjurupoc
            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