Sei sulla pagina 1di 16

EJERCICIOS DE GESTION DE DASE DE DATOS

INDICE

Contenido Págs.

Índice……………….………………………………………….……1

Desarrollo EJERCICIOS PL/SQL

1. Variables y Entrada y Salida de Datos…………………..…..2

2. Variables, Bloques y Estructura de Control…...………..…...4

3. Cursores…………………………………………………………7

4. Procedimientos….…………………………………………..…13

Comentario.…..………………………………….………………. 15

Cesar Crespo 1 UNAQ


EJERCICIOS DE GESTION DE DASE DE DATOS

1. VARIABLES Y ENTRADA Y SALIDA DE DATOS

1.- Construya un bloque PL/SQL que pida al usuario su nombre por teclado y que posteriormente lo visualice de la
siguiente forma “El nombre introducido es: NOMBRE”.

DECLARE
V_NOMBRE VARCHAR2(50);
BEGIN
V_NOMBRE:='&a';
DBMS_OUTPUT.PUT_LINE('EL NOMBRE INTRODUCIDO ES: '|| V_NOMBRE);
END;

tabla para almacenar las personas de la BD

CREATE TABLE Personas (dni VARCHAR2 (9) PRIMARY KEY,


nombre VARCHAR2(15),
edad NUMBER);

Inserte los siguientes datos de prueba en la tabla PERSONAS:


Dni nombre apellidos edad
11 Juan Álvarez 18
22 José Jiménez 22
33 Maria Pérez 35
44 Elena Martínez 20
select * from personas;

insert into personas (dni,nombre,edad) values('11','Juan Álvarez',18);


insert into personas(dni,nombre,edad) values('22','José Jiménez',22);
insert into personas(dni,nombre,edad) values('33','Maria Pérez',35);
insert into personas(dni,nombre,edad) values('44','Elena Martínez',20);

2.- Construya un bloque PL/SQL, que pida por teclado el dni de la persona y que posteriormente se muestre el nombre
y la edad de la persona correspondiente.

DECLARE
V_DNI PERSONAS.DNI%TYPE;
V_NOMBRE PERSONAS.NOMBRE%TYPE;
V_EDAD PERSONAS.EDAD%TYPE;
BEGIN
V_DNI:=&a;
SELECT NOMBRE,EDAD
INTO V_NOMBRE,V_EDAD

Cesar Crespo 2 UNAQ


EJERCICIOS DE GESTION DE DASE DE DATOS

FROM PERSONAS
WHERE DNI=V_DNI;
DBMS_OUTPUT.PUT_LINE('DNI: '|| V_DNI);
DBMS_OUTPUT.PUT_LINE('NOMBRE: '|| V_NOMBRE);
DBMS_OUTPUT.PUT_LINE('EDAD: '|| V_EDAD);
EXCEPTION
WHEN no_data_found then
DBMS_OUTPUT.PUT_LINE('NO EXISTEN REGISTROS');
WHEN TOO_MANY_ROWS then
DBMS_OUTPUT.PUT_LINE('LA CONSULTA RETORNA MAS DE UN REGISTRO');
WHEN OTHERS then
DBMS_OUTPUT.PUT_LINE('SE DIO EL ERROR :'||SQLERRM);
END;

3.- Construya un bloque PL/SQL con la misma funcionalidad pero utilizando un registro para almacenar el nombre y la
edad de la persona elegida.

DECLARE
v_persona Personas%rowtype;
v_cont varchar2(10);
BEGIN
DBMS_OUTPUT.PUT_LINE('Ingrese codigo DNI : ');
v_cont:='&b';
SELECT NOMBRE,EDAD
INTO v_persona.nombre,v_persona.edad
FROM PERSONAS
WHERE DNI=v_cont;

DBMS_OUTPUT.PUT_LINE('NOMBRE: '||v_persona.nombre);
DBMS_OUTPUT.PUT_LINE('EDAD: '||v_persona.edad);
END;

Cesar Crespo 3 UNAQ


EJERCICIOS DE GESTION DE DASE DE DATOS

2. VARIABLES, BLOQUES Y ESTRUCTURAS DE CONTROL

1. Cree un bloque en el que se pida el nombre y la edad del usuario, se guarde en variables y posteriormente se
muestre por pantalla su contenido.

DECLARE
v_nombre varchar2(100);
v_edad number;
BEGIN
dbms_output.put_line('Ingrese Nombre: '); v_nombre:='&Nombre';
dbms_output.put_line('Ingrese Edad: '); v_edad:='&Edad';
dbms_output.put_line('');
dbms_output.put_line('DATOS ENCOTRADOS: ');
dbms_output.put_line('NOMBRE : '||v_nombre);
dbms_output.put_line('EDAD : '||v_edad);
END;

2. Cree una tabla Tabla_Numeros con un atributo valor de tipo INTEGER. Cree un bloque que inserte números del 1 al
50. Compruebe los datos insertados en la tabla Tabla_Numeros.

CREATE TABLE Tabla_Numeros (valor INTEGER);


declare
v_cont number(4);
begin
v_cont:=1;
while v_cont <= 50 loop
Insert into Tabla_Numeros(Valor)
Values(v_cont);
v_cont := v_cont +1;
end loop;
end;

Cesar Crespo 4 UNAQ


EJERCICIOS DE GESTION DE DASE DE DATOS

3. Borre el contenido de la tabla Tabla_Numeros utilizando la sentencia DELETE. Cree un bloque que inserte 8
elementos en la tabla con valores del 1 al 10, excepto el 4 y el 5. Compruebe, de nuevo, los datos que contiene la
tabla Tabla_Numeros.

BORRAR CONTENIDO

DECLARE
V_valor NUMBER:=1;
BEGIN
DELETE FROM TABLA_NUMEROS
WHERE VALOR>=V_valor;
END;

INSERTO ELEMENTOS

DECLARE
BEGIN
For X in 1..10 Loop
If X not in(4,5)then
Insert into Tabla_Numeros(Valor)
Values(X);

End if;
End Loop;
END;

4. Cree una tabla Tabla_Articulos con los siguientes atributos: código, nombre, precio e IVA. Introduzca datos de
prueba utilizando la sentencia INSERT.

CREATE TABLE Tabla_Articulos ( codigo VARCHAR(5) PRIMARY KEY,


nombre VARCHAR(20),
precio NUMBER(9,2),
IVA NUMBER(9,2));
insert into Tabla_Articulos values('A001','TV 21',20,1);
insert into Tabla_Articulos values('A002','RADIO',12,1);
insert into Tabla_Articulos values('A003','COCINA',35,2);
insert into Tabla_Articulos values('A004','REFRIGERADOR',2000,5);
insert into Tabla_Articulos values('A005','SARTEN',5,0);

a) Construya un bloque que compruebe si el precio del artículo cuyo código es ‘A001’ es mayor que 10 euros y en
caso afirmativo, imprima el nombre y el precio del artículo por pantalla.
DECLARE
V_codigo varchar2(10);
v_nombre varchar2(20);
v_precio number;
BEGIN
v_codigo:='&a';
Select nombre,precio
into v_nombre, v_precio
from Tabla_Articulos
where precio > 10 AND CODIGO =UPPER(v_codigo);
dbms_output.put_line('EL ARTICULO ES : '||v_NOMBRE||', Y SU PRECIO ES $: '||v_PRECIO);
END;

b) Construya un bloque que seleccione el artículo de mayor precio que esté almacenado en la tabla, almacene su
valor en una variable y luego imprímalo.
DECLARE
v_nombre varchar2(20);
v_precio number;
BEGIN

Cesar Crespo 5 UNAQ


EJERCICIOS DE GESTION DE DASE DE DATOS

Select nombre,precio
into v_nombre, v_precio
from Tabla_Articulos
where precio = (Select MAX(precio)
From Tabla_Articulos);
dbms_output.put_line('EL PRECIO MAS ALTO : $'||v_precio);
dbms_output.put_line('ARTICULO : '||v_nombre);
END;

c) Construya un bloque que actualice el precio del artículo cuyo código es ‘A005’ según las siguientes indicaciones:
− Si el artículo tiene un precio menor de 1 euro, su precio debe ser aumentado en 25 céntimos.
− Si está comprendido entre 1 euro y 10 euros su precio aumentará un 10 % .Si excede los 10 euros su precio
aumentará en un 20 %.
− Si el precio es NULL, el aumento es 0.
DECLARE
v_codigo varchar2(10);
v_nombre varchar2(20);
v_precio number;
mi_error exception;
BEGIN
v_codigo :='&a';
Select nombre,precio
into v_nombre, v_precio
from Tabla_Articulos
where codigo =upper( v_codigo);
dbms_output.put_line('ARTICULO: '||v_nombre);
dbms_output.put_line('PRECIO: '||v_precio);
If v_precio<1 then
v_precio:=v_precio+0.25;
Else if v_precio<10 then
v_precio:=v_precio*1.10;
Else if v_precio>10 then
v_precio:=v_precio*1.20;
End if;
End if;
End if;
dbms_output.put_line('EL NUEVO PRECIO: '||v_precio);
Update Tabla_Articulos
set precio=v_precio
where codigo='A005';
Commit;
exception
when mi_error then
dbms_output.put_line('Codigo no existe');
END;

d) Construya un bloque similar al del apartado 3c donde el usuario introduzca por pantalla el código del
artículo que desee modificar su precio.
DECLARE
v_nombre varchar2(20);
v_precio number;
BEGIN
Select nombre,precio
into v_nombre, v_precio
from Tabla_Articulos
where codigo = '&CODIGO';
dbms_output.put_line('ARTICULO : '||v_nombre);
dbms_output.put_line('PRECIO : '||v_precio);
If v_precio<1 then
v_precio:=v_precio+0.25;
Else if v_precio<10 then
v_precio:=v_precio*1.10;

Cesar Crespo 6 UNAQ


EJERCICIOS DE GESTION DE DASE DE DATOS

Else if v_precio>10 then


v_precio:=v_precio*1.20;
End if;
End if; End if;
dbms_output.put_line('Su actual precio es : '||v_precio);
END;

3. CURSORES.
1. Dadas las siguientes tablas:

-- tabla para almacenar todos los alumnos de la BD


CREATE TABLE Alumnos
(numMatricula NUMBER PRIMARY KEY, nombre VARCHAR2(15),
apellidos VARCHAR2(30), titulacion VARCHAR2(15),
precioMatricula NUMBER);

-- tabla para los alumnos de informática


CREATE TABLE AlumnosInf
(IDMatricula NUMBER PRIMARY KEY, nombre_apellidos VARCHAR2(50),
precio NUMBER);

Inserte los siguientes datos de prueba en la tabla ALUMNOS:


insert into ALUMNOS values(1,'Juan','Álvarez','Administrativo',1000);
insert into ALUMNOS values(2,'José','Jiménez','Informatica',1200);
insert into ALUMNOS values(3,'Maria','Pérez','Administrativo',1000);
insert into ALUMNOS values(4,'Elena','Martínez','Informatica',1200);

Construya un cursor que inserte sólo los alumnos de informática en la tabla ALUMNOSINF, teniendo en
cuenta la estructura de esta tabla, así por ejemplo, debe tener en cuenta que el atributo nombre_apellidos
resulta de la concatenación de los atributos nombre y apellidos. Antes de la inserción de cada tupla en la tabla
ALUMNOSINF debe mostrar por pantalla el nombre y el apellido que va a insertar.

DECLARE
CURSOR ALUINF IS SELECT numMatricula, nombre, apellidos, titulacion, precioMatricula
FROM Alumnos;
BEGIN
For X in ALUINF Loop
If X.titulacion='Informatica' then
dbms_output.put_line(X.nombre||' '||X.apellidos||' Dato Insertado');
Insert into AlumnosInf(IDMatricula, nombre_apellidos, precio)
values(X.numMatricula,X.nombre||X.apellidos,X.precioMatricula);
commit;
End if;
End Loop;
END;

2. Dadas las siguientes tablas:

CREATE TABLE Tabla_Departamento


(Num_Depart Number(2) PRIMARY KEY, Nombre_Depart VARCHAR2(15),

Cesar Crespo 7 UNAQ


EJERCICIOS DE GESTION DE DASE DE DATOS

Ubicación VARCHAR2(15), Presupuesto NUMBER(10,2),


Media_Salarios NUMBER(10,2), Total_Salarios NUMBER(10,2));

CREATE TABLE Tabla_Empleado


( Num_Empleado Number(4) PRIMARY KEY, Nombre_Empleado VARCHAR(25),
Categoría VARCHAR(10), -- Gerente, Comercial,
Jefe Number(4),
Fecha_Contratacion DATE, Salario Number(7,2), Comision Number(7,2),
Num_Depart NUMBER(2), FOREIGN KEY (Jefe) REFERENCES Tabla_Empleado,
FOREIGN KEY (Num_Depart) REFERENCES Tabla_Departamento);

insert into TABLA_DEPARTAMENTO values(1,'FINANCIERO','CUENCA',1000,10,00);


insert into TABLA_DEPARTAMENTO values(2,'ADMINISTRATIVO','QUITO',2000,12,00);
insert into TABLA_DEPARTAMENTO values(3,'CONTABLE','CUENCA',500,10,00);
insert into TABLA_DEPARTAMENTO values(4,'SISTEMAS','QUITO',200,12,00);

2.1 Construya un bloque que calcule el presupuesto del departamento para el año próximo. Se almacenará el
mismo en la tabla Tabla_Departamento en la columna Presupuesto. Hay que tener en cuenta las siguientes
subidas de sueldo:
Gerente + 20%
Comercial + 15%
Los demás empleados que no estén en ninguna de las categorías anteriores se les subirá el sueldo un 10%.

DECLARE
CURSOR DEPAR IS SELECT num_depart,nombre_depart, presupuesto, media_salarios,total_salarios
FROM tabla_departamento;

CURSOR EMPLE (P_DEPT Tabla_departamento.num_depart%type)IS


SELECT num_empleado, nombre_empleado, salario,categoría, num_depart
FROM tabla_empleado
WHERE num_depart=P_DEPT;
v_total number:=0;
v_salario number:=0;
BEGIN
FOR X IN DEPAR LOOP
dbms_output.put_line('');
dbms_output.put_line('');
dbms_output.put_line('Departamento: '||X.nombre_depart);
dbms_output.put_line('****************************************');
FOR Y IN EMPLE(X.num_depart) LOOP
If Y.categoría='Gerente'then
v_salario:=Y.salario*1.20;
Else if Y.categoría='FINANCIERO'then
v_salario:=Y.salario*1.15;
Else
v_salario:=Y.salario*1.10;
End if;
End if;
v_total:=v_total+v_salario;
END LOOP;
dbms_output.put_line('Presupuesto: '||v_total);
update Tabla_Departamento set presupuesto=v_total
where num_depart=X.num_depart;
commit;
v_total:=0;
END LOOP;

Cesar Crespo 8 UNAQ


EJERCICIOS DE GESTION DE DASE DE DATOS

END;

2.2 Construya un bloque que actualice el campo Total_Salarios y el campo Media_Salarios de la tabla
Tabla_Departamento, siendo el total la suma del salario de todos los empleados, igualmente con la media.
Para ello:
− Cree un cursor C1, que devuelva todos los departamentos
− Cree un cursor C2, que devuelva el salario y el código de todos los empleados de su departamento.

DECLARE
CURSOR C1 IS SELECT num_depart,nombre_depart
FROM tabla_departamento;
CURSOR C2 (P_DEPT Tabla_departamento.num_depart%type)IS
SELECT num_empleado, salario, categoría, num_depart
FROM tabla_empleado
WHERE num_depart=P_DEPT;
v_SUMA number:=0;
v_cont number:=0;
MI_ERROR EXCEPTION;
BEGIN
FOR X IN C1 LOOP
dbms_output.put_line('DEPARTAMENTO: '||X.nombre_depart);
FOR Y IN C2(X.num_depart) LOOP
v_SUMA:=v_SUMA+Y.salario;
v_cont:=v_cont+1;
END LOOP;
dbms_output.put_line('Total Salarios: '||v_SUMA);
dbms_output.put_line('Media Salarios: '||round((v_SUMA/v_cont),2));
update Tabla_Departamento set total_salarios= v_SUMA
, media_salarios=round((v_SUMA/v_cont),2)
where num_depart=X.num_depart;
commit;
v_SUMA:=0;
v_cont:=0;
END LOOP;
EXCEPTION
WHEN MI_ERROR THEN
dbms_output.put_line('NO SE PIUEDE DIVIDIR PARA CERO');
WHEN OTHERS THEN
dbms_output.put_line('NO SE PIUEDE DIVIDIR PARA CERO');
END;

2.3 Cree una tabla NOTAS con los atributos que estime necesarios
y construya un bloque que inserte en la tabla NOTAS cuatro filas
para cada alumno matriculado, estas filas corresponderán a las tres convocatorias ordinarias y la
última para la convocatoria extraordinaria de junio. Antes de insertar se comprobará que no están
ya creadas. Las filas deberán inicializarse a nulo.

DECLARE
CURSOR C1 IS SELECT nummatricula
FROM Alumnos;
BEGIN

Cesar Crespo 9 UNAQ


EJERCICIOS DE GESTION DE DASE DE DATOS

FOR X IN C1 Loop
FOR Y IN 1..4 LOOP
Insert into Nota (cod_materia,descripcion, nota, nummatricula)
values (null ,'Convocatoria '||Y,NULL,X.nummatricula);
END LOOP;
End Loop;
END;
select * from nota;

2.4 Cree un bloque que almacene en la tabla AUX_ARTICULOS (debe crearse previamente) un
número dado de los artículos con mayor precio de los existentes en la tabla Tabla_Articulos. El
número de artículos a almacenarse debe ser dado por teclado.

DECLARE
CURSOR C1 IS SELECT *
FROM Tabla_Articulos;
v_valores number:=0;
aux_codigo Tabla_Articulos.codigo%type;
aux_nombre Tabla_Articulos.nombre%type;
aux_precio Tabla_Articulos.precio%type;
aux_iva Tabla_Articulos.iva%type;
v_cont number:=0;
BEGIN
Delete Aux_Articulos;
Delete Aux_Articulos1;
v_valores:='&Cuantos' ;
For X in C1 LOOP
Insert into
Aux_Articulos1(codigo,nombre,precio,iva)
values(X.codigo,X.nombre,X.precio,X.iva);
END LOOP;
FOR Y IN 1..v_valores Loop
Select codigo,nombre,precio,iva
into aux_codigo, aux_nombre, aux_precio, aux_iva
from Aux_Articulos1

Cesar Crespo 10 UNAQ


EJERCICIOS DE GESTION DE DASE DE DATOS

where precio= (
select max(precio)
from Aux_Articulos1);
Insert into Aux_Articulos(codigo,nombre,precio,iva)
values(aux_codigo, aux_nombre, aux_precio, aux_iva);
Delete Aux_Articulos1 where codigo=aux_codigo;
commit;
End Loop;
END;

2.5 Escriba un bloque que recupere todos los proveedores por países. El resultado debe
almacenarse en una nueva tabla Tabla_Aux que permita almacenar datos del tipo:
Proveedor: ONCE – País: España
Utilice un cursor para recuperar cada país de la tabla Tabla_Proveedores y pasar dicho país a un
cursor que obtenga el nombre de los proveedores en él. Una vez que se tiene el nombre del
proveedor y su país, debe añadirse a la nueva tabla en el formato especificado. NOTA: En primer
lugar, debe crear las tablas Tabla_Proveedores y Tabla_Aux e insertar en los mismos datos de
prueba.

create table proveedor(cod_prov number(4) primary key,


nombre varchar2(25),
pais varchar2(25));
insert into proveedor(cod_prov,nombre, pais)values(1,'ngk','Brasil' );
insert into proveedor(cod_prov,nombre, pais)values(2,'boch','Alemania' );
insert into proveedor(cod_prov,nombre, pais)values(3,'samsung','China' );
insert into proveedor(cod_prov,nombre, pais)values(4,'sony','Japon' );
insert into proveedor(cod_prov,nombre, pais)values(5,'intel','EEUU' );
insert into proveedor(cod_prov,nombre, pais)values(6,'canon','Japon' );
insert into proveedor(cod_prov,nombre, pais)values(7,'panasonic','Corea' );
select * from proveedor;

DECLARE
CURSOR C1 IS SELECT DISTINCT(PAIS)
FROM proveedor;
CURSOR C2 (P_PAIS proveedor.pais%type) IS
SELECT nombre
FROM proveedor
WHERE pais=P_PAIS;
BEGIN
FOR X IN C1 Loop
dbms_output.put_line('PAIS: '||X.pais);
FOR Y IN C2(X.pais) Loop
dbms_output.put_line(Y.nombre);
Insert into aux_proveedor(nombre,pais)
values(Y.nombre,X.pais);
End Loop;

Cesar Crespo 11 UNAQ


EJERCICIOS DE GESTION DE DASE DE DATOS

End Loop;
END;

Cesar Crespo 12 UNAQ


EJERCICIOS DE GESTION DE DASE DE DATOS

4. PROCEDIMIENTOS Y FUNCIONES ALMACENADOS.

1. Defina un procedimiento almacenado Mensaje que escriba un mensaje por pantalla. Cree
posteriormente un bloque PL/SQL desde el que invoque dicho procedimiento.

CREATE OR REPLACE procedure mensaje (mensaje in varchar2,


men_sal out varchar2)
is
begin
select mensaje into men_sal from dual;
end mensaje;

BLOQUE PL/SQL

declare
v_mensaje varchar2(50);
v_mensaje_out varchar2(50);

begin
v_mensaje:='&a';
mensaje(v_mensaje,v_mensaje_out) ;
dbms_output.put_line('ENVIO Y DEVOLUCION DE MENSAJE :'|| v_mensaje_out);
end;

2. Defina un procedimiento almacenado Mostrar que reciba como parámetro de entrada un cadena
de caracteres y que muestre dicha cadena. Cree posteriormente un bloque PL/SQL desde el que
invoque dicho procedimiento pasándole una cadena que el usuario haya introducido por teclado.

CREATE OR REPLACE PROCEDURE MOSTRAR( cadena VARCHAR2)


AS cad VARCHAR2(50);
CURSOR c_cliente IS
SELECT nombre, cedula FROM cliente
WHERE nombre LIKE cad;
vr_cliente c_cliente%ROWTYPE;

BEGIN
cad :='%'||cadena||'%';
OPEN c_cliente;
FETCH c_cliente INTO vr_cliente;
WHILE (c_cliente%FOUND) LOOP
DBMS_OUTPUT.PUT_LINE(vr_cliente.cedula||' * '||vr_cliente.nombre);
FETCH c_cliente INTO vr_cliente;
END LOOP;
DBMS_OUTPUT.PUT_LINE('cliente: '|| c_cliente%ROWCOUNT);
CLOSE c_cliente;
END mostrar;

Llamado procedimiento

declare
v_mensaje varchar2(50);
begin
v_mensaje:=upper('&a');
mostrar(v_mensaje);
dbms_output.put_line('ENVIO Y DEVOLUCION DE MENSAJE :'|| v_mensaje);
end;

Cesar Crespo 13 UNAQ


EJERCICIOS DE GESTION DE DASE DE DATOS

3. Defina un procedimiento para que inserte en la tabla Departamento (previamente creada) una fila
con los tres valores que se le pasan por parámetro: código, nombre y localidad. Si el departamento
que se le pasa por parámetro ya existe, se debe insertar en la tabla temporal (que también debe
crear previamente). Cree posteriormente un bloque PL/SQL desde el que invoque dicho
procedimiento pasándole los parámetros que desee insertar en la tabla.
CREATE TABLE DEPARTAMENTO
(codigo NUMBER(4) PRIMARY KEY,
nombre VARCHAR2(25) NOT NULL UNIQUE,
ciudad VARCHAR2(25));
desc temp_depar;
insert into departamento(CODIGO,NOMBRE,CIUDAD)values(1,'sistemas','QUITO' );
insert into departamento(CODIGO,NOMBRE,CIUDAD)values(2,'ADMINISTRACION','GUAYAQUIL' );
insert into departamento(CODIGO,NOMBRE,CIUDAD)values(3,'CONTABILIDAD','QUITO' );
insert into departamento(CODIGO,NOMBRE,CIUDAD)values(4,'BODEGA','CUENCA' );
SELECT * FROM DEPARTAMENTO;

CREATE OR REPLACE procedure insertar1 (p_codigo in number,


p_nombre in varchar2,
p_localidad in varchar2,
p_error out varchar2
) is
v_cont number(4):=0;
reg departamento%rowtype;
begin
begin
select * into reg from departamento where codigo = p_codigo;
begin
select count(p_codigo) into v_cont from departamento group by p_codigo having p_codigo = reg.codigo;
exception
when OTHERS then
dbms_output.put_line('NO'||reg.codigo);
end;
if p_codigo = reg.codigo then
insert into temp_depar
values (p_codigo, p_nombre,p_localidad);
else
insert into departamento
values (p_codigo, p_nombre,p_localidad);
end if;
exception
when OTHERS then
dbms_output.put_line('CODIGO ERRONEO');
end;
end insertar1;
LLAMADO AL PROCEDIMIENTO

declare
v_codigo departamento.codigo%type;
v_nombre departamento.nombre%type;
v_ciudad departamento.ciudad%type;
v_error varchar2(250);
begin
v_codigo := &a;
v_nombre := '&b';
v_ciudad := '&c';
insertar1(v_codigo,v_nombre,v_ciudad,v_error);
end;

Cesar Crespo 14 UNAQ


EJERCICIOS DE GESTION DE DASE DE DATOS

4. Defina una función a la que le pasamos una convocatoria y nos devuelve el nombre de la asignatura con
más suspensos. Para ello debe crear previamente una tabla Asignatura con los atributos: código y nombre y
otra tabla Notas, que contiene el código de la asignatura, la convocatoria, el alumno y su nota. Cree
posteriormente un bloque PL/SQL que visualice el nombre de la asignatura con más suspensos.

5. Defina una función que devuelva el factorial de un número que se le pasa a la función por parámetro. Cree
posteriormente un bloque PL/SQL que visualice el resultado del factorial del número introducido por teclado.

create or replace function factorial (p_numero in number) return number is


begin
if p_numero <=1 then
return 1;
else
return p_numero*factorial(p_numero-1);
end if;
end factorial;
llamada a la funcion
declare
v_numero number(10);
begin
v_numero :=&a;
select factorial( v_numero) into v_numero from dual;
dbms_output.put_line('factoria es ' || v_numero);
end;

Cesar Crespo 15 UNAQ


EJERCICIOS DE GESTION DE DASE DE DATOS

COMENTARIO.

Los programas realizados nos ayudan a desarrollarlo la habilidad de obtener datos que en su momento los
utilizaremos en nuestra vida profesional, por otro lado nos ayudan a comprender lo aprendido en las clases
anteriores.

Este tipo de programas también nos ayuda a obtener información, validar información, en si nos ayudan a filtrar datos
para al final poder obtener los resultados esperados.

Con la correcta utilización de todos los comandos que se utilizan en el PL/SQL se pueden crear programas que
ayudarían mucho a la administración de la información de Oracle.

Recomiendo a usted Ing. Alex Freire que debe reforzar los temas últimos estudiados, ya que no fueron entendidos en
su totalidad con las pocas horas de clase que tuvimos para tratar éstos temas, y aunque esto no es una justificación
creo que hice mi mejor esfuerzo para poder realizar ésta tarea.

Cesar Crespo 16 UNAQ