oracle - 更新后插入行(不是新的)的触发器
问题描述
我想创建一个触发器,该触发器在 novoitable 中插入带有日期的行以及带有相关日期的 ri_di 的 bi_id。我的更新是将状态属性上的 N(未付费)更改为“Y”。所以我不想在“跟踪”中插入任何新值。它们是已经存在但未更新的值。但是在触发器之后实际上插入了 3 行具有不同日期和 ri_id 的行。我只需要它插入一个!
Create table register(
BI_ID NUMBER,
ISBN Varchar(20),
RI_ID Varchar(50),
monthNum NUMBER,
CONSTRAINT register_pk PRIMARY KEY (AB_ID),
CONSTRAINT fk_magazine FOREIGN KEY (ISBN) REFERENCES MAGAZINE(ISBN),
CONSTRAINT fk_novoi FOREIGN KEY (IN_ID) REFERENCES novoi(IN_ID)
);
Create table novoi(
RI_ID Varchar(50),
CIN Varchar(50),
DATEI Date,
STATE Varchar(50),
CONSTRAINT nvoi_pk PRIMARY KEY (RI_ID),
CONSTRAINT fk_client FOREIGN KEY (CIN) REFERENCES CLIENT(CIN)
);
CREATE TABLE Journalisation (
rui_ID NUMBER,
Datenovoi DATE,
BI_ID NUMBER,
CONSTRAINT FK_register FOREIGN KEY (BI_ID) REFERENCES register (BI_ID)
);
---
create or replace trigger T2
after update on novoi
enable
declare
CURSOR up_upda IS
SELECT distinct novoi.datei, invoice.state, register.bi_id
from register, novoi
where novoi.ri_id = register.ri_id ;
begin
for in_upda in up_upda loop
dbms_output.put_line('check');
INSERT INTO register(nui_id, datenovoi, bi_id) VALUES
(nui_seq.nextval, in_upda.datei, in_upda.bi_id);
end loop;
end;
update novoi set state = 'y' where datei = '04-04-19';
解决方案
据我了解您的问题,您可以在我使用:NEW
. 您尚未在触发器中引用更新的记录,这就是将 3 条或多条记录插入目标表的原因。
CREATE OR REPLACE TRIGGER T2 AFTER
UPDATE ON INVOICE
BEGIN
DBMS_OUTPUT.PUT_LINE('check');
INSERT INTO JOURNALISATION (
JOUR_ID,
DATEINVOICE,
AB_ID
)
SELECT JOUR_SEQ.NEXTVAL,
:NEW.DATEI,
ABONNEMENT.AB_ID
FROM ABONNEMENT
WHERE :NEW.IN_ID = ABONNEMENT.IN_ID;
END;
/
如果我的理解不正确或代码未按预期工作,请发表评论。
推荐阅读
- excel - 添加新列并应用公式的宏
- haskell - 模板 Haskell 做变量赋值说明
- javascript - 前端模板网站是动态的还是静态的?
- formatting - 降价段落
- reactjs - TypeError:无法读取未定义 ReactJS 的属性“推送”
- java - 为什么尽管 if 语句为真,但仍在执行 else 语句?
- electron - 电子快速启动、ipcMain、CSP 在 Javascript 中阻止“评估”
- python - 如何在 python selenium 中使用 iframe?
- java - 添加到 Spring 项目的 HikariCP 出现错误
- sql - 如何使用具有唯一 ID 的数百条记录更新现有表