Motta 645 Denunciar post Postado Maio 29, 2010 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
usineiro 0 Denunciar post Postado Junho 10, 2010 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
Motta 645 Denunciar post Postado Junho 10, 2010 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
jscarmo 0 Denunciar post Postado Fevereiro 17, 2012 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
Queliton Souza 0 Denunciar post Postado Julho 6, 2012 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
Motta 645 Denunciar post Postado Julho 6, 2012 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