Beruflich Dokumente
Kultur Dokumente
UNIVERSIDAD EL BOSQUE
INGENIERÍA DE SISTEMAS
BASES DE DATOS II
BOGOTÁ
2019
pág. 1
TALLER GESTOR ORACLE
Profesor
Ingeniero Mario Silva
UNIVERSIDAD EL BOSQUE
INGENIERÍA DE SISTEMAS
BASES DE DATOS II
BOGOTÁ
2019
pág. 2
CONTENIDO
Pág.
Resumen ............................................................................................................................................. 6
Introducción ........................................................................................................................................ 7
1.Creación de la base de datos .......................................................................................................... 8
1.1. Descripción código ................................................................................................................... 9
2.Procedimientos y Funciones ........................................................................................................ 11
2.1. Secuencias .......................................................................................................................... 11
2.2. Inserciones ......................................................................................................................... 12
2.3. Información de socio por código. ....................................................................................... 16
2.4. Préstamos Por socio ........................................................................................................... 18
2.5. Valor total de los prestamos .............................................................................................. 19
2.Triggers .......................................................................................................................................... 21
3.1. Trigger tabla prestamos...................................................................................................... 21
3.2. Trigger tabla socio .............................................................................................................. 22
3.3. Trigger tabla libro. .............................................................................................................. 24
pág. 3
LISTA DE SCRIPTS
Pág.
pág. 4
LISTA DE FIGURAS
Ilustración 1 ................................................................................................................................... 10
Ilustración 2 ................................................................................................................................... 10
Ilustración 3 ................................................................................................................................... 16
Ilustración 4 ................................................................................................................................... 17
Ilustración 5 ................................................................................................................................... 19
Ilustración 6 ................................................................................................................................... 20
Ilustración 7 ................................................................................................................................... 22
Ilustración 8 ................................................................................................................................... 23
Ilustración 9 ................................................................................................................................... 25
Ilustración 10 ................................................................................................................................. 26
pág. 5
RESUMEN
Para la realización de este taller se llevó acabo la descarga del gestor de base de
datos de Oracle “Oracle SQL Developer” con el cual se genera todo el código SQL
necesario para solucionar el mismo, además para la creación de la base de datos
se realizó por medio de otra herramienta de Oracle “Oracle XE 18C” El cual
implementa una base de datos local
pág. 6
INTRODUCCION
Oracle ofrece una versión gratuita de su base de datos, con el principal objetivo de
introducir en el 'mundo Oracle' a desarrolladores, DBAs, estudiantes y formadores,
y vendedores de hardware y software que quieran distribuir junto con sus productos
una base de datos sin costes de licencia. El producto es Oracle Database 18C
Express Edition, también conocida como Oracle XE que al ser gratuita tiene ciertas
limitaciones tales como:
Hasta 12 GB de datos de usuario.
Hasta 2 GB de RAM de base de datos
Hasta 2 hilos de CPU
Hasta 3 bases de datos conectables
pág. 7
1. CREACIÓN DE LA BASE DE DATOS
Código SQL para la creación de las tablas en “Oracle SQL Developer”.
Script 1. Creación de la base de datos.
pág. 8
1.1. Descripción Código.
Otra de las tablas es la tabla de “Estado” en la que se encuentra los (3) estados
posibles para un libro los cuales son. Excelente, Usado o Dañado. Pero a pesar de
no tener mas contenido para el correcto funcionamiento se le debe asignar un
código como llave primaria para hacer las respectivas relaciones con las demás
tablas.
En la siguiente tabla “Socio”, está diseñada con la intención de almacenar los datos
básicos de una persona que tenga acceso a los prestamos de libros de la biblioteca.
En esta tabla se puede ver. Un código único para cada socio, nombre, dirección y
un teléfono. La llave primaria es el código único que puede ser la cedula ya que es
un identificador único que no se puede repetir.
En la siguiente tabla “Copia”, se refiere a las copias que debe haber por cada libro,
esta cuenta con. Un código, libro el cual debe ser el mismo código del ISBN del
respectivo libro, y un estado el cual debe corresponder a uno al código de uno de
los (3) estados posibles. Su llave primaria será “código” y cuenta con dos llaves
foráneas con “libro” y “Estado”.
Por último, la tabla “Préstamo”, cuenta con la información necesaria para los
préstamos que puedan realizar cada uno de los socios teniendo en cuenta las llaves
primarias de las anteriores tablas, esta cuenta con los siguientes atributos. Código,
copia la cual debe ser el código de la copia solicitada, lector que debe ser el código
del lector establecido en la tabla “Socio”, fecha del préstamo, fecha de devolución,
y el costo del préstamo. En esta tabla a pesar de usar una llave primaria que es
código, cuenta con 2 llaves foráneas las cuales son “copia” y “lector” las cuales
apuntas a sus respectivas tablas que son “Copia” y “Socio”.
pág. 9
Ilustración 1
Ilustración 2
pág. 10
2. PROCEDIMIENTOS Y FUNCIONES
2.1. Secuencias.
Script 2. Creación de secuencias:
En este caso se unificaron los puntos (2,3,4) debido a que son prácticamente todos
iguales.
pág. 11
2.2. Inserciones.
--Confirmacion de insercion
Select * from libro;
--Insercion de datos
INSERT INTO Estado VALUES(01,'Excelente');
INSERT INTO Estado VALUES(02,'Usado');
INSERT INTO Estado VALUES(03,'Dañado');
--Confirmacion de insercion
Select * from estado;
--Insercion de datos
INSERT INTO Socio VALUES(SECUENCIA_CODIGO_SOCIO.NEXTVAL,'Jonathan Ospina','Calle
31A',3006889961);
INSERT INTO Socio VALUES(SECUENCIA_CODIGO_SOCIO.NEXTVAL,'Alexander
Hernandez','Carrera 29B',8122413);
INSERT INTO Socio VALUES(SECUENCIA_CODIGO_SOCIO.NEXTVAL,'Mateo Peña
Duran','Calle 167B - peligro',3144867555);
INSERT INTO Socio VALUES(SECUENCIA_CODIGO_SOCIO.NEXTVAL,'Diana Garcia','Calle
13B',3153882307);
INSERT INTO Socio VALUES(SECUENCIA_CODIGO_SOCIO.NEXTVAL,'Vanessa
Cuervo','Carrera 22A',7201716);
--Confirmacion de insercion
Select * from socio;
--Insercion de datos
INSERT INTO Copia VALUES(SECUENCIA_CODIGO_COPIA.NEXTVAL,0001,'1');
INSERT INTO Prestamo
VALUES(SECUENCIA_CODIGO_PRESTAMO.NEXTVAL,SECUENCIA_CODIGO_COPIA.CURRV
AL,1000,'02/01/2019','03/01/2019',3000);
INSERT INTO Copia VALUES(SECUENCIA_CODIGO_COPIA.NEXTVAL,0001,'2');
pág. 12
INSERT INTO Prestamo
VALUES(SECUENCIA_CODIGO_PRESTAMO.NEXTVAL,SECUENCIA_CODIGO_COPIA.CURRV
AL,1001,'04/02/2019','05/02/2019',5000);
INSERT INTO Copia VALUES(SECUENCIA_CODIGO_COPIA.NEXTVAL,0002,'3');
INSERT INTO Prestamo
VALUES(SECUENCIA_CODIGO_PRESTAMO.NEXTVAL,SECUENCIA_CODIGO_COPIA.CURRV
AL,1002,'06/02/2019','07/02/2019',6000);
INSERT INTO Copia VALUES(SECUENCIA_CODIGO_COPIA.NEXTVAL,0002,'3');
INSERT INTO Prestamo
VALUES(SECUENCIA_CODIGO_PRESTAMO.NEXTVAL,SECUENCIA_CODIGO_COPIA.CURRV
AL,1003,'08/01/2019','09/01/2019',9000);
INSERT INTO Copia VALUES(SECUENCIA_CODIGO_COPIA.NEXTVAL,0003,'2');
INSERT INTO Prestamo
VALUES(SECUENCIA_CODIGO_PRESTAMO.NEXTVAL,SECUENCIA_CODIGO_COPIA.CURRV
AL,1004,'10/01/2019','11/01/2019',3000);
INSERT INTO Copia VALUES(SECUENCIA_CODIGO_COPIA.NEXTVAL,0003,'1');
INSERT INTO Prestamo
VALUES(SECUENCIA_CODIGO_PRESTAMO.NEXTVAL,SECUENCIA_CODIGO_COPIA.CURRV
AL,1000,'12/02/2019','13/02/2019',5000);
INSERT INTO Copia VALUES(SECUENCIA_CODIGO_COPIA.NEXTVAL,0004,'1');
INSERT INTO Prestamo
VALUES(SECUENCIA_CODIGO_PRESTAMO.NEXTVAL,SECUENCIA_CODIGO_COPIA.CURRV
AL,1001,'14/02/2019','14/02/2019',6000);
INSERT INTO Copia VALUES(SECUENCIA_CODIGO_COPIA.NEXTVAL,0004,'2');
INSERT INTO Prestamo
VALUES(SECUENCIA_CODIGO_PRESTAMO.NEXTVAL,SECUENCIA_CODIGO_COPIA.CURRV
AL,1002,'14/01/2019','14/01/2019',9000);
INSERT INTO Copia VALUES(SECUENCIA_CODIGO_COPIA.NEXTVAL,0005,'3');
INSERT INTO Prestamo
VALUES(SECUENCIA_CODIGO_PRESTAMO.NEXTVAL,SECUENCIA_CODIGO_COPIA.CURRV
AL,1003,'12/01/2019','13/01/2019',3000);
INSERT INTO Copia VALUES(SECUENCIA_CODIGO_COPIA.NEXTVAL,0005,'3');
INSERT INTO Prestamo
VALUES(SECUENCIA_CODIGO_PRESTAMO.NEXTVAL,SECUENCIA_CODIGO_COPIA.CURRV
AL,1004,'10/02/2019','11/02/2019',5000);
INSERT INTO Copia VALUES(SECUENCIA_CODIGO_COPIA.NEXTVAL,0006,'2');
INSERT INTO Prestamo
VALUES(SECUENCIA_CODIGO_PRESTAMO.NEXTVAL,SECUENCIA_CODIGO_COPIA.CURRV
AL,1000,'08/02/2019','09/02/2019',6000);
INSERT INTO Copia VALUES(SECUENCIA_CODIGO_COPIA.NEXTVAL,0006,'1');
INSERT INTO Prestamo
VALUES(SECUENCIA_CODIGO_PRESTAMO.NEXTVAL,SECUENCIA_CODIGO_COPIA.CURRV
AL,1001,'06/01/2019','07/01/2019',9000);
INSERT INTO Copia VALUES(SECUENCIA_CODIGO_COPIA.NEXTVAL,0007,'1');
INSERT INTO Prestamo
VALUES(SECUENCIA_CODIGO_PRESTAMO.NEXTVAL,SECUENCIA_CODIGO_COPIA.CURRV
AL,1002,'04/01/2019','05/01/2019',3000);
pág. 13
INSERT INTO Copia VALUES(SECUENCIA_CODIGO_COPIA.NEXTVAL,0007,'2');
INSERT INTO Prestamo
VALUES(SECUENCIA_CODIGO_PRESTAMO.NEXTVAL,SECUENCIA_CODIGO_COPIA.CURRV
AL,1003,'02/02/2019','03/02/2019',5000);
INSERT INTO Copia VALUES(SECUENCIA_CODIGO_COPIA.NEXTVAL,0008,'3');
INSERT INTO Prestamo
VALUES(SECUENCIA_CODIGO_PRESTAMO.NEXTVAL,SECUENCIA_CODIGO_COPIA.CURRV
AL,1004,'01/02/2019','02/02/2019',6000);
INSERT INTO Copia VALUES(SECUENCIA_CODIGO_COPIA.NEXTVAL,0008,'3');
INSERT INTO Prestamo
VALUES(SECUENCIA_CODIGO_PRESTAMO.NEXTVAL,SECUENCIA_CODIGO_COPIA.CURRV
AL,1000,'03/01/2019','04/01/2019',9000);
INSERT INTO Copia VALUES(SECUENCIA_CODIGO_COPIA.NEXTVAL,0009,'2');
INSERT INTO Prestamo
VALUES(SECUENCIA_CODIGO_PRESTAMO.NEXTVAL,SECUENCIA_CODIGO_COPIA.CURRV
AL,1001,'05/01/2019','06/01/2019',3000);
INSERT INTO Copia VALUES(SECUENCIA_CODIGO_COPIA.NEXTVAL,0009,'1');
INSERT INTO Prestamo
VALUES(SECUENCIA_CODIGO_PRESTAMO.NEXTVAL,SECUENCIA_CODIGO_COPIA.CURRV
AL,1002,'07/02/2019','08/02/2019',5000);
INSERT INTO Copia VALUES(SECUENCIA_CODIGO_COPIA.NEXTVAL,0010,'1');
INSERT INTO Prestamo
VALUES(SECUENCIA_CODIGO_PRESTAMO.NEXTVAL,SECUENCIA_CODIGO_COPIA.CURRV
AL,1003,'09/02/2019','10/02/2019',6000);
INSERT INTO Copia VALUES(SECUENCIA_CODIGO_COPIA.NEXTVAL,0010,'2');
INSERT INTO Prestamo
VALUES(SECUENCIA_CODIGO_PRESTAMO.NEXTVAL,SECUENCIA_CODIGO_COPIA.CURRV
AL,1004,'11/01/2019','12/01/2019',9000);
Para la inserción de datos a la tabla “Libro” debe realizarse con la función “INSERT
INTO Libro VALUES”, para después ingresar en ¡orden! Los datos a los atributos ya
mencionados, teniendo en cuenta las llaves primarias establecidas en el momento
de la creación de la tabla. En este caso a diferencia del ápex este entorno de
desarrollo no necesita de la implementación de un bloque para ejecutar todos los
insert al mismo tiempo.
Para la inserción de datos a la tabla “Socio” debe realizarse con la función “INSERT
INTO Socio VALUES”, para después ingresar en ¡orden! Los datos a los atributos
ya mencionados, teniendo en cuenta las llaves primarias establecidas en el
momento de la creación de la tabla. En este caso a diferencia del ápex este entorno
pág. 14
de desarrollo no necesita de la implementación de un bloque para ejecutar todos los
insert al mismo tiempo.
Para la inserción de datos a la tabla “Copia” debe realizarse con la función “INSERT
INTO Copia VALUES”, para después ingresar en ¡orden! Los datos a los atributos
ya mencionados, pero a diferencia de las anteriores tablas en los campos de libro y
estado debe ingresarse un valor que ya este creado en las tablas “Libro” y “Estado”,
teniendo en cuenta las llaves primarias establecidas en el momento de la creación
de la tabla. En este caso a diferencia del ápex este entorno de desarrollo no necesita
de la implementación de un bloque para ejecutar todos los insert al mismo tiempo.
Verificación:
Script 4. Código para la verificación de las inserciones en cada una de las tablas:
--Confirmacion de insercion
Select * from “nombre de la table que deseamos verificar ”;
pág. 15
Ilustración 3
BEGIN getSocio(1000);
END;
pág. 16
“WHERE” el cual filtra se ejecuta antes del “SELECT” y en vez de traer todos los
registros de la tabla “Socio” únicamente trae los que cumplan la condición “WHERE”
que en este caso valida si el “codigo” del el socio es el mismo que el procedimiento
recibe por parámetro “Codigo Cliente”, y este resultado lo almacena en la variable
establecida anterior mente “resultado” que tiene el mismo esquema que la tabla
“socio”. A continuación se aplica el bloque de ejecución con el socio 1000 y Su
resultado se puede evidenciar en la ilustración 4.
Ilustración 4
lIsbn Number(10);
pág. 17
lTitulo Varchar2(50);
lAutor Varchar2(50);
lGenero Varchar2(50);
sNombre Varchar2(50);
BEGIN
OPEN consultar_libros_socio;
LOOP
FETCH consultar_libros_socio INTO lIsbn,lTitulo,lAutor,lGenero,sNombre;
dbms_output.put_line('ISBN: ' || lIsbn || ' ' || 'Titulo: ' || lTitulo ||' '|| 'Autor: ' || lAutor ||' '|| 'Genero:
' || lGenero ||' '|| 'Usuario: ' || sNombre);
EXIT WHEN consultar_libros_socio%NOTFOUND;
END LOOP;
CLOSE consultar_libros_socio;
END;
Para ello se implementó un cursor que realiza una consulta a la base de datos por
medio de un “SELECT” y un “INNER JOIN” para así poder traer todos los datos
necesarios. se implementa una instrucción “WHERE” la cual valida el parámetro que
se ingresa, con fin de traer únicamente los datos del usuario que se desea. Con el
fin de almacenar estos datos en las dos variables locales del método y así generar
la variable que va retornar la función. Una vez creada dicha función se ejecuta el
bloque de prueba descrito al final del Script al cual se le debe indicar el parámetro
que la función va recibir. En concreto nuestro ejemplo se realiza la consulta al
usuario “Jonathan Ospina” y nos da como resultado (ver Figura 5).
pág. 18
Ilustración 5
CURSOR Prestamos_Estado IS
SELECT Estado.descripcion, SUM(prestamo.valor) FROM Prestamo INNER JOIN Copia ON
copia.codigo = prestamo.copia INNER JOIN Estado ON copia.estado = estado.codigo
GROUP BY (Estado.descripcion);
descripcion VARCHAR2(50);
valor NUMBER(13);
BEGIN
dbms_output.put_line('Prestamos por Genero');
OPEN Prestamos_Genero;
LOOP
FETCH Prestamos_Genero INTO descripcion, valor;
EXIT WHEN Prestamos_Genero%NOTFOUND;
dbms_output.put_line(descripcion|| '---->'|| valor);
END LOOP;
CLOSE Prestamos_Genero;
dbms_output.put_line('Prestamos por Estado');
pág. 19
OPEN Prestamos_Estado;
LOOP
FETCH Prestamos_Estado INTO descripcion, valor;
EXIT WHEN Prestamos_Estado%NOTFOUND;
dbms_output.put_line(descripcion|| '---->'|| valor);
END LOOP;
CLOSE Prestamos_Estado;
END;
BEGIN mostrarValorPrestamos;
END;
Para este procedimiento se hizo uso de dos cursores con el fin de realizar las
consultas pertinentes teniendo en cuenta que el objetivo era traer la suma de los
valores de los prestamos en nuestro caso lo filtramos por 3 géneros que son física
ingeniería y matemáticas además por 3 géneros excelente dañado y usado.
Ilustración 6
pág. 20
3. TRIGGERS
En este bloque de código se crea una Tabla de auditoria que almacena los códigos
del préstamo, copia del libro, y el socio a quien le es prestada la copia del libro,
adicionalmente almacena la fecha del momento en el que se genera un nuevo
préstamo. En el trigger se generan las condiciones para que esto ocurra cada vez
que se hace una inserción de un nuevo préstamo. Finalmente se realiza una prueba
de funcionamiento correcto obteniendo los resultados mostrados en la imagen.
pág. 21
Ilustración 7
pág. 22
END ;
UPDATE Socio SET nombre = 'Jonathan O', direccion = 'dir1', telefono = 123
WHERE codigo = '1000';
UPDATE Socio SET nombre = 'Jonathan Ospina O', direccion = 'Calle 31A', telefono = 3006889961
WHERE codigo = '1000';
Para este caso se crea una tabla de auditoria que almacenara cambios realizados
en la tabla socios. La tabla almacena los valores del nombre, dirección y teléfono
antes y después de la modificación, con la fecha en la que esta fue realizada.
Igualmente en el trigger se generan las condiciones para que esto ocurra,
realizando una inserción con los valores nuevos :(:NEW) y antiguos (:OLD):
Finalmente se realiza la prueba de funcionamiento, obteniendo como resultado las
2 imágenes, donde se muestra la actualización realizada a la tabla socio y el
correcto funcionamiento de el trigger cuando realiza la inserción en la tabla de
auditoria con sus respectivos valores.
Ilustración 8
pág. 23
3.3. Auditoria de los libros borrados
En este caso se crea una tabla de auditoria para almacenar la información completa
sobre un libro que sea eliminado y la fecha en la que esto sucede. A diferencia de
los dos trigger anteriores la acción se realiza antes y no después de, ya que la
información sera eliminada, esta acción es nuevamente una inserción de datos en
la tabla de auditoria.
Para mostrar el funcionamiento se inserta un nuevo libro para posteriormente ser
eliminado como se muestra en las imágenes, ya que los libros que estaban
almacenados en esta tabla poseen registros en la tabla copias, para lo cual seria
necesario otro tipo de eliminación (Cascade Delete) haciendo mas complejo
regresar los datos a los valores anteriores. Finalmente en la ultima imagen se
muestra que funciona correctamente almacenando la información del libro
eliminado.
pág. 24
Ilustración 9
pág. 25
Ilustración 10
pág. 26