【问题标题】:Implementing Oracle Database Triggers实施 Oracle 数据库触发器
【发布时间】:2016-06-07 02:32:33
【问题描述】:

下面是我需要改进的代码sn-p。

CREATE OR REPLACE T_CHANGE AFTER ---Trigger Created for After insert/update option
INSERT OR 
UPDATE OF QTY ON ABC BEGIN 
IF INSERTING THEN 
UPDATE XYZ D SET FLAG_CHG = 1 
WHERE EXISTS 
(
SELECT 1 FROM XYZ D WHERE 
:NEW.PRODUCT = D.PRODUCT AND 
:NEW.LOCATION = D.LOCATION 
);

IF UPDATING THEN 
UPDATE XYZ D SET FLAG_CHG = 1 
WHERE EXISTS 
(
SELECT 1 FROM XYZ D WHERE 
:OLD.PRODUCT = D.PRODUCT AND 
:OLD.LOCATION = D.LOCATION `enter code here`
);

END IF 
END T_CHANGE;

The two mentioned tables are as follow:

CREATE TABLE XYZ (
PRODUCT VARCHAR2(50),
LOCATION VArchar2(50),
FLAG_CHG BOOLEAN DEFAULT 0,
CONSTRAINT XYZ_PK PRIMARY KEY (PRODUCT,LOCATION)
)

CREATE TABLE ABC (
PRODUCT VARCHAR2(50),
LOCATION VArchar2(50),
QTY NUMBER,
CONSTRAINT ABC_PK PRIMARY KEY (PRODUCT,LOCATION)
)

你想达到什么目的?

1)如果 ABC 中的 QTY 被更新或插入,XYZ 中的 FLAG_CHG 应该更新为 1。

我对此有一些疑问

1.) Will the above code work? :P
2.) If works, will it have performance issues ?
3.) How can I enhance this code to improve the performance ?
4.) Please advice a better approach ,if any,to fulfill the requirement?

提前致谢。

【问题讨论】:

  • 一方面,您不需要 UPDATE 语句中的子查询 - 只需将过滤器直接放在 WHERE 子句中。否则,您的更新将应用于表中的所有记录。此外,您在第一个更新语句之后缺少 END IF。

标签: oracle oracle11g triggers


【解决方案1】:

我猜它不会起作用,因为 SQL 不会识别你要在那里做什么。

更好的方法是在你的表中创建一些唯一的字段,然后查询INSERT .... ON DUPLICATE KEY UPDATE ...

参考

UPDATE on DUPLICATE KEY ORACLE

【讨论】:

  • 创建触发器是要求的一部分。我不需要插入任何值,但我只想更新 XYZ 中的标志,如果更新 ABC 中的 QTY col 或为 XYZ 中存在的 (Product,Location) 组合插入新行。
  • 您需要将您的逻辑与 sql 查询提供的内容一起使用,例如使用“更新重复键”查询。
猜你喜欢
  • 2013-10-03
  • 1970-01-01
  • 1970-01-01
  • 2017-05-20
  • 2016-05-29
  • 2013-03-08
  • 2012-02-19
  • 2011-12-22
  • 1970-01-01
相关资源
最近更新 更多