Sie sind auf Seite 1von 26

TALLER GESTOR ORACLE

JONATHAN OSPINA HERNANDEZ


MATEO PEÑA DURAN

UNIVERSIDAD EL BOSQUE
INGENIERÍA DE SISTEMAS
BASES DE DATOS II
BOGOTÁ
2019

pág. 1
TALLER GESTOR ORACLE

JONATHAN OSPINA HERNANDEZ


MATEO PEÑA DURAN

Taller Gestor de Oracle


haciendo uso de Oracle SQL Developer

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.

Script 1. Creación de la base de datos. 8


Script 2. Creación de secuencias.
Script 3. Inserción de los datos a la base local de Oracle.
Script 4. Código para la verificación de las inserciones.
Script 5. Procedimiento préstamos por socio.
Script 6. Procedimiento valor total de los préstamos.
Script 7. Trigger para la tabla préstamos.
Script 8. Trigger para la tabla socios.
Script 9. Trigger para la tabla libros.

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

Oracle SQL Developer es un entorno de desarrollo integrado y gratuito que


simplifica el desarrollo y la administración de Oracle Database tanto en
implementaciones tradicionales como en la nube. SQL Developer ofrece un
desarrollo completo de sus aplicaciones PL / SQL, una hoja de trabajo para ejecutar
consultas y scripts, una consola DBA para administrar la base de datos, una interfaz
de informes, una solución completa de modelado de datos y una plataforma de
migración para mover su Bases de datos de terceros a Oracle.

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.

CREATE TABLE Libro(


isbn NUMBER(10) PRIMARY KEY NOT NULL
,titulo VARCHAR(50)
,autor VARCHAR(50)
,genero VARCHAR(40)
);

CREATE TABLE Estado(


codigo NUMBER(10) PRIMARY KEY NOT NULL
,descripcion VARCHAR(50)
);

CREATE TABLE Socio(


codigo NUMBER(10) PRIMARY KEY NOT NULL
,nombre VARCHAR(50)
,direccion VARCHAR(50)
,telefono NUMBER(15)
);

CREATE TABLE Copia(


codigo NUMBER(10) PRIMARY KEY NOT NULL
,libro NUMBER(10)
,estado NUMBER(10)
,FOREIGN KEY (libro) REFERENCES Libro(isbn)
,FOREIGN KEY (estado) REFERENCES Estado(codigo)
);

CREATE TABLE Prestamo(


codigo NUMBER(10) PRIMARY KEY NOT NULL
,copia NUMBER(10)
,lector NUMBER(10)
,fecha_prestamo DATE
,fecha_devolucion DATE
,valor NUMBER(15)
,FOREIGN KEY (copia) REFERENCES Copia(codigo)
,FOREIGN KEY (lector) REFERENCES Socio(codigo)
);

pág. 8
1.1. Descripción Código.

En esta sección es la creación de la base de datos teniendo en cuenta las


requisiciones solicitas las cuales son una tabla específica para agregar libros la cual
cuenta con los atributos de ISBN el cual es el serial único de cada libro, titulo, autor
y un género teniendo en cuenta que la llave primaria es el ISBN por la misma razón
de que este en ninguna situación puede repetirse.

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”.

Demostración en el entorno de Oracle:

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:

CREATE SEQUENCE SECUENCIA_CODIGO_COPIA


MINVALUE 20000
MAXVALUE 29999
START WITH 20000
INCREMENT BY 1;

CREATE SEQUENCE SECUENCIA_CODIGO_PRESTAMO


MINVALUE 30000
MAXVALUE 39999
START WITH 30000
INCREMENT BY 1;

CREATE SEQUENCE SECUENCIA_CODIGO_SOCIO


MINVALUE 1000
MAXVALUE 11000
START WITH 1000
INCREMENT BY 1;

En este caso se unificaron los puntos (2,3,4) debido a que son prácticamente todos
iguales.

Primera secuencia “SECUENCIA_CODIGO_COPIA” se determina un valor mínimo


de 20000 y comienza por el mismo incrementando de a 1 hasta llegar a su valor
máximo o limitante que seria 29999.

Segunda secuencia “SECUENCIA_CODIGO_PRESTAMO” se determina un valor


mínimo de 30000 y comienza por el mismo incrementando de a 1 hasta llegar a su
valor máximo o limitante que seria 39999.

Tercera secuencia “SECUENCIA_CODIGO_SOCIO” se determina un valor mínimo


de 1000 y comienza por el mismo incrementando de a 1 hasta llegar a su valor
máximo o limitante que seria 11000.

pág. 11
2.2. Inserciones.

Script 3. Inserción de los datos a la base local de Oracle:


--Insercion de datos
INSERT INTO Libro VALUES(0001,'Fundamentos_De_Programacion','Mario_Silva','Ingenieria');
INSERT INTO Libro VALUES(0002,'Programacion_1','Carlos_Lopez','Ingenieria');
INSERT INTO Libro VALUES(0003,'Programacion_2','Carlos_Lopez','Ingenieria');
INSERT INTO Libro VALUES(0004,'Matematicas_Basicas','Pedro_Ruiz','Matematicas');
INSERT INTO Libro VALUES(0005,'Calculo_Diferencial','Pedro_Ruiz','Matematicas');
INSERT INTO Libro VALUES(0006,'Calculo_Integral','Ruben','Matematicas');
INSERT INTO Libro VALUES(0007,'Fisica_1','Marcela_Duarte','Fisica');
INSERT INTO Libro VALUES(0008,'Fisica_2','Mauricio_Vinasco','Fisica');
INSERT INTO Libro VALUES(0009,'Bases_De_Datos_1','Mario_Silva','Ingenieria');
INSERT INTO Libro VALUES(0010,'Bases_De_Datos_2','Mario_Silva','Ingenieria');

--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);

En esta sección se mostrará el codigo SQL implementado para la correcta inserción


de datos usando bloques, para cada una de las tablas.

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 “Estado” debe realizarse con la función


“INSERT INTO Estado 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 “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.

Para la inserción de datos a la tabla “Prestamos” debe realizarse con la función


“INSERT INTO Prestamos VALUES”, para después ingresar en ¡orden! Los datos a
los atributos ya mencionados, el igual que la tabla “Copia” esta también cuenta con
(2) llaves foráneas que obligan que al momento de realizar un registro en los
campos de copia y lector deben ir datos que ya existan en las tablas “Copia” y
“Socio”. 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

2.3. Información de socio por código.

Script 4. Procedimiento info socios por código.

CREATE OR REPLACE PROCEDURE getSocio(pCodigo NUMBER) IS


informacion Socio%ROWTYPE;
BEGIN
SELECT * INTO informacion FROM Socio WHERE Socio.Codigo = pCodigo;
dbms_output.put_line('Codigo: ' || informacion.Codigo ||chr(10)
|| 'Nombre: ' || informacion.Nombre ||chr(10)|| 'Direccion: '
|| informacion.Direccion ||chr(10)|| 'Telefono: ' || informacion.Telefono);
END;

BEGIN getSocio(1000);
END;

Este procedimiento recibe por parámetro un “CodigoCliente” el cual es de tipo


“number” el cual corresponde a un código que este creado en la tabla “Socio”. En
este procedimiento se aplica el “%ROWTYPE” el cual trae el esquema que tiene la
tabla al que se le aplique en este caso a la tabla “Socio” y se almacena en la variable
resultado, para a continuación realizar una consulta, está cuenta con el condicional

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

2.4. Préstamos por Socio.

Script 5. Procedimiento préstamos por socio.

CREATE OR REPLACE PROCEDURE mostrarPrestamosXS(pSocio VARCHAR2) IS


CURSOR consultar_libros_socio IS
SELECT libro.isbn, libro.titulo, libro.autor, libro.genero, Socio.Nombre
FROM LIBRO INNER JOIN COPIA ON libro.isbn = copia.libro INNER JOIN PRESTAMO ON
copia.codigo = prestamo.copia INNER JOIN SOCIO ON prestamo.lector = socio.codigo
WHERE Socio.Nombre = pSocio;

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;

BEGIN mostrarPrestamosXS('Jonathan Ospina');


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

2.5. Valor de los prestamos.


Script 6. Procedimiento valor total de los préstamos.

CREATE OR REPLACE PROCEDURE mostrarValorPrestamos IS


CURSOR Prestamos_Genero IS
SELECT libro.genero, SUM(prestamo.valor) FROM Prestamo INNER JOIN Copia ON copia.codigo
= prestamo.copia INNER JOIN Libro ON copia.libro = libro.isbn
GROUP BY (libro.genero);

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

3.1. Auditoria de los prestamos

Script 7. Trigger para la tabla préstamos.

CREATE TABLE Auditoria_Prestamos(


codigo_Prestamo NUMBER(10)
,codigo_Copia NUMBER(10)
,codigo_Lector NUMBER(10)
,Fecha_Insercion DATE
);

CREATE OR REPLACE TRIGGER au_prestamos


AFTER INSERT ON Prestamo
FOR EACH ROW
BEGIN
INSERT INTO Auditoria_Prestamos
VALUES(:NEW.CODIGO,:NEW.COPIA,:NEW.LECTOR,SYSDATE);
END ;

INSERT INTO Prestamo


VALUES(SECUENCIA_CODIGO_PRESTAMO.NEXTVAL,20000,1002,'10/03/2019','10/03/2019',90
00);

SELECT * FROM Auditoria_Prestamos;

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

3.2. Auditoria de los socios

Script 8. Trigger para la tabla socios.

CREATE TABLE Auditoria_Socios(


NombreNuevo VARCHAR(50)
,NombreAntiguo VARCHAR(50)
,DireccionNueva VARCHAR(50)
,DireccionAntigua VARCHAR(50)
,TelefonoNuevo NUMBER(15)
,TelefonoAntiguo NUMBER(15)
,Fecha_Actualizacion DATE
);

CREATE OR REPLACE TRIGGER au_Socios


AFTER UPDATE ON Socio
FOR EACH ROW
BEGIN
INSERT INTO Auditoria_Socios
VALUES(:NEW.nombre,:OLD.nombre,:NEW.direccion,:OLD.direccion,:NEW.telefono,:OLD.telefono
,SYSDATE);

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';

SELECT * FROM Socio;


SELECT * FROM Auditoria_Socios;

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

Script 9. Trigger para la tabla libros.

CREATE TABLE Auditoria_Libros(


isbn NUMBER(10) PRIMARY KEY NOT NULL
,titulo VARCHAR(50)
,autor VARCHAR(50)
,genero VARCHAR(40)
,Fecha_Eleminacion DATE
);

CREATE OR REPLACE TRIGGER au_Libros


BEFORE DELETE ON Libro
FOR EACH ROW
BEGIN
INSERT INTO Auditoria_Libros
VALUES(:OLD.isbn,:OLD.titulo,:OLD.autor,:OLD.genero,SYSDATE);
END ;

DELETE FROM Libro WHERE isbn = 20;


INSERT INTO Libro VALUES(20,'Libro para borrar','Mateo Peña','Ingenieria');

SELECT * FROM Libro;


SELECT * FROM Auditoria_Libros;

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

Das könnte Ihnen auch gefallen