You are on page 1of 8

Administracin de Base de Datos IS-443

Ingeniera de Sistemas

PL/SQL
PROCEDIMIENTOS Y FUNCIONES

OBJETIVO: Conocer/Usar PROCEDIMIENTOS y FUNCIONES


PL / SQL

1. FUNCIONES

Ej. Una funcin que devuelve el nmero de equipos que tiene un armario

CREATE OR REPLACE FUNCTION equipos_en_armario (armario armario.N_armario%TYPE)


RETURN NUMBER
AS
num_equipos NUMBER;
BEGIN
SELECT COUNT (*) INTO num_equipos FROM equipo WHERE N_armario=armario;
RETURN num_equipos;
END;

Para ejecutarlo

DECLARE
num_armario NUMBER:=3;
BEGIN
DBMS_OUTPUT.PUT_LINE(El armario || num_armario || tiene || equipos_en_armario(num_armario)||
equipos);
END;

FUNDAMENTOS PLSQL

DROP TABLE RESERVA;


DROP TABLE USUARIO;
drop table equipo;
drop table armario;
--CREACION DE TABLAS
CREATE TABLE ARMARIO(
N_ARMARIO NUMBER(2) NOT NULL,
TIPO VARCHAR2(3),
CONSTRAINT PK_ARMARIO PRIMARY KEY(N_ARMARIO) );

CREATE TABLE EQUIPO(


ID NUMBER(3) NOT NULL,
PLACA_BASE VARCHAR2(20),
N_ARMARIO NUMBER(2),
CONSTRAINT PK_EQUIPO PRIMARY KEY(ID),
CONSTRAINT FK_ARMARIO_EQUIPO FOREIGN KEY(N_ARMARIO) REFERENCES
ARMARIO(N_ARMARIO) );

--INSERCION DE DATOS
INSERT INTO ARMARIO VALUES(1,'XL');
INSERT INTO ARMARIO VALUES(2,'XL');
INSERT INTO ARMARIO VALUES(3,'M');

INSERT INTO EQUIPO VALUES(1,'ASUS',1);


INSERT INTO EQUIPO VALUES(2,'AMD',3);
INSERT INTO EQUIPO VALUES(3,'AMD',2);
INSERT INTO EQUIPO VALUES(4,'ASUS',1);
INSERT INTO EQUIPO VALUES(5,'INTEL',2);
INSERT INTO EQUIPO VALUES(6,'ASUS',3);

CREATE TABLE USUARIO(


ID_USUARIO NUMBER(2) NOT NULL,

UNSCH/CMQE Pgina 1 de 8
Administracin de Base de Datos IS-443
Ingeniera de Sistemas

NOMBRE VARCHAR2(25),
PASSWORD NUMBER(5),
CONSTRAINT PK_USUARIO PRIMARY KEY (ID_USUARIO) );

--INSERCION DE DATOS
INSERT INTO USUARIO VALUES(1,'DAVID PEREZ',1234);
INSERT INTO USUARIO VALUES(2,'PEDRO CAMACHO',1234);
INSERT INTO USUARIO VALUES(3,'DAVID ALVAREZ',1234);
INSERT INTO USUARIO VALUES(4,'LAURA GARCIA',1234);
INSERT INTO USUARIO VALUES(5,'JOSE ANTONIO PEREZ',1234);
INSERT INTO USUARIO VALUES(6,'ANA SUAREZ',1234);
INSERT INTO USUARIO VALUES(7,'JUANJO GALLO',1234);

CREATE TABLE RESERVA(


ID NUMBER(2) NOT NULL,
ID_USUARIO NUMBER(3) NOT NULL,
FECHA_INICIO DATE,
FECHA_FIN DATE,
PERIODO VARCHAR2(30),
CONSTRAINT PK_RESERVA PRIMARY KEY (ID,ID_USUARIO),
CONSTRAINT FK_RESERVA_EQUIPO FOREIGN KEY (ID) REFERENCES EQUIPO,
CONSTRAINT FK_RESERVA_USUARIO FOREIGN KEY (ID_USUARIO) REFERENCES USUARIO );

--INSERCION DE DATOS
INSERT INTO RESERVA VALUES(5,3,'05/01/2013','05/03/2013',NULL);
INSERT INTO RESERVA VALUES(3,2,'05/01/2013','05/04/2013',NULL);
INSERT INTO RESERVA VALUES(6,1,'05/03/2013',NULL,NULL);

Tengo una duda. En el ejercicio que realiza a partir del minuto 36' la excepcin no seria 'Este usuario no existe'?
Corrijame si me equivoco y enhorabuena por lo tutoriales.
Tienes toda la razn, el mensaje debera haber sido el que comentas. Gracias por la correccin!

Dado el escenario del inventario con el siguiente modelo E-R

Nuva entidad Fecha_inicio: Para que un usuario pueda reservar un mismo equipo en pocas diferentes.
Ahora tenemos relacin ternaria.
Nuevo atributo periodo

UNSCH/CMQE Pgina 2 de 8
Administracin de Base de Datos IS-443
Ingeniera de Sistemas

Para el clculo periodo, ponemos las siguientes reglas


- Si todava no ha devuelto el equipo, se pone PENDIENTE
- Si lleva 1 2 das de reserva, se pone DEVUELTO
- Si lleva ms de 2 das de reserva, se pondr PENALIZADO

CREATE OR REPLACE PROCEDURE Calcula_Periodo(usr usuario.ID_Usuario%TYPE)


AS
periodo varchar(20) default 'pendiente';
v_fecha_inicio DATE;
v_fecha_fin DATE;
BEGIN
SELECT fecha_inicio, fecha_fin INTO v_fecha_inicio, v_fecha_fin FROM reserva WHERE
ID_Usuario=usr;
-- das := v_fecha_fin- v_fecha_inicio
CASE
WHEN v_fecha_fin IS NULL THEN
periodo:='pendiente';
WHEN v_fecha_fin v_fecha_inicio < 3 THEN
Periodo:='devuelto';
ELSE
Periodo:='finalizado';
END CASE;
DBMS_OUTPUT.PUT_LINE ('La reserva del usuario con id'||usr||'es:'||Periodo);
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('este usuario no tiene reserva');
END;
/

Estructuras de control repetitivas

Enunciado: vamos a crear la funcion PWD para obtener una contrasea del usuario. Es una funcin para
resetear contrasea. La contrasea nueva ser el nombre del usuario escrito al revs

CREATE OR REPLACE FUNCTION pwd(usr usuario.ID_Usuario%TYPE)


RETURN VARCHAR2
AS
UNSCH/CMQE Pgina 3 de 8
Administracin de Base de Datos IS-443
Ingeniera de Sistemas

password VARCHAR2(20);
v_nombre usuario.nombre%TYPE;
BEGIN
SELECT SUBSTR(nombre,1,INSTR(nombre,' ')) INTO v_nombre FROM usuario
WHERE ID_usuario=usr;
FOR i IN REVERSE 1..LENGTH(v_nombre) LOOP
password := password || SUBSTR(v_nombre,i,1);
END LOOP;
RETURN password;
EXCEPTION
WHEN NO_DATA_FOUND THEN
RETURN 'USUARIO NO ENCONTRADO';
END;
/

Para llamarlo
BEGIN
DBMS_OUTPUT.PUT_LINE (La contrasea es||pwd(1));
END;

NOTA: Todo lo que se puede hacer con un FOR, se puede hacer con un Bucle WHILE

CREATE OR REPLACE FUNCTION pwd (usr usuario.ID_Usuario%TYPE)


RETURN VARCHAR2
AS
password VARCHAR2(20);
v_nombre usuario.nombre%TYPE;
i BINARY_INTEGER;

BEGIN
SELECT SUBSTR(nombre,1,INSTR(nombre, )) INTO v_nombre FROM usuario
WHERE ID_usuario=usr;
i:= LENGTH(v_nombre);
WHILE i>=1 LOOP
Password := password || SUBSTR(v_nombre,i,1);
i:=i-1;
END LOOP;
RETURN password;
EXCEPTION
WHEN NO_DATA_FOUND THEN
RETURN USUARIO NO ENCONTRADO;
END;

Para llamarlo
BEGIN
DBMS_OUTPUT.PUT_LINE (La contrasea es||pwd(1));
END;

CURSORES, EXCEPCIONES Y TRANSACCIONES

CURSORES
UNSCH/CMQE Pgina 4 de 8
Administracin de Base de Datos IS-443
Ingeniera de Sistemas

o Definicin
o Tipos
o Atributos
o Bucles
o Parmetros
EXCEPCIONES
CONTROL DE TRANSACCIONES()

CURSORES: Principal herramienta PL/SQL


- tiles para gestionar grandes cantidades de datos
- Est formado por un conjunto de registros devueltos por una instruccin SQL de tipo SELECT
- Son segmentos de memoria utilizados para realizar operaciones con las filas de datos
recuperados

CURSORES IMPLICITOS
- Son los visto hasta ahor con sentencias SELECTINTO
- Deben devolver una sola fina, sino devolver error

CURSORES EXPLICITOS
- Se utilizar si la sentencia SELECT devuelve varios registros
- Se define como cualquier otra variable y admiten parmetros (est en la zona declarativa)
- Operaciones Bsicas
o Declaracin: CURSOR <nombre_c> IS <Sent_Select>
o Apertura: OPEN <nombre_c>
o Rcogida: FETCH <nombre_c> INTO (<var>|<lista_v>)
o Cierre: CLOSE <nombre_c>

Crear un procedimiento que saque por consola un informe de todas las reservas penalizadas
CREATE OR REPLACE PROCEDURE Informe_Penalizados
AS
CURSOR c_pen IS
SELECT * FROM reserva
WHERE periodo='Devuelto Con penalizacin';
v_reg_reserva c_pen%ROWTYPE; -- se declara del mismo tipo que una fila del cursor
BEGIN
OPEN c_pen;
FETCH c_pen INTO v_reg_reserva;
WHILE c_pen%FOUND LOOP
DBMS_OUTPUT.PUT_LINE('el usuario con id'|| v_reg_reserva.id_usuario||'devolvio el
equipo'||v_reg_reserva.id||'con penalizacion');
FETCH c_pen INTO v_reg_reserva;
END LOOP;
UNSCH/CMQE Pgina 5 de 8
Administracin de Base de Datos IS-443
Ingeniera de Sistemas

CLOSE c_pen;
END;
/

Los atributos del cursor nos van a servir para controlar la ejecucin de un cursor explcito

PARA SIMPLIFICAR USO DE CURSORES TENEMOS CURSORES FOR LOOP

Crea un procedimiento que saque por consola un informe de todas las reservas que tiene un usuario que
se pasa por parmetro

CREATE OR REPLACE PROCEDURE Informe_Reservas(usr reserva.ID_Usuario%TYPE)


IS
CURSOR c_res IS
SELECT * FROM reserva
WHERE ID_Usuario=usr;
nom usuario.nombre%TYPE;
estado VARCHAR(30);
BEGIN
SELECT nombre INTO nom FROM usuario
WHERE ID_Usuario=usr;
DBMS_OUTPUT.PUT_LINE('Informe de reservas del usuario:' ||nom);
DBMS_OUTPUT.PUT_LINE('------------------------------------------');
FOR v_reg IN c_res LOOP
IF v_reg.fecha_fin IS NULL THEN
estado:= 'Pendiente de devolucin';
ELSE
estado:= v_reg.periodo;
END IF;
DBMS_OUTPUT.PUT_LINE(c_res%ROWCOUNT||'El equipo id'||v_reg.id||'est
en estado'||estado);
END LOOP;
DBMS_OUTPUT.PUT_LINE('fin del informe');
END;
/
UNSCH/CMQE Pgina 6 de 8
Administracin de Base de Datos IS-443
Ingeniera de Sistemas

Probar con datos;

UNSCH/CMQE Pgina 7 de 8
Administracin de Base de Datos IS-443
Ingeniera de Sistemas

CURSOR CON PARAMETROS (es ms genrico, ms flexible)


- Para generalizar su uso

Basndote en el inventrio, crea un procedimiento para mostrar un informe completo de las reservas de
todos los usuarios de la base de datos

UNSCH/CMQE Pgina 8 de 8

You might also like