0% encontró este documento útil (0 votos)
270 vistas12 páginas

Multas SQL

El documento describe los procedimientos almacenados (stored procedures) en PL/SQL. Explica que son bloques de código que se almacenan en la base de datos y pueden recibir parámetros. Da ejemplos de cómo crear procedimientos para calcular el área de un triángulo y clasificar salones por capacidad.

Cargado por

José Villacís
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como TXT, PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
270 vistas12 páginas

Multas SQL

El documento describe los procedimientos almacenados (stored procedures) en PL/SQL. Explica que son bloques de código que se almacenan en la base de datos y pueden recibir parámetros. Da ejemplos de cómo crear procedimientos para calcular el área de un triángulo y clasificar salones por capacidad.

Cargado por

José Villacís
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como TXT, PDF, TXT o lee en línea desde Scribd

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

-----------------------------------------------------------------------------------
-------------------

También podría gustarte