【问题标题】:ORACLE: creating a trigger that inserts data into another tableORACLE:创建将数据插入另一个表的触发器
【发布时间】:2018-07-11 08:53:29
【问题描述】:

我仍在处理最基本的问题,并且在我的数据库中插入“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,代码可以工作,但如果我尝试以任何方式使用它,我会得到“没有数据"问题。

【问题讨论】:

  • 看起来第一个 select 没有找到任何匹配的行。
  • 你能把你的代码限制在必要的范围内吗?我认为错误发生在第 16 行,因此我建议您在第一次 SELECT INTO 之后删除所有其他行,因为它们会污染您的问题!
  • 好的,我会在几分钟内完成,现在我注意到只有在尝试访问时才会出现“找不到数据”问题:new
  • 正确处理异常并找到哪个选择返回未找到数据然后修复它
  • '我注意到只有当我尝试访问:new'时才会出现“找不到数据”的问题' 第一个select 是给no_data_found 而没有引用当前触发行中的任何值。 (这本身看起来很奇怪,但逻辑取决于您。)顺便说一句,您会发现整齐地布置代码将使程序逻辑更容易遵循。

标签: oracle database-trigger


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    我通过创建一个具有(几乎)与我发布的完全相同的代码的过程解决了这个问题,但我没有使用 :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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-02
      • 2019-05-20
      • 1970-01-01
      • 1970-01-01
      • 2020-08-23
      • 2011-10-17
      • 1970-01-01
      • 2021-08-05
      相关资源
      最近更新 更多