SQL触发器,光标无法正常工作

时间:2015-11-27 17:53:08

标签: sql oracle triggers cursor

我正在做一个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

我已经尝试了一切,似乎没有任何工作。

1 个答案:

答案 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;
/