Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

usineiro

Trigger com update dando problema

Recommended Posts

Publique a descrição das tabelas.

 

Se a quero está retornando apenas uma linha o erro pode estar nas tipos e tamanhos do campo.

 

Assim vai mostrar o erro é o valor do total obtido.

 

CREATE OR REPLACE TRIGGER ATUAL_QUANTOTAL_AUT  
BEFORE INSERT ON SAIDAS -- <<<  FOR EACH ROW
DECLARE  
  VN_QUANTTOTAL SAIDAS.QUANTTOTAL%TYPE;  
  VN_QUANT PRODUTOS.QUANT%TYPE;
BEGIN   
  SELECT S.QUANTTOTAL, P.QUANT   
  INTO VN_QUANTTOTAL , VN_QUANT   
  FROM SAIDAS S   INNER JOIN PRODUTOS P ON S.NE = P.NE AND S.NE = :NEW.NE;   --   
  :NEW.QUANTTOTAL := VN_QUANT; -- <<<<
  EXCEPTION
    WHEN OTHERS THEN
      RAISE_APPLICATION_ERROR(-20001,'VN_QUANT '||VN_QUANT||' ERRO '||substr(SQLERRM, 1, 200));
END;

Compartilhar este post


Link para o post
Compartilhar em outros sites

Quando eu tentei compilar essa tua trigger ele deu erro esse erro:

"ORA-04082: referências NEW ou OLD não permitidas nos gatilhos de nível de tabela"

 

Dai eu dei uma arrumada pra compilar, compilou e ficou assim:

CREATE OR REPLACE TRIGGER ATUAL_QUANTOTAL_AUT  
BEFORE INSERT ON SAIDAS -- <<<  FOR EACH ROW
DECLARE  
  VN_QUANTTOTAL SAIDAS.QUANTTOTAL%TYPE;  
  VN_QUANT PRODUTOS.QUANT%TYPE;
BEGIN   
  SELECT S.QUANTTOTAL, P.QUANT   
  INTO VN_QUANTTOTAL , VN_QUANT   
  FROM SAIDAS S   
  INNER JOIN PRODUTOS P ON S.NE = P.NE;   --   
  VN_QUANTTOTAL := VN_QUANT; -- <<<< 
  EXCEPTION
    WHEN OTHERS THEN 
      RAISE_APPLICATION_ERROR(-20001,'VN_QUANT '||VN_QUANT||' ERRO '||substr(SQLERRM, 1, 200));
END;

 

Assim a Trigger nao apresento erros, o problema é quando vo da aquele insert pra testa, sempre da o mesmoo erro

 

Mesmo sabendo que o erro não é de tabela mutante, tentei até criar uma view e trabalhar com ela ao invez da tabela mais não adianta, da o mesmo erro.

Sera que não tem outra maneira de resolver este problema, mas com o mesmo principio, atualizar automaticamente o campo de quantidade total da tabela de saidas com o valor de quantitade total da tabela de produtos, quando uma nova saida for lançada.

grato

Compartilhar este post


Link para o post
Compartilhar em outros sites

A diretiva FOR EACH ROW faz com que a trigger seja executada para cada linha da tabela que sofreu o ins/upd/del , sem ela como está (inibida)

faz a trigger apenas para o comando de ins/upd/del, sendo geral não é permitido o uso das variáveis :NEW e :OLD.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tópico antigo, mas vamos a resolução, quando você usar o AFTER ou tentar fazer um UPDATE na própria tabela que se está usando a trigger acontece o problema apresentado. Para resolver esse problema você deve usar o BEFORE, pois assim você pode alterar algum campo da tabela. O motivo acontece, pois o banco está realizando um transação na tabela referida e você no momento não fazer outra transação em cima da mesma.

 

No caso, eu faria usando um cursor, varrendo e atualizando os dados que sejam necessários.

Compartilhar este post


Link para o post
Compartilhar em outros sites

To tentando fazer com que após eu inserir um novo registro em uma determinada tabela, um campo desta tabela, (que o usuario não vai inserir e sim o banco fará automaticamente) seja atualizado com o mesmo valor que consta na outra tabela.

 

Trigger:

CREATE OR REPLACE TRIGGER  ATUAL_QUANTOTAL_AUT
  AFTER INSERT ON SAIDAS
  FOR EACH ROW  

BEGIN 
UPDATE (SELECT S.QUANTTOTAL, P.QUANT 
       FROM SAIDAS S
       INNER JOIN PRODUTOS P ON :NEW.NE = P.NE ) T  
       SET T.QUANTTOTAL = T.QUANT; 
END;

 

 

A trigger é criada, é dada como valida, porém quando eu tento fazer um insert simples nessa tabela de saidas, o BD retorna o seguinte erro:

"ORA-06502: PL/SQL: erro: buffer de string de caracteres pequeno demais numérico ou de valor"

 

Sem a trigger eu consigo inserir normalmente.

 

Só pra constar os campos q to tentando passar de um para o outro são iguais, de mesmo tamanho.

Alguem saberia me ajudar?

 

Obrigado

Compartilhar este post


Link para o post
Compartilhar em outros sites

Que sintaxe é esta ?

 

UPDATE (SELECT S.QUANTTOTAL, P.QUANT 
       FROM SAIDAS S
       INNER JOIN PRODUTOS P ON :NEW.NE = P.NE ) T  
       SET T.QUANTTOTAL = T.QUANT; 

 

Que tabela se quer atualizar ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.