que tienen un disparador AFTER INSERT OR UPDATE OR DELETE
que estoy escribiendo para almacenar cada revisión registro que se produce en una determinada mesa, copiando los INSERT
y UPDATE
:NEW
valores en una tabla de espejo, y para DELETE
:OLD
los valores.¿Puedo copiar: Pseudoregistros VIEJO y NUEVO en/a un procedimiento almacenado de Oracle?
Podría desordenar considerablemente mi código pasando condicionalmente el registro :NEW
o :OLD
a un procedimiento que luego insertaría en mi tabla de historial. Desafortunadamente, parece que no puedo encontrar la manera de pasar el registro completo :OLD
o :NEW
.
¿Me falta algo o no hay manera de evitar enumerar cada columna :NEW
y :OLD
cuando invoco mi procedimiento de inserción?
Quiero hacer lo siguiente:
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;
Pero estoy atascado hacer esto:
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;
bien, por lo que no se ve como una gran diferencia, pero esto es sólo un ejemplo con 3 columnas en lugar de docenas.