代码之家  ›  专栏  ›  技术社区  ›  vc73

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

  •  0
  • vc73  · 技术社区  · 6 年前

    我仍然在处理非常基础的问题,在我的数据库中,当有一个插入到“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 回复  |  直到 6 年前
        1
  •  0
  •   Littlefoot    6 年前

    SELECT NO_DATA_FOUND

    • select max(pr.id_proprietario) into ...
    • BEGIN-EXCEPTION-END

        2
  •  0
  •   vc73    6 年前

    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;