簡體   English   中英

帶有光標的SQL觸發器不起作用

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM