我正在做一个SQL工作,但是我在创建触发器时遇到了麻烦,我不明白为什么。 这是代码:
CREATE OR REPLACE TRIGGER artigo_funcionario
BEFORE INSERT ON encomendaartigo
FOR EACH ROW
DECLARE
artigo_invalido exception;
artigo number(3);
auxiliar number(1):=0;
auxiliar_numero number(3);
CURSOR dotacao_funcionario is
select a.artigo_id
from artigo a, familia fa, dotacao d, encomenda e, funcionario f, categoria c
where e.encomenda_id = NEW.encomenda_id
and f.funcionario_id=e.funcionario_id
and f.categoria_id=c.categoria_id
and d.categoria_id=c.categoria_id
and fa.familia_id=d.familia_id
and a.familia_id=fa.familia_id;
BEGIN
open dotacao_funcionario;
loop
fetch dotacao_funcionario into artigo;
EXIT WHEN dotacao_funcionario%notfound;
auxiliar_numero := NEW.artigo_id;
if(artigo = auxiliar_numero) then
auxiliar:=1;
end if;
end loop;
close dotacao_funcionario;
if(auxiliar=0) then
raise artigo_invalido;
end if;
EXCEPTION
WHEN artigo_invalido THEN
dbms_output.put_line('O funcionário não pode encomendar o artigo introduzido');
END;
/
请注意问题不在于光标,所以不要担心我正在使用的表。唯一相关的是“encomendaartigo”,它具有以下属性:“encomenda_id”,“artigo_id”。
问题是我不能完全使用“new.xxxxx”运算符。如果运行,编译器日志显示以下内容:
Error(8,7): PL/SQL: SQL Statement ignored
Error(10,30): PL/SQL: ORA-00904: "NEW"."ENCOMENDA_ID": identificador inválido
Error(25,7): PL/SQL: Statement ignored
Error(25,29): PLS-00201: identifier 'NEW.ARTIGO_ID' must be declared
我已经尝试了一切,似乎没有任何工作。
答案 0 :(得分:2)
您在NEW之前缺少冒号。 e.g。)
auxiliar_numero := :NEW.artigo_id;
不
auxiliar_numero := NEW.artigo_id;
根据您的评论选择实施:
CREATE OR REPLACE TRIGGER artigo_funcionario
BEFORE INSERT ON encomendaartigo
FOR EACH ROW
DECLARE
l_check_artigo_id number := 0;
CURSOR dotacao_funcionario is
select 1
from artigo a, familia fa, dotacao d, encomenda e, funcionario f, categoria c
where e.encomenda_id = :NEW.encomenda_id
and f.funcionario_id=e.funcionario_id
and f.categoria_id=c.categoria_id
and d.categoria_id=c.categoria_id
and fa.familia_id=d.familia_id
and a.familia_id=fa.familia_id
and a.artigo_id = :NEW.artigo_id;
BEGIN
open dotacao_funcionario;
fetch dotacao_funcionario into l_check_artigo_id;
IF l_check_artigo_id = 1 then
raise_application_error(-20001, 'O funcionário não pode encomendar o artigo introduzido');
END IF;
CLOSE dotacao_funcionario;
EXCEPTION
WHEN OTHERS THEN
IF sqlcode = -20001 then
dbms_output.put_line('O funcionário não pode encomendar o artigo introduzido');
END IF;
-- a simple RAISE will re-raise the exception
RAISE;
END;
/