Si disponemos de un disparador (trigger) de tipo before insert para poder acceder a las variables :new y :old, no disponemos de la posibilidad de acceder a la referencia del objeto en la base de datos ya que este no ha sido todavía insertado.
Para salvar esta posibilidad podemos dar un “rodeo” definiendo el disparador de tipo instead of. De esta forma el disparador sustituye a la orden que provoca su disparo, disponemos de las variables :new que nos proporcionan la información que se está insertando y por tanto podemos reproducir la inserción añadiendo la cláusula RETURNING para que nos retorne la referencia del objeto que estamos insertando sin necesidad de consultar la tabla que aloja el objeto.
El problema surge debido a que tenemos la restricción de que sólo se pueden definir disparadores INSTEAD OF sobre vistas y por ello debemos crear una vista sobre la tabla
CREATE VIEW ALUMNOS_VIEW AS SELECT * FROM ALUMNOS_TAB
y sólo dar privilegios de acceso a la vista y no a la tabla base, por lo que las órdenes sólo se realizarán sobre la vista que hará saltar al disparado que realiza la inserción sobre la tabla base y el resto de acciones que sean necesarias.
CREATE TRIGGER INS
INSTEAD OF INSERT ON ALUMNOS_VIEW
FOR EACH ROW
DECLARE
v_AlumnoRef REF Alumnos_objtab;
BEGIN
……………………………………..
INSERT INTO alumnos_tab al VALUES (:new………)
RETURNING REF(al) INTO v_AlumnoRef;
…………………………………….
END;