En un activador de Oracle, ¿puedo asignar nuevos y antiguos a una variable de tipo fila?
Se me ha asignado la tarea de implementar varios scripts de activación, y tengo ejemplos de compañeros de trabajo para trabajar. En esos, usan condicionales de pl-sql para actualizar / insertar / eliminar, junto con instrucciones de inserción gigantescas (en otra tabla). Estas declaraciones de inserción no varían más que si los valores tienen el prefijo nuevo o antiguo. Pensé que sería inteligente y trataría de hacer el mío un poco más compacto, usando lo siguiente:
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;
Recibo lo siguiente del sistema de compilación:
10/13 PLS-00049: bad bind variable 'NEW'
13/13 PLS-00049: bad bind variable 'NEW'
16/13 PLS-00049: bad bind variable 'OLD'
Obviamente no le gusta esto. ¿Hay algo que logrará lo que estoy intentando? Son: new y: old simplemente no son verdaderos tipos de fila? Parece tonto repetir lo que es esencialmente el mismo código 3 veces, y sin embargo no puedo encontrar una mejor manera. Demonios, creo que leí que también hay un límite duro en el tamaño de los disparadores. Cualquier ayuda apreciada.
[Editar] Solo un pensamiento, ¿es posible hacer referencia a las palabras clave ACTUALIZAR / INSERTAR de alguna manera dentro de un DECODE ()?
Por ejemplo, si pudiera hacer un DECODE (SOMETHINGVAR, UPDATING,: NEW.column, DELETING,: OLD.column), podría establecer el valor de cada columna en vRow con una sola declaración.
Supongo que sería mejor marcar BORRAR primero y usar el valor predeterminado para los otros dos.
es posible?