Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ORACLE:创建将数据插入另一个表的触发器_Oracle_Database Trigger - Fatal编程技术网

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

ORACLE:创建将数据插入另一个表的触发器,oracle,database-trigger,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:未找到

我仍然在处理最基本的问题,在我的数据库中,当有一个插入到“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
语句引发了
无数据发现
错误。有几种选择:

  • 使用聚合函数之一,例如
    select max(pr.id\u proprietario)进入…
  • 对整个触发器使用一个异常处理单元
  • 将每个
    SELECT
    放入其自己的
    BEGIN-EXCEPTION-END
    块中,并处理
    未找到的数据

基本上,这取决于当这样的事情发生时你打算做什么

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

第一个
select
似乎没有找到任何匹配的行。能否将代码限制在必要的范围内?我认为错误发生在第16行,所以我建议您在第一次选择进入后删除所有其他行,因为它们会对您的问题进行轮询!好的,我会在几分钟内完成,因为现在我注意到只有当我尝试正确访问:newhandle exception并找到哪个选项返回no data found然后修复它时,我才发现“no data found”问题。我注意到我得到了“no data found”仅当我尝试访问
:new
”时出现问题。第一个
选择的
给出了
未找到的数据,并且未引用当前触发行中的任何值。(这本身似乎很奇怪,但逻辑取决于您。)顺便说一句,您会发现整齐地排列代码将使程序逻辑更易于遵循。