Universidad Tecnológica de Panamá
Facultad de Ingeniería de Sistemas Computacionales
BASE DE DATOS II
Laboratorio N°6
Facilitador: Ing. Víctor A. Fuentes T.
A. TÍTULO DE LA EXPERIENCIA
Laboratorio N°6. Programación de Funciones, Vistas y Cursores
B. TEMAS
6.1 Creación de cursores
6.1.1 Extracción de datos por medio de cursores
6.1.2 Variables de cursor
6.1.3 Declaración
6.1.4 Apertura de una variable para una consulta
6.1.5 Cierre de una variable tipo cursor
6.2 Creación de funciones
6.2.1 Tipos de funciones creadas por el usuario
6.2.2 Excepciones
6.3. Creación de Vistas
6.3.1 Definiciones y conceptos
6.3.2 Creación de vistas
6.3.3 Actualización por medio de vistas
C. OBJETIVO(S)
Implementar cursores como objeto de la base de datos para recorrer tablas y realizar
cálculos internos mediante programación.
Utilizar el lenguaje de programación Transact SQL en la implementación de
funciones definidas por el usuario, vistas y cursores.
Probar la ejecución y combinación de objetos de base de datos como
procedimientos, vistas, cursores, funciones y variables.
D. METODOLOGÍA
Para presentar el informe de los resultados obtenidos, lea las indicaciones que se proveen en
la presente guía de laboratorio y utilice los elementos gráficos y explicativos necesarios para
justificar sus respuestas. Realice las capturas de pantalla desde el SQL Server cuando
aplique. Si se solicita que muestre el código utilizado, copie el mismo en
formato de texto (no como imagen).
1
Coloque los resultados de las preguntas en la sección G (RESULTADOS) de
esta guía, según el número mostrado en la sección E (PROCEDIMIENTO). Las preguntas
que debe contestar siempre aparecen en la guía con el color verde.
Cuando sea necesario, Corte y sólo presente el área de trabajo donde aparece el
resultado obtenido de sus consultas, no incluya el explorador de objetos, el
menú de opciones ni la barra de herramientas estándar en su respuesta final.
E. PROCEDIMIENTO O ENUNCIADO DE LA EXPERIENCIA: (todo lo indicado en color
verde corresponden a acciones que usted deberá ejecutar, lo negro indica cómo lograr
hacerlo.)
VISTAS
Una vista es una alternativa para mostrar datos de varias tablas. Se considera como una tabla
virtual que almacena una consulta. Los datos no están almacenados en la base de datos como un
objeto. Una vista suele llamarse también tabla virtual porque los resultados que retorna y la
manera de referenciarlas es la misma que para una tabla.
Las vistas se crean en la base de datos activa. Al crear una vista, SQL Server verifica que existan
las tablas a las que se hacen referencia en ella. Se aconseja probar la sentencia "select" con la
cual trabajará la vista antes de crearla para asegurarse que el resultado que retorna es el
imaginado.
Sintaxis básica para crear una vista : create
view NOMBREVISTA as
SELECT sentencias
from TABLA
El contenido de una vista se muestra con un "select":
select * from NOMBREVISTA
Observe la siguiente vista que se crea en la base de datos Pubs y su respectiva ejecución:
create view Empleados_Basico as
select e.fname Nombre, e.lname Apellido, j.job_desc 'Descripción
Puesto'
from employee as e
join jobs as j
on e.job_id = j.job_id
select * from Empleados_Basico
1. Cree una vista usando la BD Pubs en donde se muestre el nombre y apellido del autor, el
nombre del libro del mismo, así como el nombre de la editorial que publica los libros. Muestre el
script y el resultado del llamado de la vista.
Si se modifican los datos de una vista, se modifica la tabla base. Se puede insertar, actualizar o
eliminar datos de una tabla a través de una vista, teniendo en cuenta lo siguiente:
No pueden afectar a más de una tabla consultada.
Pueden modificarse datos de una vista que combina varias tablas pero la modificación
solamente debe afectar a una sola tabla.
No se pueden cambiar los campos resultado de un cálculo.
Pueden generar errores si afectan a campos a las que la vista no hace referencia. Para
eliminar datos de una vista solamente una tabla puede ser listada en el "from" de la
definición de la misma.
Observe los siguientes ejemplos en la BD Northwind:
Actualizamos un dato contenido en la tabla empleado, pero a través de la vista:
create view V_Informacion_Libros as
select A.au_fname AS "Nombre",
a.au_lname as "Apellidos",
t.title as "titulo",
p.pub_name as "Editorial"
from authors as A
inner join titleauthor as ta on
A.au_id = TA.au_id
inner join titles as t on
TA.title_id = T.title_id
inner join publishers as p on
p.pub_id = t.pub_id
select * from V_Informacion_Libros
2. Realice una actualización a la tabla Employee a través de la vista creada en el problema
anterior. Cambie el apellido de la empleada Anabela Domingues por ‘Domínguez’ usando la
vista. Luego muestre el resultado llamando nuevamente a la vista creada anteriormente. Muestre
sus pasos y resultados.
1. UPDATE UPDATE employee
SET lname = 'Dominguez'
WHERE emp_id = 'ARD36773F';
2. CREACION DE VISTA create view v_employee_complete as
select fname as "Nombre",
lname as "Apellido"
from employee
3. LLAMADA A LA VISTA select * from v_employee_complete;
4. CAPTURA
FUNCIONES
SQL Server admite 3 tipos de funciones definidas por el usuario, clasificadas según el valor
retornado:
Escalares, retornan un valor escalar;
De tabla con varias instrucciones (retornan una tabla), y
De tabla en línea (retornan una tabla).
Función Escalar:
Una función escalar retorna un único valor. Como todas las funciones, se crean con la
instrucción "create function". La sintaxis básica es:
create function NOMBRE
(@PARAMETRO TIPO=VALORPORDEFECTO)
returns TIPO
begin
INSTRUCCIONES
return VALOR
end
Luego del nombre se colocan (opcionalmente) los parámetros de entrada con su tipo. La cláusula
"returns" indica el tipo de dato retornado. El cuerpo de la función, se define en un bloque
"begin...end" que contiene las instrucciones que retornan el valor.
Observe la creación de una simple función escalar denominada "f_promedio" que recibe 2
valores y retorna el promedio:
create function f_promedio --Parámetros de entrada con su tipo
(@valor1 decimal (4,2),
@valor2 decimal (4,2)
)
returns decimal (6,2) --Tipo de dato del valor a
retornar as
begin
declare @resultado decimal(6,2) --Declaración de variable a
retornar
set @resultado=(@valor1+@valor2)/2
return @resultado --Variable a retornar
end;
select dbo.f_promedio(5.5,8.5) --Ejecución de la función
3. Cree una función escalar usando la base de datos pubs que permita obtener el subtotal de un
pedido de determinado libro y el total luego de sumarle el 7%, usando como parámetros de
entrada el title_id y la cantidad de libros a comprar. Por ejemplo, si el cliente desea el libro con
id PC1035 y la cantidad de 5, se debe obtener como subtotal
114.75 y como total 122.78. El último valor es el que se retorna como resultado de la función.
1. Creacion de funcion create function f_factura
(@Id_titulo VARCHAR(6),
@cantidad int
)
returns VARCHAR(50)
as
begin
declare @resultado VARCHAR(150)
declare @precio decimal(10,2)
select @precio=price*@cantidad from
titles
where title_id = @Id_titulo
set @resultado = '|SubTotal '+
cast(@precio as VARCHAR (10))+'| Total '+
cast(@precio+@precio*0.07 as VARCHAR
(10))
return @resultado
end;
2. Resultado
CURSORES
En SQL Server, un cursor puede definirse como un elemento que permite recorrer fila a fila, leer
y eventualmente modificar dicho conjunto de resultados.
Es una variable que permite recorrer un conjunto de resultados obtenidos a partir de una consulta
SELECT fila por fila. SQL Server ofrece una amplia variedad de opciones y de funciones para
crear y operar sobre cursores.
La creación y utilización de un cursor estará compuesta por:
a. Creación del cursor
b. Apertura
c. Acceso a datos
d. Cierre del cursor
e. Desalojo de memoria
Para crear el cursor, se indicarán (junto con el nombre del cursor) la consulta que el mismo
representará y algunas otras características.
DECLARE cursor_name CURSOR [ LOCAL | GLOBAL ] -- ALCANCE
[ FORWARD_ONLY | SCROLL ] --OPCIONES DE MOVIMIENTO
[ STATIC | KEYSET | DYNAMIC | FAST_FORWARD ] --TIPO DE CURSOR [
READ_ONLY | SCROLL_LOCKS | OPTIMISTIC ] --TIPO DE BLOQUEO
[ TYPE_WARNING ]
FOR select_statement
[ FOR UPDATE [ OF column_name [ ,...n ] ] ]
Tipos de cursores:
STATIC: Toma una instantánea de los datos especificados por su sentencia SELECT y
los almacena en la base de datos tempdb. Son siempre de SOLO LECTURA.
KEYSET: Copia en tempDB solo las columnas necesarias para identificar de forma única
cada fila. Para poder usarla, las tablas indicadas en el select, deben tener un índice.
Pueden ser modificables o de solo lectura.
DYNAMIC: Se comporta como si se ejecutara la sentencia Select, cada vez que se hace
referencia a una fila. No permite el order by a menos que la tabla tenga un índice.
FIREHOSE: Forma optimizada de cursor de solo lectura, solo hacia adelante. Se declara
utilizando Fast_Forward
La apertura del cursor se usará la sentencia OPEN. Para el recorrido del cursor, se usa la
instrucción FETCH que permite efectuar dicha operación. Las filas leídas podrán copiarse a
variables utilizando la sentencia INTO en combinación con la sentencia FETCH, por ejemplo:
DECLARE @Description AS varchar(400)
DECLARE ejemplo1 CURSOR
FOR SELECT Description FROM Categories
OPEN ejemplo1
FETCH NEXT FROM ejemplo1 INTO @Description
En el ejemplo anterior, se tomará la siguiente fila de resultados del cursor y lo alojará en la
variable @Description.
Recorrido y acceso del cursor y datos:
FETCH
[ [ NEXT | PRIOR | FIRST | LAST
| ABSOLUTE { n | @nvar }
| RELATIVE { n | @nvar }
]
FROM
]
{ { [ GLOBAL ] cursor_name } | @cursor_variable_name }
[ INTO @variable_name [ ,...n ] ]
En el cierre del cursor se liberarán los registros tomados por el mismo. Una vez que el cursor es
cerrado ya no podrá recorrerse el conjunto de resultados hasta que el mismo sea reabierto, la
sentencia CLOSE cerrará un cursor abierto.
CLOSE nombre_cursor
El último paso es el desalojo del cursor. Este paso eliminará la referencia al cursor definido
previamente, por lo que ya no será posible realizar una reapertura del mismo, en este caso la
sintaxis será:
DEALLOCATE nombre_cursor
4. Utilizando cursor, imprima todas las
ordenes realizadas por año y el monto al
que asciende cada una. Los datos aparecen
en la base de datos Northwind en las tablas
Orders y Order Details.
DECLARE cursor_nw_order CURSOR
FOR SELECT * FROM Orders
DECLARE cursor_nw_order_details
CURSOR
FOR SELECT * FROM [Order Details]
Open cursor
OPEN cursor_nw_order;
OPEN cursor_nw_order_details;
Como muestran las imágenes, las ordenes
deben listarse clasificadas por año. Se
listará el número de la orden (orderID) y el
monto de dicha orden
(usar campo cantidad y precio unitario para calcular este monto).
Al final de cada año, colocar a cuánto asciende el monto anual. Se desea que después de listar
todas las órdenes del primer año, se listen las del segundo año y así sucesivamente. Muestre el
script realizado y los resultados obtenidos.
5. Ahora modifique su cursor para que liste las órdenes realizadas anualmente, pero un empleado
en particular. El código del empleado es recibido como parámetro de entrada en un
procedimiento. (El procedimiento que creará maneja los datos a través del cursor, por lo que el
cursor es parte del cuerpo del procedimiento) Una vez creado su procedimiento, pruebe el mismo
enviando el código de empleado 5.
F. RESULTADOS
Coloque en esta sección los resultados de cada uno de los problemas propuestos. Recuerde
colocar los scripts en formato de texto y las evidencias en formato imagen.
G. CONSIDERACIONES FINALES:
Indique en esta sección si considera o no que el laboratorio cumplió su objetivo.
H. BIBLIOGRAFÍA:
Material del curso Base de Datos II
Video de la clase en Teams
Presentaciones del capítulo V del curso Base de Datos II
I. RÚBRICA:
Valor 100 puntos.