我需要有关我的 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
。
祝你好运。