Czy w wyzwalaczu Oracle mogę przypisać nową i starą zmienną rowtype?
Mam zadanie zaimplementowania kilku skryptów wyzwalających, a mam przykłady od współpracowników do pracy. W tych przypadkach używają warunków warunkowych pl-sql do aktualizacji / wstawiania / usuwania, a także gigantycznych instrukcji wstawiania (w innej tabeli). Te instrukcje wstawiania nie różnią się od siebie, niezależnie od tego, czy wartości są poprzedzone nowymi czy starymi. Myślałem, że będę sprytny i spróbuję uczynić mój trochę bardziej zwartym, używając następujących:
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;
Otrzymuję następujące informacje z systemu kompilacji:
10/13 PLS-00049: bad bind variable 'NEW'
13/13 PLS-00049: bad bind variable 'NEW'
16/13 PLS-00049: bad bind variable 'OLD'
Oczywiście to się nie podoba. Czy jest coś, co osiągnie to, co próbuję? Czy: nowe i: stare tylko nie prawdziwe wiersze? Wydaje się głupie powtarzanie tego, co jest zasadniczo tym samym kodem 3 razy, a jednak nie mogę znaleźć lepszego sposobu. Do diabła, myślę, że przeczytałem, że istnieje także pewien trudny limit wielkości wyzwalaczy. Każda pomoc doceniana.
[Edytuj] Tylko myśl, czy można w jakiś sposób odwołać się do słów kluczowych UPDATING / INSERTING w DECODE ()?
Na przykład, jeśli mógłbym zrobić DECODE (SOMETHINGVAR, UPDATING,: NEW.column, DELETING,: OLD.column), to mógłbym ustawić wartość każdej kolumny w vRow za pomocą pojedynczej instrukcji.
Wydaje mi się, że lepiej byłoby najpierw usunąć USUŃ i użyć domyślnych dla pozostałych dwóch.
czy to możliwe?