113 - Disparador condiciones (when) |
Una librería almacena los datos de sus libros en una tabla denominada "libros" y en otra denominada "ofertas", almacena los códigos y precios de los libros cuyo precio es inferior a $50.
1- Elimine las tablas:
drop table libros; drop table ofertas;
2- Cree las tablas con las siguientes estructuras:
create table libros( codigo number(6), titulo varchar2(40), autor varchar2(30), editorial varchar(20), precio number(6,2) ); create table ofertas( codigo number(6), titulo varchar2(40) );
3- Ingrese algunos registros en "libros":
insert into libros values(100,'Uno','Richard Bach','Planeta',25); insert into libros values(103,'El aleph','Borges','Emece',28); insert into libros values(105,'Matematica estas ahi','Paenza','Nuevo siglo',12); insert into libros values(120,'Aprenda PHP','Molina Mario','Nuevo siglo',55); insert into libros values(145,'Alicia en el pais de las maravillas','Carroll','Planeta',35);
4- Cree un trigger a nivel de fila que se dispara "antes" que se ejecute un "insert" sobre "libros". Se activa solamente si el precio que se ingresa es inferior a $30, en caso de serlo, se ingresa en "ofertas" el código y precio del libro
5- Ingrese un libro en "libros" cuyo precio sea inferior a $30
6- Verifique que el trigger se disparó consultando "ofertas"
7- Ingrese un libro en "libros" cuyo precio supere los $30
8- Verifique que el trigger no se disparó consultando "ofertas"
9- Cree un trigger a nivel de fila que se dispare al borrar un libro de "libros", únicamente si el precio del libro que se elimina es inferior a $30, es decir, si existe en "ofertas"
10- Elimine un registro de "libros" cuyo precio sea inferior a $30
11- Verifique que el trigger se disparó consultando "ofertas" y "libros"
12- Elimine un registro de "libros" cuyo precio supere los $30
13- Verifique que el trigger no se disparó consultando "ofertas" y que si se ha eliminado el registro en "libros"
Ver solución
drop table libros;
drop table ofertas;
create table libros(
codigo number(6),
titulo varchar2(40),
autor varchar2(30),
editorial varchar(20),
precio number(6,2)
);
create table ofertas(
codigo number(6),
titulo varchar2(40)
);
insert into libros values(100,'Uno','Richard Bach','Planeta',25);
insert into libros values(103,'El aleph','Borges','Emece',28);
insert into libros values(105,'Matematica estas ahi','Paenza','Nuevo siglo',12);
insert into libros values(120,'Aprenda PHP','Molina Mario','Nuevo siglo',55);
insert into libros values(145,'Alicia en el pais de las maravillas','Carroll','Planeta',35);
create or replace trigger tr_ingresar_libros_ofertas
before insert
on libros
for each row when(new.precio<30)
begin
insert into ofertas values(:new.codigo,:new.titulo);
end tr_ingresar_libros_ofertas;
/
insert into libros values(150,'El experto en laberintos','Gaskin','Planeta',28);
select *from ofertas;
insert into libros values(155,'El gato con botas',null,'Planeta',38);
select *from ofertas;
create or replace trigger tr_borrar_libros_ofertas
before delete
on libros
for each row when(old.precio<30)
begin
delete from ofertas where codigo=:old.codigo;
end tr_borrar_libros_ofertas;
/
delete from libros where codigo=150;
select *from ofertas;
select *from libros;
delete from libros where codigo=155;
select *from ofertas;
select *from libros;
Una empresa almacena los datos de sus empleados en una tabla denominada "empleados".
1- Elimine la tabla:
drop table empleados;
2- Cree la tabla con la siguiente estructura:
create table empleados( documento char(8), apellido varchar2(20), nombre varchar2(20), seccion varchar2(30), sueldo number(8,2) );
3- Ingrese algunos registros:
insert into empleados values('22333444','ACOSTA','Ana','Secretaria',500);
insert into empleados values('22555666','CASEROS','Carlos','Contaduria',900);
insert into empleados values('22777888','DOMINGUEZ','Daniel','Secretaria',560);
insert into empleados values('22999000','FUENTES','Federico','Sistemas',680);
insert into empleados values('23444555','GOMEZ','Gabriela','Sistemas',1200);
insert into empleados values('23666777','JUAREZ','Juan','Contaduria',1000);
4- La empresa necesita controlar cuando se le aumenta el sueldo a los empleados, guardando en una tabla denominada "control", el nombre del usuario, la fecha, el documento de quien se ha modificado el sueldo, el antiguo sueldo y el nuevo sueldo. Para ello cree la tabla control (antes elimínela por si existe):
drop table control; create table control( usuario varchar2(30), fecha date, documento char(8), antiguosueldo number(8,2), nuevosueldo number(8,2) );
5- Cree un disparador que almacene el nombre del usuario, la fecha, documento, el antiguo y el nuevo sueldo en "control" cada vez que se actualice un sueldo de la tabla "empleados" a un valor mayor. Si el sueldo se disminuye, el trigger no debe activarse. Si se modifica otro campo diferente de "sueldo", no debe activarse.
6- Actualice el sueldo de todos los empleados de la sección "Sistemas" a "1000"
7- Consulte la tabla "control" para ver cuántas veces se ha disparado el trigger
Se ha disparado una sola vez; se actualizaron 2 registros, pero en solo uno de ellos se aumentó el sueldo.
8- Al empleado con documento "22333444" se lo ha cambiado a la sección "contaduria". Realice el cambio en la tabla "empleados"
9- Verifique que el trigger no se ha activado porque no se ha modificado el campo "sueldo". Consulte "control"
10- Cree un disparador a nivel de fila que se dispare cada vez que se ingrese un nuevo empleado y coloque en mayúsculas el apellido ingresado. Además, si no se ingresa sueldo, debe ingresar '0'
11- Ingrese un nuevo empleado empleando minúsculas en el apellido
12- Verifique que el trigger "tr_ingresar_empleados" se disparó
13- Ingrese dos nuevos empleados, uno sin sueldo y otro con sueldo "null"
14- Verifique que el trigger "tr_ingresar_empleados" se ha disparado
Los dos registros deben tener el apellido en mayúsculas y deben tener el valor '0' en sueldo.
15- Cree un disparador a nivel de fila que se dispare cada vez que se ingresa un nuevo empleado y coloque "null" en "sueldo" si el sueldo ingresado supera los $1000 o es inferior a $500
16- Ingrese un nuevo empleado con un sueldo que dispare el trigger creado anteriormente
17- Verifique que el trigger "tr_ingresar_empleados" se disparó
drop table empleados;
create table empleados(
documento char(8),
apellido varchar2(20),
nombre varchar2(20),
seccion varchar2(30),
sueldo number(8,2)
);
insert into empleados values('22333444','ACOSTA','Ana','Secretaria',500);
insert into empleados values('22555666','CASEROS','Carlos','Contaduria',900);
insert into empleados values('22777888','DOMINGUEZ','Daniel','Secretaria',560);
insert into empleados values('22999000','FUENTES','Federico','Sistemas',680);
insert into empleados values('23444555','GOMEZ','Gabriela','Sistemas',1200);
insert into empleados values('23666777','JUAREZ','Juan','Contaduria',1000);
drop table control;
create table control(
usuario varchar2(30),
fecha date,
documento char(8),
antiguosueldo number(8,2),
nuevosueldo number(8,2)
);
/
create or replace trigger tr_aumentar_sueldo_empleados
before update of sueldo
on empleados
for each row when(new.sueldo>old.sueldo)
begin
insert into control values(user,sysdate,:old.documento,:old.sueldo,:new.sueldo);
end;
/
update empleados set sueldo=1000 where seccion='Sistemas';
select *from control;
update empleados set seccion='Contaduria' where documento='22333444';
select *from control;
create or replace trigger tr_ingresar_empleados
before insert
on empleados
for each row
begin
:new.apellido := upper(:new.apellido);
if (:new.sueldo is null) then
:new.sueldo := 0;
end if;
end;
/
insert into empleados values('25666777','Lopez','Luisa','Secretaria',650);
select *from empleados where documento='25666777';
insert into empleados (documento,apellido,nombre, seccion) values('26777888','Morales','Marta','Secretaria');
insert into empleados values('26999000','Perez','Patricia','Contaduria',null);
select *from empleados;
create or replace trigger tr_ingresar_empleados
before insert
on empleados
for each row when (new.sueldo>1000 or new.sueldo<500)
begin
:new.sueldo := null;
end tr_ingresar_empleados;
/
select *from empleados where documento='31313131';