3
respostas

Cria trigger para realizar um update após um insert na tabela TGFFIN

Olá, eu preciso criar uma trigger que realize um update na tabela TGFFIN alterando a data de vencimento conforme o código do update que disponibilizei,

Eu estou realizado a query para obter os dados para validação, e após a validação realizo o update, está retornado erro que os dados não foram encontrados.

Alguém pode me ajudar por favor.

create or replace TRIGGER TRG_UPD_DTVENC_TGFFIN 
AFTER INSERT ON TGFFIN
FOR EACH ROW
DECLARE
       P_SOLICITANTE        VARCHAR2(80);
       P_NTUSERNAME         VARCHAR2(30);
       P_COUNT              INT := 0;
       P_PROGRAMNAME        VARCHAR2(80);
       ERRMSG               VARCHAR2(255);
       ERROR                EXCEPTION;
       P_VALIDAR            BOOLEAN;
       P_NUFIN              NUMBER(10);
       P_CODFUNC            NUMBER(10);
       P_CHAVE              VARCHAR(15);
       P_VLRTROCA           FLOAT;
       P_NUIMP              INT := 0;
       P_MINDEST            INT; 
       P_MAXDEST            INT;
       P_MSG                VARCHAR2(200);
       P_NUNOTA              INT := 0;
       P_CODTIPVENDA         INT := 0;

 BEGIN   
 begin
       SELECT DISTINCT 
                    CAB.CODTIPVENDA, CAB.NUNOTA
              INTO P_CODTIPVENDA,P_NUNOTA
              FROM TGFCAB CAB
             WHERE :NEW.NUNOTA = CAB.CODTIPVENDA 
              AND CAB.CODTIPVENDA  = 141;

                EXCEPTION
                    WHEN NO_DATA_FOUND THEN
                    return;   
 end;

  IF Stp_Get_Atualizando THEN
    RETURN;
  END IF;


   IF P_CODTIPVENDA = 141 THEN

        UPDATE TGFFIN
        SET DTVENC =(SELECT (CAB.DTPREVENT + PRAZO) FROM TGFCAB CAB
                                                    JOIN TGFPPG PPG
                                                    ON CAB.CODTIPVENDA= PPG.CODTIPVENDA 
                                                    WHERE CAB.CODTIPVENDA = P_CODTIPVENDA
                                                     AND CAB.NUNOTA= :OLD.NUNOTA)
        WHERE NUNOTA= :OLD.NUNOTA;
END IF;
  COMMIT;

RETURN;
END;
3 respostas

Olá Leonildo, tudo bem?

Você poderia fornecer mais detalhes?

  • O erro é retornado em que momento? Quando você tenta realizar a criação da trigger ou quando é realizado o insert na tabela que a trigger é executada?
  • Você poderia detalhar o que cada trecho da sua trigger faz? Assim poderei entender melhor o código, já que não conheço seu banco de dados

Aguardo o seu retorno!

Olá Danielle.

O objetivo da Trigger- realizar update na tabela TGFFIN após um insert na mesma tabela [TGFFIN], atualizando o campo DTVENC Não precisa ser exatamente uma trigger, poderia ser também uma trigger chamando uma PROC mas não sei chamar uma PROC por trigger passando os parâmetros para PROC em ORACLE como faço em SQL Server e as aulas que existe no curso de ORACLE são todas muito básico, até como sugestão, no meu caso eu preciso de aulas mais avançadas.

Caso não entenda e queria me chamar no whatsapp 11 94969 0002, abraço.

Continuando.

Neste bloco abaixo meu objetivo é declarar as várias usando Package.

create or replace TRIGGER TRG_UPD_DTVENC_TGFFIN 
AFTER INSERT ON TGFFIN
FOR EACH ROW
DECLARE
       P_SOLICITANTE        VARCHAR2(80);
       P_NTUSERNAME         VARCHAR2(30);
       P_COUNT              INT := 0;
       P_PROGRAMNAME        VARCHAR2(80);
       ERRMSG               VARCHAR2(255);
       ERROR                EXCEPTION;
       P_VALIDAR            BOOLEAN;
       P_NUFIN              NUMBER(10);
       P_CODFUNC            NUMBER(10);
       P_CHAVE              VARCHAR(15);
       P_VLRTROCA           FLOAT;
       P_NUIMP              INT := 0;
       P_MINDEST            INT; 
       P_MAXDEST            INT;
       P_MSG                VARCHAR2(200);
       P_NUNOTA              INT := 0;
       P_CODTIPVENDA         INT := 0;

Já neste bloco abaixo, meu objetivo é obter o registro que foi realizado o insert e verificar se o regitro está dentro das condições que especifiquei sendo que o campo :NEW.NUNOTA=CAB.NUNOTA aqui meu objetivo seria pegar o registro inserido na tabela TGFFIN e verificar se é igual ao registro da tabela TGFCAB a outra condição é Verificar se esté campo CAB.CODTIPVENDA= 141 tem o valor =141 conforme demostra.

 begin
       SELECT DISTINCT 
                    CAB.CODTIPVENDA, CAB.NUNOTA
              INTO P_CODTIPVENDA,P_NUNOTA
              FROM TGFCAB CAB
             WHERE :NEW.NUNOTA = CAB.CODTIPVENDA 
              AND CAB.CODTIPVENDA  = 141;

                EXCEPTION
                    WHEN NO_DATA_FOUND THEN
                    return;   
 end;

Se atender as condições acima, então realiza o update do campo DTVENC conforme o código abaixo EXEMPLO: DTVENC = CAB.DTPREVENT + PRAZO) e não atender então não executa nada.

IF P_CODTIPVENDA = 141 THEN

        UPDATE TGFFIN
        SET DTVENC =(SELECT (CAB.DTPREVENT + PRAZO) FROM TGFCAB CAB
                                                    JOIN TGFPPG PPG
                                                    ON CAB.CODTIPVENDA= PPG.CODTIPVENDA 
                                                    WHERE CAB.CODTIPVENDA = P_CODTIPVENDA
                                                     AND CAB.NUNOTA= :OLD.NUNOTA)
        WHERE NUNOTA= :OLD.NUNOTA;

Consegue entender o que você precisa e como a sua trigger funciona Leonildo, e aparentemente o seu código não apresenta problemas. Porém sem conhecer como está o seu banco de dados e a estrutura das tabelas, não tenho como indicar especificamente o que pode estar causando problemas, já que pode ser N coisas, como ser um problema na sua trigger ou algo ligado as tabelas.

Para tentar ti ajudar de uma forma mais objetiva eu precisaria reproduzir o problema aqui no meu ambiente para tentar identificar o que pode estar acontecendo. Então se possível, você poderia disponibilizar a estrutura das suas tabelas que estão na trigger? Você pode disponibilizar um arquivo sql com essas informações ou um backup do banco de dados. Caso você não queria disponibilizar estas informações aqui no fórum, você pode enviar para o nosso comercial, e eles passam o arquivo para mim.

Indico Leonildo, que você não disponibilize seus dados pessoais aqui no fórum, como o seu contato, pois é uma plataforma aberta e várias pessoas podem ter acesso a essas informações e podem utilizar de forma indevida.