Erros na Trigger

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
Responder
Eduardo Cardozo
Rank: Estagiário Júnior
Rank: Estagiário Júnior
Mensagens: 2
Registrado em: Sáb, 03 Mai 2014 1:23 pm

Boa noite amigos. Sou novo com SQL ORACLE e estou aprendendo na faculdade EAD. minha duvida é com o seguinte exercício:

Com base no diagrama ER 1 (imagem em anexo), crie uma trigger que ao apagar um vale, a trigger deva alterar o número de vales emitido, abertos , descontados e o valor de vales em aberto dos funcionários de acordo como status do vale.

Se o status for 1 deverá:
Diminuir o número de vales emitidos
Diminuir o número de vales abertos Diminuir o valor total de vales em aberto
Se o status for 2 deverá
Diminuir o número de vales emitidos
Diminuir o número de vales descontados

Eu fiz o seguinte código:

Selecionar tudo

 
CREATE OR REPLACE TRIGGER deletarvale
BEFORE DELETE ON tbvale
FOR EACH ROW 
BEGIN 
IF OLD.status = '1' THEN
UPDATE tbfuncionario
SET numvalesemitidos = numvalesemitidos - 1,
numvalesaberto = numvalesaberto -1,
valortotalvalesaberto = valortotalvalesaberto - OLD.valorvale
WHERE OLD.fkcodmat = pkcodmat;
END IF;
IF OLD.status = '2' THEN
UPDATE tbfuncionario
SET numvalesemitidos = numvalesemitidos - 1,
numvalesdescontados = numvalesdescontados -1
WHERE OLD.fkcodmat = pkcodmat;
END IF;
END;
Aparece os seguintes erros:

Erro(2,1): PL/SQL: Statement ignored
Erro(2,4): PLS-00201: o identificador 'OLD.STATUS' deve ser declarado
Erro(9,1): PL/SQL: Statement ignored
Erro(9,4): PLS-00201: o identificador 'OLD.STATUS' deve ser declarado
Anexos
Modelo ER
Modelo ER
prsilva
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 6
Registrado em: Seg, 24 Mar 2014 1:50 pm

Eduardo,

Se eu não estou enganado, na criação tem que referenciar o old, então ficaria mais ou menos assim...

Selecionar tudo

CREATE OR REPLACE TRIGGER deletarvale
BEFORE DELETE ON tbvale
REFERENCING OLD AS OLD
FOR EACH ROW
prsilva
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 6
Registrado em: Seg, 24 Mar 2014 1:50 pm

Eduardo,

Se eu não estou enganado, na criação tem que referenciar o old, então ficaria mais ou menos assim...

Selecionar tudo

CREATE OR REPLACE TRIGGER deletarvale
BEFORE DELETE ON tbvale
REFERENCING OLD AS OLD
FOR EACH ROW
Também é preciso os ':' antes do old por exemplo:

Selecionar tudo

IF :OLD.status = '1' THEN
Paulo Roberto
Eduardo Cardozo
Rank: Estagiário Júnior
Rank: Estagiário Júnior
Mensagens: 2
Registrado em: Sáb, 03 Mai 2014 1:23 pm

Obrigado pela ajuda prsilva! Compilou sem erros:D

Meu código ficou assim:

Selecionar tudo

CREATE OR REPLACE TRIGGER deletarvale
BEFORE DELETE ON tbvale
FOR EACH ROW
DECLARE OLD NUMBER;
BEGIN
  IF :OLd.status = '1' THEN
    UPDATE tbfuncionario
    SET numvalesemitidos = numvalesemitidos - 1,
           numvalesaberto = numvalesaberto -1,
           valortotalvalesaberto = valortotalvalesaberto - :OLD.valorvale
    WHERE :OLD.fkcodmat = pkcodmat;
  END IF;
  IF :OLD.status = '2' THEN
    UPDATE tbfuncionario
    SET numvalesemitidos = numvalesemitidos - 1,
           numvalesdescontados = numvalesdescontados -1
    WHERE :OLD.fkcodmat = pkcodmat;
  END IF;
END;
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 11 visitantes