У меня есть триггер AFTER INSERT OR UPDATE OR DELETE
, который я пишу для хранения каждой редакции записи, которая происходит в определенной таблице, путем копирования значений INSERT
и UPDATE
:NEW
в зеркальную таблицу и для DELETE
значения :OLD
.
Я мог бы значительно больше загромождать свой код, условно передавая либо запись :NEW
, либо :OLD
в процедуру, которая затем выполняла бы вставку в мою таблицу истории. К сожалению, я не могу найти способ передать всю запись :OLD
или :NEW
.
Я что-то упустил или нет способа избежать перечисления каждого столбца :NEW
и :OLD
при вызове процедуры вставки?
Я хочу сделать следующее:
DECLARE
PROCEDURE LOCAL_INSERT(historyRecord in ACCT.ACCOUNTS%ROWTYPE) IS
BEGIN
INSERT INTO ACCT.ACCOUNTS_HISTORY (ID, NAME, DESCRIPTION, DATE) VALUES (historyRecord.ID, historyRecord.NAME, historyRecord.DESCRIPTION, SYSDATE);
END;
BEGIN
IF INSERTING OR UPDATING THEN
LOCAL_INSERT(:NEW);
ELSE --DELETING
LOCAL_INSERT(:OLD);
END IF;
END;
Но я застрял, делая это:
DECLARE
PROCEDURE LOCAL_INSERT(id in ACCT.ACCOUNTS.ID%TYPE,
name in ACCT.ACCOUNTS.NAME%TYPE,
description in ACCT.ACCOUNTS.DESCRIPTION%TYPE) IS
BEGIN
INSERT INTO ACCT.ACCOUNTS_HISTORY (ID, NAME, DESCRIPTION, DATE) VALUES (id, name, description, SYSDATE);
END;
BEGIN
IF INSERTING OR UPDATING THEN
LOCAL_INSERT(:NEW.ID, :NEW.NAME, :NEW.DESCRIPTION);
ELSE --DELETING
LOCAL_INSERT(:OLD.ID, :OLD.NAME, :OLD.DESCRIPTION);
END IF;
END;
Хорошо, это не выглядит большой разницей, но это всего лишь пример с 3 столбцами, а не с десятками.