quinta-feira, 23 de dezembro de 2010

Cursores - exemplo básico de utilização

Cursores são estruturas da linguagem T-SQL que permitem o processamento das linhas retornadas por uma consulta (SELECT), através de estruturas complexas de programação, como repetições ou  comandos condicionais.

O exemplo básico de cursor consiste em uma repetição (loop) onde um mesmo conjunto de comandos é executado para todas as linhas do retorno de uma consulta.
No exemplo abaixo, utiliza-se um cursor para executar a chamada da procedure sp_helptext para cada procedure de um banco de dados. As procedures foram obtidas através de uma consulta na view ROUTINES do Schema INFORMATION SCHEMA.

DECLARE @schemaName VARCHAR(30)
    , @procName VARCHAR(30)
    , @fullName VARCHAR(60)

-- Cursor para percorrer os nomes dos objetos
DECLARE cursor_objects CURSOR FOR
    SELECT
          ROUTINE_SCHEMA
        , ROUTINE_NAME
    FROM
        INFORMATION_SCHEMA.ROUTINES
    WHERE
        ROUTINE_TYPE = 'PROCEDURE'

-- Abrindo Cursor para leitura
OPEN cursor_objects

-- Lendo a próxima linha
FETCH NEXT FROM cursor_objects INTO @schemaName, @procName

-- Percorrendo linhas do cursor (enquanto houverem)
WHILE @@FETCH_STATUS = 0
BEGIN

    SELECT @fullName = @schemaName + '.' + @procName

    EXEC sp_helptext @fullName

    -- Lendo a próxima linha
    FETCH NEXT FROM cursor_objects INTO @schemaName, @procName
END

-- Fechando Cursor para leitura
CLOSE cursor_objects

-- Desalocando o cursor
DEALLOCATE cursor_objects 


Algumas considerações:
  • Um cursor deve estar sempre associado a uma consulta, especificada ao declarar o cursor.
  • O comando FETCH popula as variáveis recebidas como parâmetro com os valores da próxima linha da consulta a ser lida. O número de variáveis passadas como parâmetro deve ser igual ao número de colunas retornadas na consulta associada ao cursor.
  • A variável global @@FETCH_STATUS retorna o resultado da última operação FETCH executada por um cursor na conexão.
    O status 0 significa que o comando FETCH retornou uma linha, qualquer outro resultado significa que não houve linha retornada.
  • Cursores são estruturas relativamente lentas se comparadas ao desempenho de consultas do banco. O uso descuidado dessa ferramenta pode causar sérios problemas de performance.

7 comentários:

Amauri disse...

Obrigado pela dica, eu post fez com que o mistério dos CURSORES fosse finalmente solucionado para mim. Até mais

Daniel Marcius Simoni disse...

Muito bom o post, poderia dar um exemplo pegando o retorno de cada linha do select e atualizando em outra tabela esses valores retornados

Obrigado

Edson Morais disse...

Obrigado. Ótimo post. Ajudou bastante.

J disse...

Ajudou aqui. Valeu!

Unknown disse...

Muito bom. Adorei. Ajudou muito no meu cursor.

alexkads disse...

Muito obrigado pela ajuda. Vou inaugurar esse procedimento nas minhas consultas pesadas e redundante

Unknown disse...

Ajudou bastante

Postar um comentário