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.
Algumas considerações:
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
, @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.
9 comentários:
Obrigado pela dica, eu post fez com que o mistério dos CURSORES fosse finalmente solucionado para mim. Até mais
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
Obrigado. Ótimo post. Ajudou bastante.
Ajudou aqui. Valeu!
Muito bom. Adorei. Ajudou muito no meu cursor.
Muito obrigado pela ajuda. Vou inaugurar esse procedimento nas minhas consultas pesadas e redundante
Ajudou bastante
Muito bom... vou por em prática
parabéns material ótimo.
Postar um comentário