DEBER:
/ COMPLETAR EL PROCEDURE DEVOLVER PARA QUE :
SI UN LIBRO SE DEVUELVE DESPUES DEL TIEMPO ESTIPULADO EN LA CANTIDAD DE DIAS,
ENTONCES SE DEBE ENVIAR A UNA TABLA SANCIONES EL NUMERO DE PRESTAMO, EL NUMERO DE
CEDULA DEL ESTUDIANTE Y UNA MULTA DE 2 DOLARES POR CADA DIA DE RETRASO EN LA
ENTREGA DEL LIBRO //
1 - 1801 - L01 (3DIAS) 15/SEP 20/SEP (SE PASO 2 DIAS) 4 DOLARES DE MULTA
2 - 1803 - L02 (1 DIAS) 11/SEP 23/SEP (SE PASO 11 DIAS) 11X2=22 DOLARES DE
MULTA
PROCEDURES PLSQL
BLOQUES NOMINADOS (SUBPROGRAMAS)----------
Son blooques PLSQL que reciben un nombre propio, que les sirve para ser almacenados
de forma permanente dentro del servidor de la BD.
El bloque nominado(subprograma) se compila una sola vez(cuando el bloque es
creado), y se almacena en el servidor en formato ejecutable, de manera que cuando
es invocado nuevamente se ejecuta directamente sin compilarse.
Dentro de los bloques nominados tenemos:
PROCEDIMENTOS (STORED PROCEDURES)
TRIGGERS
FUNCTIONS
CURSORS
PACKAGES
-----------------------------------------------------------------------------------
------
PROCEDIMIENTOS ALMACENADOS (STORED PROCEDURES)
Son bloques PLSQL que realizan funciones especificas, que pueden recibir parámetros
y pueden anidarse.
SINTAXIS
CREATE [OR REPLACE] PROCEDURE nombreProcedimiento[(parametros TIPO_DE_DATO)]
IS / AS
BEGIN
cuerpo_Procedimiento;
[EXCEPTION];
END [nombreProcedimiento];
--------------------------------------------------------------------------------
IMPORTANTE: En los procedimientos desaparce la palabra DECLARE. Las variables se
declaran luego de la palabra IS y antes de la palabra BEGIN.
-----------------------------------------------------------------------------------
--
EJEMPLO:
TRANSFORMAR A PROCEDIMIENTO ALMACENADO EL EJRCICIO DEL CALCULO DEL AREA DE UN
TRIANGULO.
CREATE OR REPLACE PROCEDURE CALC_AREA(B NUMBER, H NUMBER)
IS
A NUMBER;
ERROR_DATOS EXCEPTION;
BEGIN
IF B<=0 OR H<=0 THEN
RAISE ERROR_DATOS;
ELSE
A:=(B*H)/2;
INSERT INTO AREAS_TRI(NUM_TRI, BASE,ALTURA,AREA)
VALUES(TRI_SEQ.NEXTVAL,B,H,A);
COMMIT;
END IF;
EXCEPTION
WHEN ERROR_DATOS THEN
RAISE_APPLICATION_ERROR(-20010,'DATOS NEGATIVOS');
END;
-------------------------------------------------------------
LOS PROCEDIMIENTOS SE EJECUTAN:
EXECUTE nombre_Procedimiento(parametros);
----------------------------------------------------------------
EXECUTE CALC_AREA(9,6);
----------------------------------------------------------------------
SI EL PROCEDURE VA A EJECUTARSE DENTRO DE OTRO BLOQUE PLSQL ENTONCES SE LLAMA SOLO
CON EL NOMBRE DEL PROCEDURE(PARAMETROS), PERO YA NO USA EXECUTE.
---------------------------------------------------------------------------------
EJEMPLO:
BEGIN
CALC_AREA(5,20);
END;
---------------------------------------------------------------------------------
EJERCICIO.
CREAR UN PROCEDURE ALMACENADO QUE RECIBA LA CEDULA, NOMBRE, APELLIDO Y 2 NOTAS DE
UN ESTUDIANTE DE LA FISEI, Y ENVIE A UNA TABLA LLAMADA DECISION SI EL ESTUDIANTE
APRUEBA O REPRUEBA.
CREATE TABLE ALUMNOS
(CED_ALU VARCHAR(10) PRIMARY KEY,
NOM_ALU VARCHAR(10) NOT NULL,
APE_ALU VARCHAR(10) NOT NULL,
NOTA1 NUMBER,
NOTA2 NUMBER);
CREATE TABLE DECISION
(ID_ALU VARCHAR(10),
DECISION VARCHAR(10));
-----------------------------------------------------------------------------------
-----
CREATE OR REPLACE PROCEDURE DECIDIR(C VARCHAR,N VARCHAR,A VARCHAR,N1 NUMBER,N2
NUMBER)
IS
S NUMBER;
OBS VARCHAR(10);
ERROR_NOTAS EXCEPTION;
BEGIN
IF (N1<1 OR N1>10) OR (N2<1 OR N2>10) THEN
RAISE ERROR_NOTAS;
ELSE
S:=N1+N2;
IF S>=14 THEN
OBS:='APRUEBA';
ELSE
OBS:='REPRUEBA';
END IF;
INSERT INTO ALUMNOS(CED_ALU,NOM_ALU,APE_ALU,NOTA1,NOTA2)
VALUES( C , N , A , N1 , N2);
INSERT INTO DECISION(ID_ALU,DECISION)
VALUES(C, OBS);
COMMIT;
END IF;
EXCEPTION
WHEN ERROR_NOTAS THEN
RAISE_APPLICATION_ERROR(-20011,'NOTAS NEGATIVAS');
END DECIDIR;
------------------------------------------------------------------
EXECUTE DECIDIR('1801','JUAN','MERA',9,6);
-----------------------------------------------------------------------------------
-----------
USO DE LA SENTENCIA INTO
---------------------------------------------------------------
INTO sirve para almacenar de forma tempral un dato en una variable.
El dato que se almacenará será el resultado de una sentencia SELECT a una tabla de
la BD.
Se usa INTO debido a que un dato que es el resulatdo de una consulta no se puede
utilizar directamente desde la tabla, sino que debe ser consultado(SELECT) y
recuperado y almacenado en una variable, para de esa forma poder ser utilizado.
EJERCICIO:
CREAR LA TABLA SALONES
Y LUEGO CREAR UN PROCEDURE QUE RECIBA EL ID DEL SALON Y DEVUELVA UNA OBSERVACION
PEQUEÑO, MEDIANO O GRANDE DEPENDIENDO DE SU CAPACIDAD.
CREATE TABLE SALONES(
ID_SAL VARCHAR(5) PRIMARY KEY,
NOM_SAL VARCHAR(10) NOT NULL,
CAP_SAL NUMBER(2));
INSERT INTO SALONES
VALUES('S01','SALON 1',10);
INSERT INTO SALONES
VALUES('S02','SALON 2',80);
INSERT INTO SALONES
VALUES('S03','SALON 3',35);
-----------------------------------------------------------------------------------
----
CREATE TABLE CLAS_SAL
(ID_SAL VARCHAR(5),
CLAS VARCHAR(10));
--------------------------------------------------------------------------------
CREATE OR REPLACE PROCEDURE CLASIFICAR(SALON VARCHAR)
IS
CAPACIDAD NUMBER;
OBS VARCHAR(10);
BEGIN
SELECT CAP_SAL INTO CAPACIDAD
FROM SALONES
WHERE ID_SAL=SALON;
IF CAPACIDAD>0 AND CAPACIDAD<=25 THEN
OBS:='PEQUEÑO';
ELSE
IF CAPACIDAD<=50 THEN
OBS:='MEDIANO';
ELSE
OBS:='GRANDE';
END IF;
END IF;
INSERT INTO CLAS_SAL(ID_SAL, CLAS)
VALUES(SALON,OBS);
COMMIT;
END CLASIFICAR;
.
-------------------------------------
EXECUTE CLASIFICAR('S01');
------------------------------------------------------------------
EJEMPLO DE APLICACION
Crear una BD con los controles necesarios para el prestamo y la devolución de los
libros en la biblioteca de la FISEI.
-----------------------------------------------------------------------------------
-
ESTUDIANTES=(CED_EST, NOM_EST, APE_EST, CAR_PER)
BIBLIOTECARIOS=(CED_BIB, NOM_BIB, APE_BIB)
LIBROS=(ID_LIB,NOM_LIB, EDI_LIB, DIS_LIB, EST_LIB,CAN_DIAS)
PRESTAMOS=(NUM_PRE, FEC_PRE, FEC_DEV,EST_PRE_LIB,
EST_DEV_LIB,CED_EST_PRE,CED_BIB_PRE,ID_LIB_PRE)
-----------------------------------------------------------------------------------
-------------
CONNECT SYSTEM;
CREATE USER BIB_FISEI IDENTIFIED BY BIBLIO;
GRANT CONNECT, RESOURCE, UNLIMITED TABLESPACE TO BIB_FISEI;
DISCONNECT;
CONNECT BIB_FISEI
------------------------------------------------------
CREATE TABLE ESTUDIANTES
(CED_EST VARCHAR(10) PRIMARY KEY,
NOM_EST VARCHAR(10) NOT NULL,
APE_EST VARCHAR(10) NOT NULL,
CAR_PER VARCHAR(1) CHECK(CAR_PER IN('S','T','E')));
-----------------------------------------------------------------
CREATE TABLE BIBLIOTECARIOS
(CED_BIB VARCHAR(10) PRIMARY KEY,
NOM_BIB VARCHAR(10) NOT NULL,
APE_BIB VARCHAR(10) NOT NULL);
----------------------------------------------------------------
CREATE TABLE LIBROS
(ID_LIB VARCHAR(5) PRIMARY KEY,
NOM_LIB VARCHAR(20) NOT NULL,
EDI_LIB NUMBER(1) CHECK(EDI_LIB>0),
DIS_LIB VARCHAR(1) CHECK(DIS_LIB IN('D','P','E')),
EST_LIB VARCHAR(11) CHECK(EST_LIB IN('NUEVO','SEMINUEVO','DETERIORADO')),
CAN_DIAS NUMBER(1) NOT NULL);
-----------------------------------------------------------------------------------
--
CREATE TABLE PRESTAMOS
(NUM_PRE NUMBER PRIMARY KEY,
FEC_PRE DATE NOT NULL,
FEC_DEV DATE,
EST_PRE_LIB VARCHAR(11) CHECK(EST_PRE_LIB IN('NUEVO','SEMINUEVO','DETERIORADO')),
EST_DEV VARCHAR(11),
CED_EST_PRE REFERENCES ESTUDIANTES(CED_EST),
CED_BIB_PRE REFERENCES BIBLIOTECARIOS(CED_BIB),
ID_LIB_PRE REFERENCES LIBROS(ID_LIB));
-----------------------------------------------------------------------------------
----
INSERT INTO ESTUDIANTES
VALUES('1801','ANA','REYES','S');
INSERT INTO ESTUDIANTES
VALUES('1802','PAUL','SANCHEZ','T');
INSERT INTO ESTUDIANTES
VALUES('1803','CARLOS','FLORES','E');
-----------------------------------------------------------------------------------
---
INSERT INTO BIBLIOTECARIOS
VALUES('1901','CARLA','MORALES');
INSERT INTO BIBLIOTECARIOS
VALUES('1902','JOSE','PEREZ');
-----------------------------------------------------------------------------------
-----
INSERT INTO LIBROS
VALUES('L01','C++',2,'D','NUEVO',3);
INSERT INTO LIBROS
VALUES('L02','JAVA',1,'D','NUEVO',1);
INSERT INTO LIBROS
VALUES('L03','BD',4,'D','SEMINUEVO',2);
INSERT INTO LIBROS
VALUES('L04','CIRCUITOS',2,'D','NUEVO',3);
-------------------------------------------------------------------------------
CREATE SEQUENCE SEC_PRE
INCREMENT BY 1
MAXVALUE 100
START WITH 1
NOCYCLE
NOCACHE;
-------------------------------------------------------
CREAR UN STORED PROCEDURE QUE VERIFIQUE SI UN LIBRO ESTA DISPONIBLE PARA PODER
PRESTARLO, SI ESTA DISPONIBLE ENTONCES SE PRESTA, Y SI NO ESTA DISPONIBLE ENTONCES
SE EXCEPCIONA Y NO SE HACE NADA.
PRESTAR(CED_EST, CED_BIB, COD_LIB)
EXECUTE PRESTAR('1801', '1901', 'L01')
-------------------------------------------------------------------------
CREATE OR REPLACE PROCEDURE PRESTAR(C_E VARCHAR, C_B VARCHAR, I_L VARCHAR)
IS
DISPO VARCHAR(1);
ESTADO LIBROS.EST_LIB%TYPE;
LIBRO_NO_DISP EXCEPTION;
BEGIN
SELECT DIS_LIB, EST_LIB INTO DISPO, ESTADO
FROM LIBROS
WHERE ID_LIB=I_L;
IF DISPO='D' THEN
INSERT INTO
PRESTAMOS(NUM_PRE,FEC_PRE,FEC_DEV,EST_PRE_LIB,EST_DEV,CED_EST_PRE,CED_BIB_PRE,ID_LI
B_PRE)
VALUES(SEC_PRE.NEXTVAL,SYSDATE,NULL,ESTADO, NULL, C_E, C_B,
I_L);
UPDATE LIBROS
SET DIS_LIB='P'
WHERE ID_LIB=I_L;
COMMIT;
ELSE
RAISE LIBRO_NO_DISP;
END IF;
EXCEPTION
WHEN LIBRO_NO_DISP THEN
RAISE_APPLICATION_ERROR(-20012,'EL LIBRO NO ESTA DISPONIBLE');
END PRESTAR;
-----------------------------------------------------------------------------------
----
EXECUTE PRESTAR('1801','1901','L01');
-----------------------------------------------------------------------------------
-------
CREAR EL PROCEDURE PARA DEVOLVER EL LIBRO PRESTADO.
EXECUTE DEVOLVER(NUM_PRE_DEV,EST_DEV )
EXECUTE DEVOLVER(1,'DETERIORADO')
-----------------------------------------------------------------------------------
---
CREATE OR REPLACE PROCEDURE DEVOLVER(NP NUMBER, NUE_EST VARCHAR)
IS
LIB_DEV LIBROS.ID_LIB%TYPE;
BEGIN
UPDATE PRESTAMOS
SET FEC_DEV=SYSDATE ,
EST_DEV=NUE_EST
WHERE NUM_PRE=NP;
SELECT ID_LIB_PRE INTO LIB_DEV
FROM PRESTAMOS
WHERE NUM_PRE=NP;
UPDATE LIBROS
SET DIS_LIB='D' ,
EST_LIB=NUE_EST
WHERE ID_LIB=LIB_DEV;
COMMIT;
END DEVOLVER;
-------------------------------------------------------------------
EXECUTE DEVOLVER(1,'DETERIORADO')
----------------------------------------------------------------------
DEBER:
// COMPLETAR EL PROCEDURE DEVOLVER PARA QUE :
SI UN LIBRO SE DEVUELVE DESPUES DEL TIEMPO ESTIPULADO EN LA CANTIDAD DE DIAS,
ENTONCES SE DEBE ENVIAR A UNA TABLA SANCIONES EL NUMERO DE PRESTAMO, EL NUMERO DE
CEDULA DEL ESTUDIANTE Y UNA MULTA DE 2 DOLARES POR CADA DIA DE RETRASO EN LA
ENTREGA DEL LIBRO //
1 - 1801 - L01 (3DIAS) 15/SEP 20/SEP (SE PASO 2 DIAS) 4 DOLARES DE MULTA
2 - 1803 - L02 (1 DIAS) 11/SEP 23/SEP (SE PASO 11 DIAS) 11X2=22
DOLARES DE MULTA
-----------------------------------------------------------------------------------
-------------------