Ниже приведен фрагмент кода, который мне нужно улучшить.Внедрение триггеров базы данных Oracle
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) Если QTY в ABC обновляется или вставляется FLAG_CHG в XYZ должен быть обновлен до 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 после первого оператора обновления. –