冲突的触发器



我需要有关我的 Oracle SQL 代码的帮助,我遇到了一个错误,我不应该在这个插入中出现

UPDATE PRENOTAZIONI SET STATO='ACCETTATO' WHERE ID_PRENOTA='P00000011'

Errore con inizio alla riga : 16 nel comando -
Report error -
ORA-20007: Imposssibile accettare prenotazione: limite posti auto superato
ORA-06512: at "CARPOOLING_DBA.TR_MAX_NUM_OSPITI", line 16
ORA-04088: error during execution of trigger 'CARPOOLING_DBA.TR_MAX_NUM_OSPITI'
ORA-06512: at "CARPOOLING_DBA.SETTO_PAGA", line 2
ORA-04088: error during execution of trigger 'CARPOOLING_DBA.SETTO_PAGA'

UPDATE PRENOTAZIONI SET STATO='ACCETTATO' WHERE ID_PRENOTA='P00000011';

两个触发点中的第一个冲突

   create or replace TRIGGER TR_MAX_NUM_OSPITI
  BEFORE INSERT OR UPDATE ON PRENOTAZIONI
  FOR EACH ROW
  DECLARE 
  ERRORE EXCEPTION;
  POSTI_DISP NUMBER (1):=0;
  BEGIN
  --QUERY
  SELECT V.POSTI_DISPONIBILI INTO POSTI_DISP
  FROM VIAGGI V
  WHERE V.ID_VIAGGIO=:NEW.VIAGGIO;
  IF(:NEW.N_OSPITI+1<=POSTI_DISP)
  THEN NULL;
  ELSE RAISE ERRORE;
  END IF;
  exception
  WHEN ERRORE THEN RAISE_APPLICATION_ERROR (-20007,'Imposssibile accettare prenotazione: limite posti auto superato');
  END;

两个触发点中的第二个冲突

create or replace TRIGGER SETTO_PAGA
AFTER UPDATE OR INSERT OF STATO ON PRENOTAZIONI
BEGIN
UPDATE PRENOTAZIONI
SET PAGATO='Y'
WHERE PAGATO='N' AND STATO='ACCETTATO';
END;

如果需要,我也可以添加表PRENOTAZIONI和其他触发器...我只是找不到错误的原因....插入应该没问题,我检查了所有值,我得到的错误没有任何意义。.至少对我来说..

我真的没有看到任何"冲突"。错误原因是

IF(:NEW.N_OSPITI+1<=POSTI_DISP)
THEN NULL;
ELSE RAISE ERRORE;
END IF;

引发ERRORE时,将调用TR_MAX_NUM_OSPITI末尾的异常块:

exception
  WHEN ERRORE THEN RAISE_APPLICATION_ERROR (-20007,'Imposssibile accettare prenotazione: limite posti auto superato');
这将引发用户异常 -20007

,这是问题中包含的消息列表开头出现 ORA-20007 的原因。所以有错误是引起的,因为:NEW.N_OSPITI+1大于TR_MAX_NUM_OSPITI中的POSTI_DISP

祝你好运。

最新更新