Могу ли я назначить новое и старое в переменной типа строки в триггере Oracle?
Мне было поручено реализовать несколько триггерных сценариев, и у меня есть примеры от коллег, с которыми можно работать. В них они используют условные выражения pl-sql для обновления / вставки / удаления, а также гигантские операторы вставки (в другой таблице). Эти операторы вставки не отличаются кроме того, что значения имеют префикс с новым или старым. Я подумал, что буду умнее и постараюсь сделать мой немного более компактным, используя следующее:
DECLARE
vRow SATURN.SPRCMNT%ROWTYPE;
BEGIN
IF UPDATING THEN
vRow := :NEW;
ELSIF INSERTING THEN
vRow := :NEW;
ELSIF DELETING THEN
vRow := :OLD;
END IF;
-- Not the real insert statement
INSERT INTO blah
(columns)
VALUES
(vRow.somecolumns);
END;
Я получаю следующее от системы компиляции:
10/13 PLS-00049: bad bind variable 'NEW'
13/13 PLS-00049: bad bind variable 'NEW'
16/13 PLS-00049: bad bind variable 'OLD'
Очевидно, что это не так. Есть ли что-то, что достигнет того, что я пытаюсь? Являются ли: new и: old просто не настоящими типами строк? Кажется глупым повторять то, что по сути один и тот же код, три раза, и все же я не могу придумать лучшего способа. Черт, я думаю, что я читал, что есть жесткое ограничение на размер триггеров. Любая помощь приветствуется.
[Edit] Просто мысль, возможно ли ссылаться на ключевые слова UPDATING / INSERTING как-то внутри DECODE ()?
Например, если бы я мог выполнить DECODE (SOMETHINGVAR, UPDATING,: NEW.column, DELETING,: OLD.column), то я мог бы установить значение каждого столбца в vRow с помощью одного оператора.
Я думаю, что было бы лучше сначала проверить УДАЛЕНИЕ, и использовать по умолчанию для двух других.
Это возможно?