![]() |
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');