BD2 - Guia 2
BD2 - Guia 2
BD2 - Guia 2
FACULTAD DE INGENIERÍA
PROGRAMA: ASIGNATURA:
GUÍA No. 2
TECNOLOGÍA EN SISTEMAS BASE DATOS 2
BLOQUES ANONIMOS - PARTE II
OBJETIVOS:
Los bloques anónimos manejados en esta guía no abordan anidamiento de bloques. Este tema
se tratará en una guía posterior.
Esta guía se puede desarrollar en dos sesiones de clase y se pretende que al finalizar el
estudiante sea capaz de:
Construir bloques anónimos en los cuales se utilizan variables con el atributo %TYPE y
variables RECORD.
Codificar bloques anónimos en los cuales se utilizan sentencias SQL como SELECT,
INSERT.
CONCEPTOS PREVIOS
Unidades Léxicas
Estructura de un bloque PL/SQL.
Declaraciones de variables y tipos PL/SQL
Expresiones y operadores.
Estructuras de control PL/SQL.
Registros PL/SQL: RECORD.
RECURSOS
1. Libro guía: URMAN, Scott. “ORACLE 8: Programación PL/SQL”. España 1998. Capítulo 2: El
bloque PL/SQL; Unidades Léxicas: identificadores, delimitadores, Literales y Comentarios;
Declaraciones de variables: sintaxis e inicialización; Tipos PL/SQL: escalares, de referencia;
Expresiones y operadores. Capítulo 3: registros PL/SQL.
2. SQL*Plus instalada en los PC’s de las salas del laboratorio de sistemas. Se puede trabajar con
la versión oficial o la versión express de Oracle, no obstante se presentan algunas diferencias,
porque existen algunos comandos que no se aceptan en la versión express.
RECOMENDACIONES
Un bloque PL/SQL se puede crear desde la línea de comandos o desde un archivo ejecutable.
Desde la línea de comandos se inicia su escritura y una vez se finaliza (terminando con ; ó /) se
ejecuta de manera automática. Usando un archivo ejecutable (un archivo .sql) en el cual se
escribe el código y posteriormente se ejecuta el archivo (usando el comando START). Esta última
técnica será la utilizada en esta práctica.
Si va a ejecutar el código de los programas que se encuentran en esta guía copiando el código
tenga en cuenta que esta operación puede ocasionar cambios en algunos símbolos como es el
caso de la comilla simple, para eliminar este error se deberá editar el código y cambiar por la
usada en el editor respectivo (se trata de una comilla que no tiene cola).
En muchas situaciones las variables PL/SQL manipulan datos almacenados en una tabla de la base
de datos, y se requiere que la variable tenga el mismo tipo que la columna de la tabla, sin importar los
diferentes cambios de tipo que tenga la columna: se usa entonces un atributo %TYPE.
Cuando el atributo %TYPE se añade a una referencia a una columna de tabla o a cualquier otra
variable, devuelve el tipo de la misma, no obstante no involucra la restricción de obligatoriedad de la
columna (NOT NULL). La sintaxis se puede observar en el cuadro 1.
Recordar:
Los tipos de datos en PL/SQL como se mencionó en secciones previas posee una clasificación
denominada tipos compuestos (consta de una serie de componentes).Los tipos compuestos son
definidos por el usuario, y para poder utilizarlos se requieren tres pasos: la definición, la declaración
de la variable y acceso a su contenido.
En PL/SQL se dispone de tres tipos compuestos: RECORD (el cual abordaremos en esta sección),
TABLE y VARRAYS.
La definición del tipo RECORD incluye asignarle un identificador al nuevo tipo (se antepone reg como
indicador del tipo de dato) y listar los campos que van conforman el record: TYPE reg_nombre IS
RECORD(listado campos).
Cuadro 2. Definición del record para almacenar los datos de la cita y del médico
TYPE reg_cita IS RECORD
(
fecha_cita Citas.fecha%TYPE,
hora_cita Citas.hora%TYPE,
nombre_medico Medicos.nombres%TYPE,
apellido_medico Medicos.apellidos%TYPE
);
2
Institución Universitaria Antonio José Camacho Facultad de Ingeniería: Tecnología en Sistemas
Base de Datos 2 – Práctica. Guía No.2 (Ver. 12 Julio 2010) Ing. Sandra Lucía Guañarita Fernández
La declaración de la variable involucra asignarle nombre a la variable y definirla del tipo record
definido: v_nombre reg_nombre.
Acceder al contenido del record involucra una instrucción que consta de tres partes: el nombre de la
variable record seguida de un punto y el nombre del campo al cual se desea acceder.
Al usar sentencia SELECT se puede obtener como respuesta: una única fila, varias filas o ninguna fila.
En cada una de las situaciones anteriores se requiere un manejo especial para el programa. En el
caso presentado (cuadro 7) se tiene una sentencia que puede dar origen a una única fila o ninguna
fila, situación que me permite incorporar la sentencia a la sección ejecutable, requiriendo entonces
agregar a la sentencia SELECT la cláusula INTO seguida del nombre de la(s) variables(s) que
almacenaran los datos resultantes de la consulta.
Ejemplo:
Escribir un bloque anónimo que permite simular una interfaz de usuario a través de la cual se ingresa
el número de identificación de un médico y se muestra en pantalla su nombre completo.
En este caso para declarar las variables de la identificación, nombre y apellido del médico se requiere
el uso del atributo %TYPE porque permite manipular datos almacenados en una base de datos
asignando el mismo tipo que la columna de la tabla. El usar este tipo referenciado de columna el tipo
de la variable se determina cada vez que se ejecuta el bloque.
Cuadro 5. Bloque anónimo usando sentencia SELECT retorno fila única sin excepción
DECLARE
v_num_ide Medicos.num_identificacion%TYPE;
v_nombres Medicos.nombres%TYPE;
v_apellidos Medicos.apellidos%TYPE;
BEGIN
v_num_ide := '&NumeroIdentificacionMedico';
SELECT nombres, apellidos
INTO v_nombres, v_apellidos
FROM Medicos
WHERE num_identificacion = v_num_ide;
DBMS_OUTPUT.PUT_LINE('El nombre del médico ' || v_num_ide ||' es '||v_nombres||' '||
v_apellidos);
END;
3
Institución Universitaria Antonio José Camacho Facultad de Ingeniería: Tecnología en Sistemas
Base de Datos 2 – Práctica. Guía No.2 (Ver. 12 Julio 2010) Ing. Sandra Lucía Guañarita Fernández
En la sentencia SELECT del cuadro anterior cuando el número de identificación ingresado no retorna
filas se origina el error ORA-01403: no data found al ejecutar el bloque. Para eliminar este error se
incorpora una excepción del tipo NO_DATA_FOUND a través de la sección EXCEPTION como se
muestra a continuación.
Cuadro 6. Bloque anónimo usando sentencia SELECT retorno fila única y excepción asociada
DECLARE
v_num_ide Medicos.num_identificacion%TYPE;
v_nombres Medicos.nombres%TYPE;
v_apellidos Medicos.apellidos%TYPE;
BEGIN
v_num_ide := '&NumeroIdentificacionMedico';
SELECT nombres, apellidos
INTO v_nombres, v_apellidos
FROM Medicos
WHERE num_identificacion = v_num_ide;
DBMS_OUTPUT.PUT_LINE('El nombre del médico ‘||v_num_ide||' es '||v_nombres||' '||
v_apellidos);
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE(‘El médico identificado como ' ||v_num_ide ||‘ no existe. ');
END;
Recordar:
1) EXCEPTION : inicio de la sección de excepciones.
2) WHEN : indica que a continuación se definirá una excepción
3) NO_DATA_FOUND : nombre de la excepción. En este caso es una excepción
predefinida.
Ejemplo:
Escribir un bloque anónimo que permite simular una interfaz de usuario para mostrar el número de
piso de un consultorio o insertarlo si el consultorio no existe.
SELECT COUNT(numero)
INTO v_existe
FROM Consultorios
WHERE numero = v_numero;
IF v_existe = 0 THEN
v_num_piso := ‘&NumeroPiso’;
INSERT INTO Consultorios VALUES (v_numero, v_num_piso);
ELSE
SELECT piso_nro
INTO v_num_piso
FROM Consultorios
WHERE numero = v_numero;
4
Institución Universitaria Antonio José Camacho Facultad de Ingeniería: Tecnología en Sistemas
Base de Datos 2 – Práctica. Guía No.2 (Ver. 12 Julio 2010) Ing. Sandra Lucía Guañarita Fernández
Ejemplo:
Considere un bloque PL/SQL que simula una interfaz de usuario orientada al manejo de la
autenticación de un usuario. Considere una tabla USUARIOS con las columnas: login, contrasena,
fecha_asignacion, fecha_vencimiento, estado. No se guarda histórico de contraseñas.
El usuario puede ingresar sus datos hasta tres veces. Cuando se equivoca en su contraseña debe
generar el mensaje indicando la situación. Si en la tercera ocasión no ingresa correctamente la
contraseña deberá bloquear el usuario.
SELECT COUNT(login)
INTO v_existe
FROM Usuarios
WHERE login = v_login AND contrasena = v_contrasena;
END;
Escribir un bloque anónimo que permite simular una interfaz de usuario a través de la cual se ingresa
el número de identificación de un médico y se muestra en pantalla su nombre completo y la
descripción de su especialidad. Este ejercicio está orientado a mostrar una consulta con varias tablas.
Cuadro 9. Bloque anónimo usando sentencia SELECT con varias tablas retorno fila única
DECLARE
v_num_ide Medicos.num_identificacion%TYPE;
v_nombres Medicos.nombres%TYPE;
v_apellidos Medicos.apellidos%TYPE;
5
Institución Universitaria Antonio José Camacho Facultad de Ingeniería: Tecnología en Sistemas
Base de Datos 2 – Práctica. Guía No.2 (Ver. 12 Julio 2010) Ing. Sandra Lucía Guañarita Fernández
v_describe_especialidad Especialidades.descripcion%TYPE ;
BEGIN
v_num_ide := '&NumeroIdentificacionMedico';
SELECT nombres, apellidos, descripcion
INTO v_nombres, v_apellidos, v_describe
FROM Medicos, Especialidades
WHERE num_identificacion = v_num_ide
AND cod_especialidad = especialidad;
DBMS_OUTPUT.PUT_LINE('El nombre del médico ‘||v_num_ide||' es '||v_nombres||' '||
v_apellidos||' especialista '|| v_describe);
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE(‘El médico identificado como ‘||v_num_ide ||’ no existe.”);
END;
Ejemplo:
Escribir un bloque anónimo que permite simular una interfaz de usuario a través de la cual se ingresa
la referencia de una cita y se muestra en pantalla los datos de la cita (fecha y hora), el nombre
completo del médico. Este ejercicio está orientado a mostrar el uso del tipo compuesto RECORD.
Cuadro 10. Bloque anónimo usando sentencia SELECT retorno fila única y tipo record
DECLARE
v_referencia Citas.referencia%TYPE;
v_info_cita reg_cita;
BEGIN
v_referencia := '&NumeroCita';
SENTENCIA INSERT
Además de la sentencia SELECT en un bloque PL/SQL se pueden utilizar otras sentencias de manejo
de datos como INSERT o UPDATE, siempre controlando las posibles excepciones generadas.
6
Institución Universitaria Antonio José Camacho Facultad de Ingeniería: Tecnología en Sistemas
Base de Datos 2 – Práctica. Guía No.2 (Ver. 12 Julio 2010) Ing. Sandra Lucía Guañarita Fernández
Ejemplo:
Escribir un bloque anónimo que permite simular una interfaz de usuario para ingresar un nuevo
consultorio. Utilizar variables con el atributo %TYPE.
Ejemplo:
Considere un bloque PL/SQL que permita capturar e insertar el detalle de una reserva de hotel. La
reserva pude incluir varias habitaciones. La reserva de cada habitación se almacena en la tabla
DETALLE_RESERVAS: num_reserva, num_habitación, días_ocupacion, nombre_ocupante,
nombre_encargado. No considerar validación de disponibilidad.
Cuadro 12. Bloque anónimo usando estructuras de control bucle LOOP… END LOOP
DECLARE
v_num_reserva Reservas.numero%TYPE;
v_qhab NUMBER;
v_contador NUMBER := 0; --se inicializa la variable v_contador
v_num_hab Detalles_reservas.num_habitacion%TYPE;
v_dias Detalles_reservas.dias_ocupacion%TYPE;
v_ocupante Detalles_reservas.nombre_ocupante%TYPE;
v_encargado Detalles_reservas.nombre_encargado%TYPE;
BEGIN
v_num_reserva := ‘&NumeroReserva’;
v_qhab := ‘&CantidadHabitaciones’;