BASE DE DATOS II

Breaking News

Comments

Social

domingo, 6 de mayo de 2018

Cursores






                    EQUIPO      :  Investigation Systems

             Estudiantes :  Aguilar Rafael Jaime
                                    Diaz Guerrero Imer Hobet

             CURSO       :  Base de Datos II

             TEMA          :  CURSORES


             DOCENTE  :  Marco Aurelio Porro Chulli





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

Cursores
    1.        Contenido
Ø  Definición
Estructura de control utilizada para el recorrido (y potencial procesamiento) de los registros del resultado de una consulta. Un cursor se utiliza para el procesamiento individual de las filas devueltas por el sistema gestor de base de datos para una consulta.
Es un elemento que representará a un conjunto de datos determinado por una consulta T-SQL, el cursor permitirá recorrer fila a fila, leer y eventualmente modificar dicho conjunto de resultados.
Las operaciones de una base de datos relacional actúan en un conjunto completo de filas. Por ejemplo, el conjunto de filas que devuelve una instrucción SELECT está compuesto por todas las filas que satisfacen las condiciones de la cláusula WHERE de la instrucción.
Este conjunto completo de filas que devuelve la instrucción se conoce como conjunto de resultados. Las aplicaciones, especialmente las aplicaciones interactivas en línea, no siempre trabajan de forma eficaz con el conjunto de resultados completo si lo toman como una unidad. Estas aplicaciones necesitan un mecanismo que trabaje con una fila o un pequeño bloque de filas cada vez. Los cursores son una extensión de los conjuntos de resultados que proporcionan dicho mecanismo.

Sintaxis
-- Declaración del cursor
DECLARE<nombre cursor _ >CURSOR
FOR
<sentencia sql _ >
-- apertura del cursor
OPEN <nombre cursor _ >
-- Lectura de la primera fila del cursor
FETCH <nombre cursor _ >INTO <lista variables _ >
WHILE (@@FETCH_STATUS=0)
BEGIN
-- Lectura de la siguiente fila de un cursor
FETCH <nombre cursor _ >INTO <lista variables _ >
...
END -- Fin del bucle WHILE
-- Cierra el cursor
CLOSE<nombre cursor _ >
-- Libera los recursos del cursor
DEALLOCATE<nombre cursor _ >

DECLARE cursor_name [ INSENSITIVE ] [ SCROLL ] CURSOR
FOR select_statement
[ FOR { READ ONLY | UPDATE [ OF column_name [ ,...n ] ] } ]
[;]
Transact-SQL Extended Syntax
DECLARE cursor_name CURSOR [ LOCAL | GLOBAL ]
[ FORWARD_ONLY | SCROLL ]
[ STATIC | KEYSET | DYNAMIC | FAST_FORWARD ]
[ READ_ONLY | SCROLL_LOCKS | OPTIMISTIC ]
[ TYPE_WARNING ]
FOR select_statement
[ FOR UPDATE [ OF column_name [ ,...n ] ] ]
[;]

Explicación
cursor_name
Es el nombre del cursor de servidor de Transact-SQL definido. cursor_name debe cumplir las reglas de los identificadores.
INSENSITIVE
Define un cursor que hace una copia temporal de los datos que utiliza. Todas las solicitudes que se realizan al cursor se responden desde esta tabla temporal de tempdb; por tanto, las modificaciones realizadas en las tablas base no se reflejan en los datos devueltos por las operaciones de captura realizadas en el cursor y además este cursor no admite modificaciones. Cuando se utiliza la sintaxis de ISO, si se omite INSENSITIVE, las eliminaciones y actualizaciones confirmadas realizadas en las tablas subyacentes (por cualquier usuario) se reflejan en capturas posteriores.

SCROLL
Especifica que están disponibles todas las opciones de captura (FIRST, LAST, PRIOR, NEXT, RELATIVE, ABSOLUTE). Si no se especifica SCROLL en una instrucción DECLARE CURSOR de ISO, la única opción de captura que se admite es NEXT. No es posible especificar SCROLL si se incluye también FAST_FORWARD.
select_statement
Es una instrucción SELECT estándar que define el conjunto de resultados del cursor. Las palabras clave FOR BROWSE e INTO no están permitidas en la instrucción select_statement de una declaración de cursor.
SQL Server convierte implícitamente el cursor en otro tipo si las cláusulas de la instrucción select_statement entran en conflicto con la funcionalidad del tipo de cursor solicitado.
READ ONLY
Evita que se efectúen actualizaciones a través de este cursor. No es posible hacer referencia al cursor en una cláusula WHERE CURRENT OF de una instrucción UPDATE o DELETE. Esta opción reemplaza la capacidad predeterminada de actualizar el cursor.
UPDATE [OF column_name [,...n]]
Define las columnas actualizables en el cursor. Si se especifica OF column_name [,...n], solo las columnas enumeradas admiten modificaciones. Si se especifica UPDATE sin indicar una lista de columnas, se pueden actualizar todas las columnas.
cursor_name
Es el nombre del cursor de servidor de Transact-SQL definido. cursor_name debe cumplir las reglas de los identificadores.
LOCAL
Especifica que el ámbito del cursor es local para el proceso por lotes, el procedimiento almacenado o el desencadenador en que se creó el cursor. El nombre del cursor solo es válido en este ámbito. Se puede hacer referencia al cursor mediante variables de cursor locales en el proceso por lotes, procedimiento almacenado o desencadenador, o en el parámetro OUTPUT de un procedimiento almacenado.
El parámetro OUTPUT se utiliza para devolver el cursor local al proceso por lotes, procedimiento almacenado o desencadenador que realiza la llamada, el cual puede asignar el parámetro a una variable de cursor para hacer referencia al cursor después de que el procedimiento almacenado finalice.
La asignación del cursor se cancela implícitamente cuando el proceso por lotes, procedimiento almacenado o desencadenador finaliza, a menos que el cursor se haya devuelto en un parámetro OUTPUT. En ese caso, la asignación del cursor se cancela cuando se cancela la asignación de la última variable que hace referencia al mismo o cuando ésta se sale del ámbito.
GLOBAL
Especifica que el ámbito del cursor es global para la conexión. Puede hacerse referencia al nombre del cursor en cualquier procedimiento almacenado o proceso por lotes que se ejecute en la conexión. La asignación del cursor solo se cancela implícitamente cuando se produce la desconexión.

Ø  Administración de Procedimientos Almacenados (Creación, Modificación y Eliminación)

Creación De Cursores

Declaración
El primer paso constará de la declaración del cursor, donde se indicarán (junto con el nombre del cursor) la consulta que el mismo representará y algunas otras características bastante interesantes.
Un ejemplo de declaración de cursor es el siguiente:
DECLARE ProdInfo CURSOR FOR SELECT Name FROM Production.Product
Donde ProdInfo representará al nombre del cursor y la sentencia “SELECT ProductNumber,Name FROM Production.Product” será el conjunto de datos del mismo.
Como comentamos previamente, es posible en este paso definir algunas características del comportamiento del cursor, por ejemplo la sentencia:
DECLARE ProdInfo CURSOR READ_ONLY FOR SELECT Name FROM Production.Product
Indicará que el cursor será de solo lectura, más adelante veremos en detalle las opciones disponibles, por el momento nuestro objetivo es crear un cursor lo más simple posible.
Apertura
La apertura del cursor ejecutará la consulta definida en el paso previo y cargará los datos en el mismo. La función OPEN de T-SQL permitirá efectuar esta terea, para continuar con el ejemplo previo la forma de abrir el cursor será la siguiente:
OPEN   ProdInfo
Recorrido del cursor y acceso a los datos
Este paso constará de recorrer los resultados del cursor, la instrucción FETCH permitirá 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 la sentencia:
FETCH NEXT FROM ProdInfo INTO @Description
Tomará la siguiente fila de resultados del cursor y lo alojará en la variable @Description.
Un detalle a comentar es que en la sentencia INTO (como puede verse en el ejemplo anterior) el mapeo entre columnas del cursor y variables se realizará implícitamente, asignándose la primera columna a la primera variable, la segunda columna a la segunda variable y así sucesivamente. Esto implica que deberán crearse tantas variables como columnas se definan en la declaración del cursor y las mismas deberán ubicarse en el mismo orden que se encuentran definidas las columnas en la sentencia SELECT de la declaración.
Como cada sentencia FETCH leerá un registro, una pregunta interesante que podríamos hacernos es, ¿de qué manera podremos saber si existe un próximo o previo registro, o si hemos llegado al límite (ya sea superior o inferior)?. La respuesta se encontrará en una variable de SQL Server llamada @@FETCH_STATUS que tomará el valor 0 si la lectura del registro ha sido correcta.
En este punto será también posible modificar o eliminar las filas que se van recorriendo, como veremos al final del artículo.

Cierre del cursor
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 y la sintaxis puede verse a continuación:
CLOSE  ProdInfo
Desalojo del cursor
Los cursores son objetos que se crean en memoria (por eso es importante utilizar la sentencia deallocate para desalojarlo de la memoria que utiliza SQL Server). Por ese motivo no los vas a poder encontrar en el object explorer.


Modificación
La instrucción UPDATE posicionada es, en su mayor parte, igual que una instrucción UPDATE regular, excepto que ésta requiere una cláusula especial WHERE, como se muestra en la siguiente sintaxis:
UPDATE <nombre de la tabla>
 SET <lista de conjunto>
 WHERE CURRENT OF <nombre del cursor>
Para actualizar los datos de un cursor debemos especificar FOR UPDATE despues de la sentencia SELECT en la declaración del cursor y WHERE CURRENT OF , en la sentencia UPDATE tal y como muestra el siguiente ejemplo .

-- Declaracion de variables para el cursor
DECLARE @ Id int,
@Nombre varchar(255),
@Apellido1 varchar(255),
@Apellido2 varchar(255),
@NifCif varchar(20),
@FxNacimiento datetime
-- Declaración del cursor
DECLARE cClientes CURSORFOR
SELECT Id,Nombre, 1 Apellido ,
Apellido2,NifCif, FxNacimiento
FROM CLIENTES
FOR UPDATE
-- Apertura del cursor
OPEN cClientes
-- Lectura de la primera fila del cursor
FETCH cClientes INTO @id, @Nombre, @ 1 Apellido , @ 2 Apellido , @NifCif, @FxNacimiento
WHILE (@@ _ FETCH STATUS = 0 )
BEGIN
UPDATE Clientes
SET 2 APELLIDO = isnull(@ 2 Apellido ,'')+ ' - ' Modificado
WHERE CURRENT OF cClientes
-- Lectura de la siguiente fila del cursor
FETCH cClientes
INTO @id, @Nombre, @ 1 Apellido , @ 2 Apellido ,
@NifCif, @FxNacimiento
END
-- Cierre del cursor
CLOSE cClientes
-- Liberar los recursos
DEALLOCATE cClientes

Eliminación
La instrucción DELETE posicionada, al igual que la instrucción UPDATE posicionada, requiere una cláusula WHERE que debe incluir la opción CURRENT OF. (Una instrucción DELETE regular, como puede recordarse, no requiere de una cláusula WHERE.) Una instrucción DELETE posicionada utiliza la siguiente sintaxis: DELETE WHERE CURRENT OF Como se puede ver, es necesario definir una cláusula DELETE que identifique a la tabla y una cláusula WHERE que identifique al cursor. La cláusula WHERE, en una instrucción DELETE posicionada, funciona de la misma manera que la cláusula WHERE en una instrucción UPDATE posicionada: la fila arrojada por la última instrucción FETCH es la fila que se modifica. En este caso, la fila es eliminada.
DECLARE wt_cursor CURSOR
DYNAMIC /*Or left blank but not STATIC or KEYSET*/
FOR
SELECT C
FROM @WorkingTable

OPEN wt_cursor;

FETCH NEXT FROM wt_cursor
INTO @C

DELETE FROM @WorkingTable

WHILE @@FETCH_STATUS = 0
BEGIN
    PRINT @C;


    FETCH NEXT FROM wt_cursor
    INTO @C;
END
CLOSE wt_cursor;
DEALLOCATE wt_cursor;


Ø  Ejemplos



Crear un cursor que permita visualizar los registros de la tabla TbCliente




DECLARE @COL1 CHAR(2),@COL2 VARCHAR(25),@COL3 VARCHAR(25),@COL4 VARCHAR(35)
DECLARE C_DPTO CURSOR FOR
SELECT D.CodDpto,D.NombreDpto,D.Capital,R.NombreRegion FROM TbDpto D INNER JOIN TbRegion R ON D.IdRegion=R.CodRegion
OPEN C_DPTO
FETCH NEXT FROM C_DPTO INTO @COL1,@COL2,@COL3,@COL4
WHILE @@FETCH_STATUS=0
BEGIN 
PRINT @COL1+' | '+@COL2+'| '+@COL3+' | '+@COL4
FETCH NEXT FROM C_DPTO INTO @COL1,@COL2,@COL3,@COL4
END
CLOSE C_DPTO
DEALLOCATE C_DPTO

    2.        Resumen
Un cursor se utiliza para el procesamiento individual de las filas devueltas por el sistema gestor de base de datos para una consulta. Es un elemento que representará a un conjunto de datos determinado por una consulta T-SQL, el cursor permitirá recorrer fila a fila, leer y eventualmente modificar dicho conjunto de resultados.
    3.        Summary
A cursor is used for the individual processing of the rows returned by the database manager system for a query. It is an element that will represent a set of data determined by a T-SQL query, the cursor will allow to go through row by row, read and eventually modify said set of results.
    4.        Recomendaciones
Ø  En SQL Server los cursores son muy lentos. Prácticamente nunca es recomendable y es bueno buscar otras alternativas de acuerdo a la necesidad.
Ø  Si la consulta es veloz y toma pocos segundos y no va a cambiar esa velocidad a medida que aumente el tamaño la base de datos (al menos no de forma repentina), se podría mantener los cursores.
Sin embargo, si usted cree que los datos que manejan los cursores van a aumentar a miles o peor a millones de filas, vale la pena reemplazar el cursor.
Ø  Los cursores en general son utilizados por gente que se siente cómodo con el manejo secuencial, pero el cursor en sí es lento. Bloquea datos y consume muchos recursos.
Si no tiene otra alternativa a cursores, recomendamos usar la opción FAST_FORWARD (si es aplicable) y READ_ONLY para optimizar los cursores.

    5.        Conclusiones
Ø  Los cursores son muy útiles sobre todo cuando no podemos tener todas las columnas que necesitamos en un solo SELECT. Si podemos tener a todas las columnas en un solo SELECT puede ser más práctico usar el comando SELECT … INTO.
Ø  Los cursores de SQL Server y cualquier otro tipo de cursores se remontan a antes de que los lenguajes de programación procedimentales pudieran manejar conjuntos de datos y requerían dividirlos en filas (por ejemplo, COBOL, FORTRAN, C de estilo antiguo, etc.).
Ø  Hay situaciones, no obstante, en las que necesariamente tendrán que ser usados, pero normalmente se usan en tareas administrativas donde lo que se prima no es el rendimiento.
    6.        Apreciación del Equipo

Ø  Si bien el uso de los cursores es una técnica poco recomendada por performance, es bueno considerar si tenemos que usarlos cuales son las mejores opciones de configuración para poder obtener los mejores tiempos de respuesta dentro de un cursor.
Ø  La mayoría de los lenguajes de programación de aplicación soportan el uso de cursores para recuperar datos de una base de datos SQL. El lenguaje del cursor está incrustado en el código de programación de una forma muy parecida a la que se incrustaría cualquier instrucción SQL.
Ø  Cuando se utiliza un cursor en un lenguaje de programación, primero se debe declarar el cursor (similar a como se declararía una variable) y luego utilizar el nombre de la instrucción (el nombre que se le asignó al cursor) en otras instrucciones SQL incrustadas para abrir el cursor, recuperar filas individuales a través del cursor y cerrar el cursor.
    7.        Glosario de Términos

ü  DECLARE CURSOR: Declara el cursor SQL al definir el nombre del cursor, sus características y una expresión de consulta que es invocada cuando se abre el cursor.
ü  OPEN: Abre el cursor e invoca la expresión de consulta, haciendo que los resultados de consulta estén disponibles para las instrucciones FETCH.
ü  FETCH: Recupera datos en las variables que pasan los datos al lenguaje de programación host o a otras instrucciones SQL incrustadas.
ü  CLOSE: Cierra el cursor. Una vez que el cursor es cerrado, no pueden recuperarse datos de los resultados de la consulta del cursor.
ü  ORDER BY: Permite clasificar los resultados de la consulta arrojados por la especificación de la consulta.
ü  SENSITIVE: Cambios significativos hechos por las instrucciones fuera del cursor afectan inmediatamente a los resultados de la consulta dentro del cursor.
ü  INSENSITIVE: Cambios significativos hechos por las instrucciones fuera del cursor no afectan a los resultados de la consulta dentro del cursor.
ü  ASENSITIVE: La sensibilidad del cursor es definida por la implementación. Los cambios significativos pueden o no ser captados dentro del cursor.
ü  FIRST: Recupera la primera fila de los resultados de la consulta del cursor, sin importar cuántas instrucciones FETCH hayan sido ejecutadas desde que se abrió el cursor.
ü  LAST: Recupera la última fila de los resultados de la consulta del cursor, sin importar cuántas instrucciones FETCH hayan sido ejecutadas desde que se abrió el cursor.

    8.        Bibliografía o Linkografía


LINK DE DIAPOSITIVAS


 VIDEOS DE CURSORES




























No hay comentarios :

Publicar un comentario

Designed By Published... James