Curso de SQL

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

COMPARTE ESTE ARTÍCULO

COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN LINKEDIN
COMPARTIR EN WHATSAPP