sql - 如何在触发器中使用更新表中的数据?
问题描述
所以我有这两张表:
create table CURRENCY
(
name VARCHAR2(40 CHAR) PRIMARY KEY,
value NUMBER(6,2)
);
create table EXCHANGE_RATE
(
currency1 references CURRENCY(name),
currency2 references CURRENCY(name),
price NUMBER(6,2),
PRIMARY KEY(currency1, currency2)
);
每当我插入一个新的CURRENCY
,我想EXCHANGE_RATES
在所有以前CURRIENCIES
的和一个新的之间创建一个新的。假设我的表中只有一种货币:
INSERT INTO CURRENCY VALUES("EURO", 2.0)
现在要插入一个新的:
INSERT INTO CURRENCY VALUES("DOLLAR", 1.0)
我的目标是插入EXCHANGE_RATE
行:
"EURO", "DOLLAR", 2.0
"DOLLAR", "EURO", 0.5
最好的方法是什么?我试过使用AFTER INSERT OR UPDATE
触发器:
CREATE OR REPLACE TRIGGER new_currency
AFTER INSERT OR UPDATE
ON CURRENCY
FOR EACH ROW
BEGIN
INSERT INTO EXCHANGE_RATE (currency1, currency2, price)
SELECT name, :new.name, price/:new.price
FROM CURRENCY;
INSERT INTO EXCHANGE_RATE (currency1, currency2, price)
SELECT :new.name, name, :new.price/price
FROM CURRENCY;
END;
/
但它不起作用,因为我必须查询CURRENCY
表,正在更新,我最终得到 ORA-04091。
这样做的正确方法是什么?
解决方案
您无法查询导致触发器在触发器本身内部触发的表。
如果我是你,我会考虑使用存储过程的方法。只需将您的插入脚本移动到一个过程中
CREATE PROCEDURE INS_CURRENCY (p_currency varchar2, p_price number) as
BEGIN
INSERT INTO CURRENCY VALUES(p_currency , p_Price);
INSERT INTO EXCHANGE_RATE (currency1, currency2, price)
SELECT name, p_currency, price/p_price
FROM CURRENCY
WHERE NAME != p_current;
INSERT INTO EXCHANGE_RATE (currency1, currency2, price)
SELECT p_currency, name, p_price/price
FROM CURRENCY
WHERE name != p_currency;
END;
推荐阅读
- python - ConnectionRefusedError: [WinError 10061] 目标机主动拒绝如何解决?(Django SMTP)
- sql-server - 从 Crystal Report 的 RPT 文件创建 PDF 并通过存储过程将生成的 PDF 文件附加到 SQL 的 db 邮件系统中
- c# - 无法授权我的前端 .Net 核心应用程序
- java - 如何在 Oracle SQL Developer 上修复“java.libary.path 中没有 ocijdbc12”?
- ubuntu-16.04 - 从 Ubuntu 中删除 git 机密
- swift - 使用“CodingKeys”枚举仅覆盖少数 JSON 键
- html - 图标未在圆形标签内垂直居中显示
- php - 使用php从文本文件中提取值
- sql - 子查询和普通查询得出不同的结果
- php - 如何将表单验证错误放在警告框中?