You are on page 1of 7

create table articulo (nArtitulo number(10), Descripcion varchar2(100), Precio n umber(6,2), IVA number(3,2), constraint pk_pk1 primary key

(nArticlo)); create table empleado( nEmpleado number(10), Nombre varchar2(100), Oficio varcha r2(50), Salario number(7,2), Departamento varchar2(100), constraint pk_pk2 prima ry key (nEmpleado),constraint fk_fk1 foreign key (Departamento) references depar tamento (NombreD)); create table departamento (nDepartamento number(10), NombreD varchar2(100), Loca lidad varchar2(50), constraint pk_pk3 primary key (nDepartamento); create table clientes (NombreCliente varchar2(100), Direccion varchar2(100), nFa cturas number(8), TotalFactura number(8,2), moneda varchar2(20), constraint pk_p k4 primary key (NombreCliente)); 1.- Construye un programa PL/SQL para cada tabla para que permita insertar datos en las tablas Artculos, Empleados, Departamento y Clientes. Inserta 5 datos en c ada tabla. declare procedure tabla1 (nArticulo number(10),Descripcion varchar2(100), Precio number( 6,2), IVA number(3,2)) is begin insert into articulo values (nArticulo, Descripcion, Precio, IVA); end tabla1; procedure tabla2 (nEmpleado number(10),nombre varchar2(100), oficio varchar2(50) , salario number(7,2), departamento varchar2(100)) is begin insert into empleado values (nEmpleado, nombre, oficio, salario,departamento); end tabla2; procedure tabla3 (nDepartamento number(10),nombreD varchar2(100), Localidad varc har2(50)) is begin insert into departamento values (NDepartamento, nombreD,localidad); end tabla3; procedure tabla4 (NombreCliente varchar2(100),Direccion varchar2(100), nfacturas number(8), totalfactura number(8,2),moneda varchar2(20)) is begin insert into cliente values (Nombrecliente, Direccion, nFacturas, totalfactura,mo neda); end tabla4; begin tabla1(0001,'placas base',150,0.18); tabla2(0002,'Carlos Martinez','tecnico',12000.22,'informatica'); tabla3(0003,'informatica','san clemente'); tabla4('sergio garcia','c/ san juan, 33',2,500.24,'euro'); end; 2.- Incrementa el precio del artculo A13 (tabla ARTICULOS) en funcin de su IVA. Si el IVA que se le aplica es de un 12% incrementar el precio un 5%, y si el IVA e s un 6% incrementarlo en un 2,5%. declare v_iva articulos.iva%type; v_precio articulos.precio%type; begin select iva into v_iva,precio into v_precio from articulos where descripcion = 'A 13'; if v_iva = 0.12 then v_precio:=v_precio*1.05;

elsif v_iva = 0.06 then v_precio:=v_precio*1.025; end if; update table articulos set precio=v_precio where descripcion='a13'; commit; end; 3.- Modificar el precio de todos los artculos (tabla ARTICULOS) en funcin del IVA que se le aplica. Si su IVA es del 12% aplicarle al precio una subida del 5% y s i su IVA es del 6% aplicarle una subida del 2,5%. declare v_precio articulos.precio%type; cursor c2 is select * from articulos for update; registro c2%rowtype; begin open c2; loop fetch c2 into registro; exit when c2%notfound; if registro.iva = 0.12 then v_precio:=registro.precio*1.05; elsif registro.iva = 0.06 then v_precio:=registro.precio*1.025; end if; update table articulos set precio=v_precio where current of c2; end loop; commit; close c2; end; 4.- Incrementa el salario en 100 . de todos los empleados cuyo oficio sea EMPLEADO

declare v_salario empleado.salario%type; v-oficio empleado.oficio%type; cursor c3 is select * from empleado where oficio = 'empleado' for update; reg2 c3%rowtype; begin open c3; loop fetch c3 into reg2; exit when c3%notfound; v_salario:=reg2.salario+100; update table empleado set salario=v_salario where current of c3; end loop; commit; close c3; end; 5.- Modifica el ejercicio anterior para que el cursor use parmetros. Un parmetro n os permitir elegir el oficio de los empleados que queremos incrementar el salario y un segundo parmetro para indicar la cantidad a incrementar. declare var_salario empleado.salario%type; cursor c3 (v_oficio empleado.oficio%type, incremento number(3)) is select * from empleado where oficio = v_oficio for update;

reg2 c3%rowtype; begin open c3('empleado',100); loop fetch c3 into reg2; exit when c3%notfound; var_salario:=reg2.salario+incremento; update table empleado set salario=var_salario where current of c3; end loop; commit; close c3; end; 6.- Escribe un bloque que muestre todos los clientes y la moneda que maneja. El resultado debe aparecer en pantalla con el siguiente formato: Cliente: <Nombre Cliente> - Moneda: <Nombre Moneda> declare cursor c4 is select * from cliente; reg4 c4%rowtype; begin open c4; loop fetch c4 into reg4; dbms_output.put_line('Cliente'||reg4.nombre||'Moneda'||reg4.moneda); end loop; close c4; end; 7.- Crea un bloque PL/SQL que actualice la direccin de un cliente. Para ello, el bloque pedir el cdigo del cliente y su nueva direccin. Tambin debe controlar mediant e excepciones la existencia o no del cliente. Trabajando con Registros o Tablas. declare function func1 (nombrec cliente.nombre%type, ndireccion cliente.Direccion%type) return number is var number(1); cursor c8 is select * from cliente where nombre=nombrec for update; reg6 c8%rowtype; var_resul number(1); begin open c8; loop fetch c8 into reg6; update table empleado set reg6.Direccion=ndireccion where current of c8; exit when c8%notfound; end loop; commit; close c8; var:=0; return var; exception when no_data_found then var:=1; return var; end func1; begin var_resul:=func1('sergio garcia','c/garcia-rodriguez'); if var_resul=1 then dbms_output.put_line('no se ha podido insertar el dato');

else dbms_output.put_line('se ha podido actualizar el dato'); end if; end; 8.- Escribe un procedimiento que reciba el nombre de un cliente y visualice su t otalfactura. declare procedure proc1 (ncliente cliente.nombre%type) is v_total cliente.totalfactura%type; begin select totalfactura into v_total from cliente where nombre=ncliente; dbms_output.put_line(v_total); end proc1; begin proc1('sergio garcia'); end; 8.- Reescribe el cdigo anterior para convertirlo en funcin y que retornen el valor que mostraba. declare function fun1 (ncliente cliente.nombre%type) return cliente.totalfactura%type is v_total cliente.totalfactura%type; begin select totalfactura into v_total from cliente where nombre=ncliente; return v_total; end proc1; var_total cliente.totalfactura%type; begin var_total:=fun1('sergio garcia'); dbms_output.put_line(var_total); end; 10.- Crea un procedimiento que reciba un nmero de empleado y una cadena correspon diente a su nuevo oficio. El procedimiento deber localizar el empleado, modificar el oficio y visualizar los cambios realizados. declare procedure cambiaoficio (numempleado empleado.nEmpleado%type, noficio empleado.of icio%type) is var_oficio empleado.oficio%type; begin update table empleado set oficio=noficio where nEmpleado=numEmpleado; commit; select oficio into var_oficio from empleado where nEmpleado=numempleado; dbms_output.put_line('El nuevo oficio del empleado es: '||var_oficio); end cambiaoficio; begin cambiaoficio(0002,'Administrativo'); end; 11.- Escribe un paquete para gestionar los departamentos. Se llamar gest_depart e incluir, al menos, los siguientes subprogramas: Insertar_nuevo_depart: inserta un departamento nuevo. Recibe el nombre y la loca lidad del nuevo departamento. Crear el nuevo departamento comprobando que el nomb re no se duplique y le asignar como nmero de departamento la decena siguiente al lt imo nmero de departamento utilizado. create or replace package gest_depart as procedure Insertar_nuevo_departamento (nNombre departamento.NombreD%type, nlocal

idad departamento.Localidad%type ) is create or replace package body gest_despart as procedure Insertar_nuevo_departamento (nNombre departamento.NombreD%type, nlocal idad departamento.Localidad%type ) is type var_tipe is table of departamento.nDepartamento%type index by binary intege r; type tipo2 is table of departamento.NombreD%type index by binary integer; nomvector tipo2; var_num var_tipe; nombre tipo2; nombredep departamento.NombreD%type; cursor c4 is select nombreD from departamento; var_nDepartamento departamento.nDepartamento%type; cursor c3 is select nDepartamento from departamento; var_contador number; last_dep departamento.nDepartamento%type; duplicado exception; begin var_contador:=0; open c3; loop fetch c3 into var_nDepartamento; exit when c3%notfound; var_num(var_contador):=var_nDepartamento; var_contador=var_contador+1; end loop; close c3; last_dep=var_num.LAST; var_contador:=0; open c4; loop; fetch c4 into nombredep; exit when c4%notfound; nomvector(var_contador)=nombredep; var_contador=var_contador+1; end loop; commit; close c4; var_contador:=0; loop if nomvector(var_contador)=nNombre then raise duplicado; end if; exit when nomvector(var_contador)=nomvector(var_contador).LAST; var_contador=var_contador+1; end loop; insert into departamento values (last_dep,nNombre,nlocalidad); commit; exception when duplicado then dbms_output.put_line('El nombre aparece duplicado'); end Insertar_nuevo_departamento; Borrar_depart: borra un departamento. Recibir dos nmeros de departamento: el prime ro corresponde al departamento que queremos borrar y el segundo, al departamento al que pasarn los empleados del departamento que se va a eliminar. El procedimie nto se encargar de realizar los cambios oportunos en los nmeros de departamento de los empleados correspondientes. procedure Borrar_depart (nborrar departamento.nDepartamento%type, numdepart depa rtamento.nDepartamento%type) is

begin update table empleado set nDepartamento=numdepart where nDepartamento=nborrar; delete from departamento where nDepartamento=nborrar; commit; end Borrar_depart; Modificar_loc_depart: modifica la localidad del departamento. Recibir el nmero del departamento que se modifica y la nueva localidad. procedure Modificar_loc_depart (ndepart departamento.nDepartamento%type, newloc departamento.localidad%type) is begin update table departamento set localidad=newloc where nDepartamento=ndepart; commit; end Modificar_loc_depart; Visualizar_datos_depart: visualizar los datos de un departamento cuyo nmero se pas ar en la llamada. procedure Visualizar_datos_depart (numdepart departamento.nDepartamento%type) is var_departamento departamento.nDepartamento%type; type nuevo_tipo is record (numerod departamento.nDepartamento%type, nomd departa mento.NombreD%type, city departamento.localidad%type); variable nuevo_tipo; begin select * into variable from departamento where nDepartamento=numdepart; dbms_output.put_line(variable.numerod||variable.nomd||variable.city); end Visualizar_datos_depart; Buscar_depart_por_nombre: Recibe el nombre de un departamento y devuelve el nmero del mismo. 12.- Crea una tabla llamada auditarDepartamento, con dos campos: Numero_id, nomb re_usuario y Fecha. Escribe un disparador de base de datos que permita auditar l as operaciones de insercin o borrado de datos que se realicen en la tabla DEPARTA MENTOS segn las siguientes especificaciones: Cuando se produzca cualquier manipulacin, se insertar una fila en dicha tabla que contendr: identificador, nombre de usuario y fecha. Asigna una Excepcin personalizada para el momento en que se introduzca los datos a esta nueva tabla. declare begin create sequence sec start with 1 increment by 1; create table auditarDepartamento (Numero_id number(4), nombre_usuario varchar2(2 00),fecha date); create trigger trig1 after insert or delete from departamentos declare var_exception exception contador number(1); var_con auditarDepartamento.user%type; begin insert into auditarDepartamento values (sec.NEXTVAL,user,sysdate); select count(user) into var_con from auditarDepartamento; if var_con=sec.NEXTVAL then raise var_exception; end if; commit; exception when var_exception then dbms_output.put_line('Registro guardado'); end; end trig1;

end;