ORACLE:创建一个将数据插入另一个表的触发器

时间:2018-07-11 08:53:30

标签: oracle database-trigger

我仍然在处理最基本的问题,在数据库中,当“ PRENOTAZIONE”中有插入内容时,我编写的触发器应该理论上将我想要的所有数据插入另一个称为FATTURAZIONE的表中,但是当我对其进行测试时,出现以下错误:

INSERT INTO PRENOTAZIONE(ID_RISTORANTE,ID_UTENTE,ID_ORDINAZIONE,ORA,DATA_PRENOTAZIONE)
VALUES (2,21,1,'12:00',CURRENT_DATE)
  

报告错误-ORA-01403:找不到数据ORA-06512:在   “ VALERIO.TRIGGER1”,第16行ORA-04088:执行过程中出错   触发“ VALERIO.TRIGGER1”

这是我的代码,希望您能帮助我弄清楚我在做什么错:

create or replace TRIGGER TRIGGER1 
AFTER INSERT ON PRENOTAZIONE 
FOR EACH ROW
DECLARE
dataEmissione DATE;
idRistorante NUMBER;
idProprietario NUMBER;
indirizzo VARCHAR2(20);
partitaIva NUMBER(38);
codiceFiscale VARCHAR(100);
idUtenteRegistrato NUMBER;
indirizzoUtente VARCHAR(100);
idMetodo NUMBER;
idListinoUtente NUMBER;
totaleFattura BINARY_DOUBLE;
BEGIN
 dataEmissione := :NEW.DATA_PRENOTAZIONE;
 idRistorante := :NEW.ID_RISTORANTE;
 SELECT PR.ID_PROPRIETARIO INTO idProprietario FROM PROPRIETARIO PR,RISTORANTI R
 WHERE PR.ID_PROPRIETARIO = R.PROPRIETARIO;
 SELECT R.INDIRIZZO INTO indirizzo FROM RISTORANTI R
 WHERE R.ID_RISTORANTE = :NEW.ID_RISTORANTE;
 SELECT R.PARTITA_IVA INTO partitaIva FROM RISTORANTI R 
 WHERE :NEW.ID_RISTORANTE = R.ID_RISTORANTE;
 SELECT UR.CODICE_FISCALE INTO codiceFiscale FROM UTENTE_REGISTRATO UR
 WHERE UR.ID_UTENTE = idProprietario;
 SELECT UR.ID_UTENTE INTO idUtenteRegistrato FROM UTENTE_REGISTRATO UR
 WHERE UR.ID_UTENTE = :NEW.ID_UTENTE;
 SELECT UR.RESIDENZA INTO indirizzoUtente FROM UTENTE_REGISTRATO UR
 WHERE UR.ID_UTENTE = idUtenteRegistrato;
 SELECT M.ID_METODO INTO idMetodo FROM METODI M, ORDINAZIONE O
 WHERE M.ID_METODO = O.ID_METODO AND O.ID_ORDINAZIONE = :NEW.ID_ORDINAZIONE;
 SELECT LU.ID_LISTINOUTENTI INTO idListinoUtente FROM LISTINO_UTENTI LU, ORDINAZIONE O
 WHERE LU.ID_LISTINOUTENTI = O.ID_LISTINOUTENTE AND O.ID_ORDINAZIONE = :NEW.ID_ORDINAZIONE;
 SELECT O.PREZZO_TOTALE INTO totaleFattura FROM ORDINAZIONE O
 WHERE O.ID_ORDINAZIONE = :NEW.ID_ORDINAZIONE;
 INSERT INTO FATTURAZIONE(DATA_EMISSIONE,ID_RISTORANTE,ID_PROPRIETARIO,INDIRIZZO,PARTITA_IVA,CODICE_FISCALE,ID_UTENTE_REGISTRATO,INDIRIZZO_UTENTE,ID_METODO_PAGAMENTO,ID_LISTINO_UTENTE,TOTALE_FATTURA)
 VALUES(dataEmissione,idRistorante,idProprietario,indirizzo,partitaIva,codiceFiscale,idUtenteRegistrato,indirizzoUtente,idMetodo,idListinoUtente,totaleFattura);
END;

编辑:我试图修改一些代码,但是我注意到的是,如果我不使用:new,那么代码可以工作,但是如果我尝试以任何方式使用它,我将得到“无数据” “问题。

2 个答案:

答案 0 :(得分:0)

触发器中的一个(或多个)SELECT语句引发了NO_DATA_FOUND错误。有几种选择:

  • 使用聚合函数之一,例如select max(pr.id_proprietario) into ...
  • 为整个触发器使用一个异常处理单元
  • 将每个SELECT放入自己的BEGIN-EXCEPTION-END块中并处理NO_DATA_FOUND

基本上,这取决于发生这种情况时您打算做什么。

答案 1 :(得分:0)

我通过创建一个几乎具有与我发布的完全相同的代码的过程来解决了这个问题,但是我没有使用:new而是使用触发器来调用该过程:

CREATE OR REPLACE TRIGGER FATTURA_TRIGGER 
BEFORE INSERT ON PRENOTAZIONE 
FOR EACH ROW
BEGIN
PROCEDURE_FATTURA(:new.ID_RISTORANTE,:new.ID_UTENTE,:new.ID_ORDINAZIONE,:new.D_P);
END;