O cursor é um recurso da linguagem T-SQL (Transact SQL - uma especialização da ANSI SQL, própria para o MS SQL Server) muito útil quando é precisa percorrer todo o conjunto de registros de uma query e baseado nesta tomar decisões como: inserir, remover ou atualizar dados em uma tabela, ou até mesmo preencher uma tabela temporaria. Há uma gama de desenvolvedores e DBA que são contra o uso deste recurso. Esses alegam que o uso do cursor sobrecarrega o banco. Eu, particularmente nunca percebi isso. Já realizei alguns testes usando o cursor e não usando e o tempo de resposta foi o mesmo. Talvez por usar pouco não vi diferença. Então é melhor usar somente quando for muito necessário.
Abaixo segue um exemplo do uso do cursor para preencher uma tabela temporaria, atualizar, apagar e inserir dados em outras tabelas. Um cursor precisa ser declarado (passando a query que ele irá percorrer) e posteriormente aberto. Como todo ponteiro, inicialmente aponta pro vazio, então após aberto, é preciso usar o comando fetch next passando as variáveis que armazenarão os dados do cursor. A idéia de cursor lembra a de uma recordset. No final do laço while é necessário usar o fetch next novamente para que o cursor se mova para o proximo registro. Para finalizar é necessário fechar o apontador e depois desaloca-lo da memória.
CREATE TABLE #TEMP_VAL (CODIGO INT, CODIGO VARCHAR(50)) DECLARE @id AS INT, @user AS VARCHAR(50)
DECLARE CUR_ADM CURSOR FORSELECT id, username FROM administrador WHERE ativo = 1
OPEN CUR_ADM
FETCH NEXT FROM CUR_ADM INTOH NEXT FROM CUR_ADM INTO @id, @user
WHILE @@FETCH_STATUS = 0 BEGIN
IF @user = 'teste' BEGIN INSERT #TEMP_VAL VALUES ( @id, @user ) DELETE administrador WHERE id = @id END FETCH NEXT FROM CUR_ADM INTO @id, @user END
CLOSE CUR_ADM
SELECT * FROM #TEMP_VAL
DROP TABLE #TEMP_VAL
DEALLOCATE CUR_ADM |
Utilizei no exemplo também uma tabela temporária para armazenar alguns dados e posteriormente apaguei usando o drop. Tabelas temporárias são criadas colocando o # ou ## na frente de seus respectivos nomes. O uso de 1 # ou 2 # é de acordo com a necessidade da aplicação.