[英]SQL Trigger with cursor not working
我正在執行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
我已經嘗試了一切,但似乎沒有任何效果。
您在新消息之前錯過了冒號。 例如)
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;
/
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.