Fuente: Oracle logos | Autor: Propiedad de Oracle Company |
Primero creamos las tablas necesarias para la realización del ejercicio:
CREATE TABLE empleados ( dni NUMBER(8), VARCHAR2(15), nom_jefe VARCHAR2(20), PRIMARY KEY (dni) ); CREATE TABLE empleados_baja ( dni NUMBER(8) PRIMARY KEY, nomemp VARCHAR2(15), nom_jefe VARCHAR2(20), fecha date );
1. Crear un trigger que inserte una fila en la tabla empleados_baja cuando se borre una fila en la tabla empleados. Los datos a insertar son los correspondientes al empleado que se da de baja. En la columna fecha se grabará la variable del sistema SYSDATE que almacena la fecha actual. El trigger sería:
create or replace TRIGGER oracleTrigger1 AFTER DELETE ON EMPLEADOS REFERENCING OLD AS empleadoEliminado FOR EACH ROW BEGIN INSERT INTO EMPLEADOS_BAJA VALUES(:empleadoEliminado.DNI, :empleadoEliminado.NOMEMP, :empleadoEliminado.NOM_JEFE, SYSDATE); END oracleTrigger1;
Ahora vamos a probarlo primero insertando una tupla y después borrándola:
INSERT INTO EMPLEADOS (DNI,NOMEMP,NOM_JEFE) VALUES (44444444,'Juanito','Pepe'); DELETE FROM empleados WHERE NOMEMP='Juanito';
¡Y el trigger funciona!
2. Crear un procedimiento que elimine de la tabla empleados, el empleado cuyo nombre se le pasa como parámetro.
create or replace PROCEDURE eliminarEmpleado (nombre IN VARCHAR2) IS -- No hace falta declarar variables. BEGIN -- Eliminamos el empleado. DELETE FROM EMPLEADOS WHERE nomemp=nombre; END eliminarEmpleado;
Ahora volvemos a insertar un nuevo usuario para eliminarlo a través del procedimiento almacenado:
INSERT INTO EMPLEADOS (DNI,NOMEMP,NOM_JEFE) VALUES (33333333,'Marta','Pepe'); EXEC eliminarempleado('Marta');
3. Crear una tarea que inserte según la hora actual en 2 minutos los siguientes datos:
DNI 12345678
Nomemp: Pedro
Nom_jefe: Jose
Además, la tarea debe ejecutarse mensualmente.
BEGIN DBMS_SCHEDULER.CREATE_JOB ( job_name => 'insert2min', job_type => 'PLSQL_BLOCK', job_action => 'BEGIN INSERT INTO EMPLEADOS (DNI,NOMEMP,NOM_JEFE) VALUES (12345678,''Pedro'',''Jose''); END;', start_date => '2/11/2011 17:12:00', repeat_interval => 'FREQ=MONTHLY', enabled => TRUE, comments => 'Ejercicio 3 seminario BD activas'); END;
La habilitamos:
exect dbms_scheduler.enable('insert2min');
Podemos forzar la ejecución de la tarea programada mediante la sentencia:
exec dbms_scheduler.run_job('insert2min', TRUE);
Finalmente eliminamos el trabajo para que no se esté ejecutando una vez al mes en el servidor:
exec dbms_scheduler.drop_job('insert2min');