Sunteți pe pagina 1din 5

CI-3315: Sistemas de Bases de Datos I Enero-Abril 2003

Pre-Taller IV

Pre-Taller IV
PL/SQL: Stored Procedures y Triggers
Para poder realizar los ejercicios de este pretaller debe eliminar sus tablas y ejecutar los
nuevos archivos de comandos "hoturca_schema2.sql" y "hoturca_load2.sql".
Se ha agregado una nueva tabla a la base de datos llamada HABITA_CIERRE. Esta tabla es
actualizada con los montos de los consumos totales realizados por una habitación en un día
dado.

Relación Atributos Descripción Atributo Comentarios

HABITA_CIERRE NUMERO Identificador de la Clave primaria:


habitación. NUMERO, Fecha
Claves foráneas:
Fecha Día en que se realiza el
NUMERO
corte.
referencia a la
Monto_Total Monto total de los relación HABITA
consumos realizados en la
habitación

Parte I. Stored Procedures

1. El objetivo de esta parte del pre-taller es iniciarse en la sintaxis de PL/SQL con el


propósito de escribir procedimientos almacenados que permitan realizar algunas operaciones
sobre la base de datos que no es posible expresar mediante el lenguaje SQL o que aunque
fuese posible expresar, es más eficiente implementarlos de esta forma. A continuación se
presentan las siguientes dos situaciones las cuales deben ser implementadas con
procedimientos almacenados:
1.1 El gerente del hotel requiere ejecutar un procedimiento que determine para las
habitaciones del hotel, cual es el consumo total de la misma en un día dado y que almacene
esta información en la tabla HABITA_CIERRE.
1.2 Asumiendo que la base de datos mantiene los datos de todas las reservaciones de las
habitaciones del hotel para un semestre y que una vez que se realiza una reservación se
asignan las respectivas habitaciones, determinar la categorización de una habitación con
respecto a los días que la misma ha sido reservada durante los primeros seis meses del año
2003. Esta categorización se realiza siguiendo la siguiente escala:
a) Si la habitación ha sido reservada al menos el 90% de los días, se considera que la
habitación es una habitación altamente asignada.
b) Si el porcentaje de días en los que la habitación ha sido reservada está en el rango
(90%,60%], se considera que la habitación es una habitación muy asignada.

2.IV-1
CI-3315: Sistemas de Bases de Datos I Enero-Abril 2003
Pre-Taller IV

c) Si el porcentaje de días en los que la habitación ha sido reservada está en el rango


(60%,30%], se considera que la habitación es una habitación medianamente asignada.
d) Si el porcentaje de días en los que la habitación ha sido reservada está en el rango
(30%,10%], se considera que la habitación es una habitación poco asignada.
e) Si la habitación ha sido reservada menos de un 10% de los días del año, se considera
que la habitación es una habitación pobremente asignada.
Para las situaciones anteriormente descritas, usted deberá estudiar la sintaxis y
semántica de procedimientos y funciones en SQL y determinar cómo las mismas pueden ser
implementadas. Con este fin, deberá estudiar los comandos del lenguaje de PL/SQL. Entre
los puntos a estudiar están: la declaración de variables, la definición y manipulación de
cursores, así como las estructuras de control del lenguaje. Finalmente, se requiere que usted
determine las diferencias con respecto al poder expresivo y eficiencia de evaluación de los
procedimientos y funciones con relación a los comandos de SQL que usted ha utilizado hasta
el momento.

En particular, usted deberá resolver los siguientes aspectos:


a) ¿Cómo se puede definir una variable que tenga el mismo tipo de datos que una columna
de una tabla?
b)¿Cuál es la diferencia entre los comandos "SELECT monto_total FROM habita_cierre;"
y "SELECT monto_total INTO vmonto FROM habita_cierre;"?
c) ¿Qué es un cursor? ¿Cómo se crea? ¿Puede un cursor ser parametrizado?
d) ¿Qué significan las operaciones OPEN, FETCH y CLOSE sobre cursores?
e) ¿Cómo se define la variable donde se van a almacenar los valores tomados de un
cursor?
f) ¿Qué significan los atributos de cursor: %NOTFOUND, %ROWCOUNT?
g) ¿Cómo se expresa una sentencia condicional en PL/SQL?
h) ¿Cuáles son las formas de expresar un ciclo en PL/SQL?
i) ¿Cómo se utilizan los ciclos para cursores en PL/SQL?
j) ¿Cómo se invocan las funciones y los procedimientos?

Para la aplicación 1.1 deberá elaborar un script "proc1.sql" para crear un procedimiento
realiza_cierre el cual recibe como parámetro fechaCierre, donde fechaCierre es el día
para el cual se calcula el cierre. El procedimiento realiza_cierre debe almacenar las
respectivas tuplas en la tabla HABITA_CIERRE. En caso que una habitación no tenga
consumo en ese día, el monto consumido debe ser 0.

Para la aplicación 1.2 deberá elaborar un script "func1.sql" para crear una función fclas_hab
que reciba como parámetro de entrada el identificador de la habitación, y retorne un string
con alguno de los valores: " habitación altamente asignada ", "habitación muy asignada",
"habitación medianamente asignada", "habitación poco asignada" o "habitación pobremente
asignada". El valor retornado corresponde a la clasificación de la habitación. Elabore
además un script "prueba-func1" para crear un procedimiento de prueba pclas_hab, con
parámetro NumHabitacion que invoque a la función fclas_hab y muestre en pantalla el string
retornado por la llamada a la función.

2.IV-2
CI-3315: Sistemas de Bases de Datos I Enero-Abril 2003
Pre-Taller IV

k) ¿Se podría implementar el requerimiento 1.1 o el 1.2 con algunos de los comandos de
SQL que ha estudiado en clase? Justifique su respuesta. En caso afirmativo, dé su
implementación en SQL. Puede hacer uso de vistas.

Considere las siguientes recomendaciones:


• Para generar salida en pantalla se utilizarán las siguientes instrucciones:
En SQLPlus:
o set serveroutput on; Activa la opción de mostrar el buffer de salida en
pantalla.
En PL/SQL:
o dbms_output.put(<salida>); Muestra <salida> en pantalla.
o dbms_output.put_line(<salida>); Muestra <salida> en pantalla y salta a
la próxima línea.
o dbms_output.new_line; Salta a la próxima línea

• Para verificar los errores de compilación de procedimientos y funciones utilice el


comando show errors.

Para probar la implementación de sus aplicaciones realice lo siguiente:


• Ejecute cada uno de los tres scripts: "proc1.sql", "func1.sql" y "prueba-func1.sql"
para crear los procedimientos y la función.
• Utilice el comando "SPOOL proc1.txt". Invoque al procedimiento chequea_cierre
utilizando el comando EXECUTE de SQLPlus con el día 19-JUN-2003. Consulte la
tabla HABITA_CIERRE para verificar sus resultados.
• Utilice el comando "SPOOL func1.txt" . Invoque al procedimiento pclas_hab con los
siguientes valores para el parámetro NumHabitación: "A001", "A002", "A003".

Parte II. Triggers

El objetivo de parte del pre-taller es entender la noción de "trigger" e iniciarse en la


sintaxis de SQL para especificar "triggers". Un "trigger" (disparador) consiste de tres
partes: un evento, una condición y una acción. El evento es algo que ocurre sobre los datos
que están almacenados en una base de datos, la condición describe la situación que se debe
cumplir una vez que se da el evento y la acción es lo que ejecuta el "trigger" cuando ocurre el
evento y si se cumple la condición. La condición es opcional, pero todo "trigger" debe tener la
especificación de un evento y de una acción. El manejador de base de datos que provea el
mecanismo de los "triggers", debe tener un lenguaje para especificar los tres componentes,
también debe tener una forma de detectar cuando ocurre un evento sobre los datos, luego
verifica la condición y finalmente ejecuta las acciones especificadas. Entre las aplicaciones
de los triggers están: garantizar el cumplimiento de las restricciones de integridad que
caracterizan a los datos, implementación de bases de datos activas y mantenimiento de
vistas materializadas.

Antes de usar los "triggers", se requiere que usted entienda los siguientes puntos:
a) ¿Cuáles son los tipos de eventos en los que puede activarse un "trigger"?

2.IV-3
CI-3315: Sistemas de Bases de Datos I Enero-Abril 2003
Pre-Taller IV

b) Los "trigger" permiten indicar el orden de ejecución del código asociado a un "trigger"
con respecto a la operación que dio pié al evento que lo disparó. ¿Cuáles son los tres
posibles órdenes que pueden establecerse?
c) En un "trigger", ¿ Para qué sirven las "variables mágicas" old y new ?. ¿ Para cuáles
operaciones tiene sentido la variable old y para cuáles la variable new?. ¿A través de qué
cláusula puede cambiarse el nombre de las variables mágicas new y old?
d) ¿Qué diferencia existe entre un "trigger" a nivel de filas (definidos utilizando la cláusula
FOR EACH ROW) y un "trigger" a nivel de tabla (aquel definido sin utilizar la cláusula
FOR EACH ROW)?
e) ¿Para que sirve la cláusula WHEN? Es aplicable para "triggers" a nivel de filas? Es
aplicable para "triggers" a nivel de tablas?
f) ¿Qué utilidad le encuentra a los predicados INSERTING, DELETING y UPDATING?
¿Qué relación existe entre estos predicados y los posibles eventos que pueden disparar
la ejecución de un "trigger"?
g) ¿Cómo se pueden habilitar y deshabilitar los "triggers"?
h) ¿Qué es una tabla mutante?

Como se dijo anteriormente, la implementación de Restricciones de Integridad, es un uso


común que se da a los "triggers". Suponga que se modifica el esquema de Hoturca y sólo se
permite asignar una habitación por reservación. Haciendo uso de los "triggers" de Oracle, se
requiere que usted implemente las siguientes restricciones de integridad :
2.1 Si se asigna un consumo a una reservación y a una habitación en una fecha dada,
entonces dicha fecha está en el período en el que fué asignada la habitación a la reservación.
2.2 El número de personas asignadas a una reservación corresponde a la suma del total
de adultos y niños que están alojados en la habitación asignada a la reservación.
Opcional: Piense cómo se implementaría el trigger si se asignaran varias habitaciones por
reservación.

Otro uso de los "triggers" es la implentación de propiedades dinámicas de los datos. Se


requiere que implemente la siguiente situación haciendo uso de triggers:
2.3 Cuando se realiza una reservación, se crea un registro en la tabla ASIGNA para dicha
reservación. Se asigna la habitación “D001” a la reservación, y se asume por defecto que el
número de adultos en la habitación corresponderá al número total de personas en la
reservación.
Tanto para la implementación de las restricciones de integridad como para la
implementación de la propiedad dinámica, usted deberá responder las siguientes preguntas
para cada "trigger":
i) ¿Cuál (cuáles) serían los eventos que ocasionan la ejecución del "trigger".
j) ¿Estaría el "trigger" definido a nivel de filas o a nivel de tabla?.
k) ¿Es necesario definir alguna condición que deba ser cumplida por las filas para que se
aplique el "trigger" sobre ella?
l) ¿Qué acción debería ejecutar el "trigger"?

Implemente los triggers correspondientes utilizando la sintaxis de creación de "triggers" del


SQL de ORACLE.

2.IV-4
CI-3315: Sistemas de Bases de Datos I Enero-Abril 2003
Pre-Taller IV

• Para las restricciones de integridad (2.1 y 2.2), cree un archivo “trig1.sql” con la
especificación de los triggers requeridos para implementarlas. Para verificar su
funcionamiento utilice el comando "SPOOL trig1.txt" y realice las siguientes inserciones
en la base de datos:
§ INSERT INTO ASIGNA VALUES('D006','R027',1,1);
§ ALTER SESSION SET NLS_DATE_FORMAT = 'DD-MON-YY
HH:MIAM';
§ INSERT INTO CONSUMO VALUES('D006', 'R027', 'S005', 'C',
200000.00, '14-JUN-03 9:00am','G001');

• Para la propiedad dinámica (2.3), cree un archivo "trig2.sql" con la creación de los
triggers. Para verificar el funcionamiento de los triggers utilice el comando "SPOOL
trig2.txt". Siga los siguientes pasos:
• Realice la siguiente inserción en la base de datos:
§ INSERT INTO RESERVA VALUES ( 'R040', '27-JUN-03', '30-JUN
03','V999999','JOSE PEREZ', 2);
Explique qué ocurre.
• Deshabilite los triggers implementados para la restricción de integridad 2.2, e
inserte la tupla:
§ INSERT INTO RESERVA VALUES ( 'R041', '25-JUN-03', '30-JUN-
03','V333333','JOSE PEREZ', 2);
Consulte las modificaciones en la tabla ASIGNA para las reservaciones
R040 y R041. Explique qué ocurre.

SOBRE LA ENTREGA DEL PRE-TALLER:


• Los archivos deben estar en un directorio de un diskette que contenga un archivo
llamado GRUPO-XX.txt donde XX corresponde al número de su grupo. El contenido
de este archivo debe ser el nombre y carnet de los integrantes del equipo.
• Debe entregar los archivos proc1.sql, func1.sql, prueba-func1.sql, trig1.sql, trig2.sql
y los archivos SPOOL especificados anteriormente.
• Debe entregar copia impresa de todas las preguntas de este Pre-Taller.
• La presentación del Pre-Taller es indispensable para tener derecho a presentar el
Taller correspondiente. Su entrega debe realizarse antes del inicio del Taller.

2.IV-5

S-ar putea să vă placă și