Trigger para controlar estoque

Oracle

15/05/2011

Colegas, estou iniciando o oracle, fiz um trigger que apresentou o erro abaixo:Podem me ajudar por favor.
create or replace TRIGGER TRG_ESTOQUE_ENTRADA AFTER INSERT ON NF_ENTRADA BEGIN
-- Se estiver inserindo  IF INSERTING THEN    UPDATE PRODUTO SET QTDE_ESTOQUE = (QTDE_ESTOQUE + :NEW.QTDE_ENTRADA)     WHERE ID_PRODUTO = :NEW.ID_PRODUTO;     -- Se estiver atualizando             ELSIF UPDATING THEN      UPDATE PRODUTO             SET QTDE_ESTOQUE = ((QTDE_ESTOQUE - :OLD.QTDE_ENTRADA) + :NEW.QTDE_ENTRADA)             WHERE ID_PRODUTO = :NEW.ID_PRODUTO;      -- Se estiver deletando             ELSIF DELETING THEN    UPDATE PRODUTO             SET QTDE_ESTOQUE = (QTDE_ESTOQUE - :OLD.QTDE_ENTRADA)             WHERE ID_PRODUTO = :OLD.ID_PRODUTO;   END IF;                  END;
ERRO:
Relatório de erro:ORA-04082: referências NEW ou OLD não permitidas nos gatilhos de nível de tabela04082. 00000 -  "NEW or OLD references not allowed in table level triggers"*Cause:    The trigger is accessing "new" or "old" values in a table trigger.*Action:   Remove any new or old references.
Nilo Souza

Nilo Souza

Curtidas 0

Respostas

Anthony Accioly

Anthony Accioly

15/05/2011

Sugestão 1: Está faltando o
FOR EACH ROW
Sugestão 2: Acho que você quer que o disparo seja feito em
AFTER INSERT OR UPDATE OR DELETE 

Veja exemplos em  http://psoug.org/reference/table_trigger.html
GOSTEI 0
Nilo Souza

Nilo Souza

15/05/2011

Isso mesmo. Obrigado
GOSTEI 0
Anthony Accioly

Anthony Accioly

15/05/2011

Fico feliz em ajudar. Você poderia, por favor, atualizar o status do chamado para resolvido?
Abraços.
GOSTEI 0
Alex Willian

Alex Willian

15/05/2011

esse código é o correto!!!

CREATE OR REPLACE TRIGGER trg_prod_estoque_ajustar
AFTER INSERT OR UPDATE OR DELETE ON tb_itens
FOR EACH ROW
BEGIN
IF INSERTING THEN
UPDATE tb_produto SET estoque = estoque - :NEW.qtde
WHERE cod_prod = :NEW.cod_prod;
ELSIF UPDATING THEN
UPDATE tb_produto SET estoque = estoque + :OLD.qtde
WHERE cod_prod = :OLD.cod_prod;

UPDATE tb_produto SET estoque = estoque - :NEW.qtde
WHERE cod_prod = :NEW.cod_prod;
ELSIF DELETING THEN
UPDATE tb_produto SET estoque = estoque + :OLD.qtde
WHERE cod_prod = :OLD.cod_prod;
END IF;
END;
GOSTEI 0
POSTAR