【发布时间】: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。