AnteriorPosterior

14. Cursores

  Curso: Curso de SQL, por Claudio Casares

Cursores


[Curso de SQL - Por Claudio Casares]

En algunos SGDB es posible la abertura de cursores de datos desde el propio entorno de trabajo, para ello se utilizan, normalmente procedimientos almacenados. La sintaxis para definir un cursor es la siguiente:


DECLARE
nombre-cursor
FOR
especificacion-consulta
[ORDER BY]

Por ejemplo:

DECLARE
Mi_Cursor
FOR
SELECT num_emp, nombre, puesto, salario
FROM empleados
WHERE num_dept = 'informatica'

Este comando es meramente declarativo, simplemente especifica las filas y columnas que se van a recuperar. La consulta se ejecuta cuando se abre o se activa el cursor. La cláusula [ORDER BY] es opcional y especifica una ordenación para las filas del cursor; si no se especifica, la ordenación de las filas es definida el gestor de SGBD.

Para abrir o activar un cursor se utiliza el comando OPEN del SQL, la sintaxis en la siguiente:


OPEN
nombre-cursor
[USING lista-variables]

Al abrir el cursor se evalúa la consulta que aparece en su definición, utilizando los valores actuales de cualquier parámetro referenciado en la consulta, para producir una colección de filas. El puntero se posiciona delante de la primera fila de datos (registro actual), esta sentencia no recupera ninguna fila.

Una vez abierto el cursos se utiliza la cláusula FETCH para recuperar las filas del cursor, la sintaxis es la siguiente:


FETCH
nombre-cursor
INTO
lista-variables

Lista - variables son las variables que van a contener los datos recuperados de la fila del cursor, en la definición deben ir separadas por comas. En la lista de variables se deben definir tantas variables como columnas tenga la fila a recuperar.

Para cerrar un cursor se utiliza el comando CLOSE, este comando hace desaparecer el puntero sobre el registro actual. La sintaxis es:


CLOSE
nombre-cursor

Por último, y para eliminar el cursor se utiliza el comando DROP CURSOR. Su sintaxis es la siguiente:


DROP CURSOR
nombre-cursor

Ejemplo (sobre SQL-SERVER):


'Abrir un cursor y recorrelo

DECLARE Employee_Cursor CURSOR FOR

SELECT LastName, FirstName

FROM Northwind.dbo.Employees

WHERE LastName like 'B%'


OPEN Employee_Cursor


FETCH NEXT FROM Employee_Cursor


WHILE @@FETCH_STATUS = 0

BEGIN

FETCH NEXT FROM Employee_Cursor

END

CLOSE Employee_Cursor

DEALLOCATE Employee_Cursor


'Abrir un cursor e imprimir su contenido

SET NOCOUNT ON

DECLARE

@au_id varchar(11),

@au_fname varchar(20),

@au_lname varchar(40),

@message varchar(80),

@title varchar(80)


PRINT "-------- Utah Authors report --------"


DECLARE authors_cursor CURSOR FOR

SELECT au_id, au_fname, au_lname

FROM authors

WHERE state = "UT"

ORDER BY au_id


OPEN authors_cursor

FETCH NEXT FROM authors_cursor

INTO @au_id, @au_fname, @au_lname


WHILE @@FETCH_STATUS = 0

BEGIN

PRINT " "

SELECT

@message = "----- Books by Author: " +

@au_fname + " " + @au_lname

PRINT @message


DECLARE titles_cursor CURSOR FOR

SELECT t.title

FROM titleauthor ta, titles t

WHERE ta.title_id = t.title_id AND ta.au_id = au_id


OPEN titles_cursor

FETCH NEXT FROM titles_cursor INTO @title

IF @@FETCH_STATUS <> 0

PRINT " <<No Books>>"

WHILE @@FETCH_STATUS = 0

BEGIN

SELECT @message = " " + @title

PRINT @message

FETCH NEXT FROM titles_cursor INTO @title

END

CLOSE titles_cursor

DEALLOCATE titles_cursor


FETCH NEXT FROM authors_cursor

INTO @au_id, @au_fname, @au_lname

END

CLOSE authors_cursor

DEALLOCATE authors_cursor

GO



'Recorrer un cursor

USE pubs

GO

DECLARE authors_cursor CURSOR FOR

SELECT au_lname

FROM authors

WHERE au_lname LIKE "B%"

ORDER BY au_lname


OPEN authors_cursor

FETCH NEXT FROM authors_cursor

WHILE @@FETCH_STATUS = 0

BEGIN

FETCH NEXT FROM authors_cursor

END

CLOSE authors_cursor

DEALLOCATE authors_cursor



'Recorrer un cursor guardando los valores en variables

USE pubs

GO

DECLARE @au_lname varchar(40)

DECLARE @au_fname varchar(20)


DECLARE authors_cursor CURSOR FOR

SELECTau_lname, au_fname

FROM authors

WHERE au_lname LIKE "B%"

ORDER BY au_lname, au_fname


OPEN authors_cursor

FETCH NEXT FROM authors_cursor INTO @au_lname, @au_fname

WHILE @@FETCH_STATUS = 0

BEGIN

PRINT "Author: " + @au_fname + " " + @au_lname

FETCH NEXT FROM authors_cursor

INTO @au_lname, @au_fname

END

CLOSE authors_cursor

DEALLOCATE authors_cursor

Actualizado el: 18-03-2006 14:52

AnteriorPosterior