我需要帮助我的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和其他触发器...我只是找不到错误的原因....插入应该没问题我检查了所有的值和错误我得到只是不做任何感觉..至少对我来说..
答案 0 :(得分:0)
我真的没有看到任何东西&#34;冲突&#34;这里。错误的原因是
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
大于POSTI_DISP
中的TR_MAX_NUM_OSPITI
。
祝你好运。