ORACLE:创建一个将数据插入另一个触发器的触发器 table
ORACLE: creating a trigger that inserts data into another table
我仍在处理非常基础的事情,在我的数据库中,当插入 "PRENOTAZIONE" 时,我编写的触发器理论上应该将我想要的所有数据插入到另一个 table 中FATTURAZIONE,但是当我测试它时出现以下错误:
INSERT INTO PRENOTAZIONE(ID_RISTORANTE,ID_UTENTE,ID_ORDINAZIONE,ORA,DATA_PRENOTAZIONE)
VALUES (2,21,1,'12:00',CURRENT_DATE)
Report error - ORA-01403: no data found ORA-06512: at
"VALERIO.TRIGGER1", line 16 ORA-04088: error during execution of
trigger '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,代码可以工作,但如果我尝试以任何方式使用它,我将得到 "no data"问题。
触发器中的一个(或多个)SELECT
语句引发了 NO_DATA_FOUND
错误。有几个选项:
- 使用聚合函数之一,例如
select max(pr.id_proprietario) into ...
- 对整个触发器使用一个异常处理单元
- 将每个
SELECT
封装到它自己的 BEGIN-EXCEPTION-END
块中并处理 NO_DATA_FOUND
基本上,这取决于发生这种情况时您打算做什么。
我通过创建一个与我发布的代码(几乎)完全相同的过程解决了这个问题,但我没有使用 :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;
我仍在处理非常基础的事情,在我的数据库中,当插入 "PRENOTAZIONE" 时,我编写的触发器理论上应该将我想要的所有数据插入到另一个 table 中FATTURAZIONE,但是当我测试它时出现以下错误:
INSERT INTO PRENOTAZIONE(ID_RISTORANTE,ID_UTENTE,ID_ORDINAZIONE,ORA,DATA_PRENOTAZIONE)
VALUES (2,21,1,'12:00',CURRENT_DATE)
Report error - ORA-01403: no data found ORA-06512: at "VALERIO.TRIGGER1", line 16 ORA-04088: error during execution of trigger '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,代码可以工作,但如果我尝试以任何方式使用它,我将得到 "no data"问题。
触发器中的一个(或多个)SELECT
语句引发了 NO_DATA_FOUND
错误。有几个选项:
- 使用聚合函数之一,例如
select max(pr.id_proprietario) into ...
- 对整个触发器使用一个异常处理单元
- 将每个
SELECT
封装到它自己的BEGIN-EXCEPTION-END
块中并处理NO_DATA_FOUND
基本上,这取决于发生这种情况时您打算做什么。
我通过创建一个与我发布的代码(几乎)完全相同的过程解决了这个问题,但我没有使用 :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;