quarta-feira, 24 de janeiro de 2007

Utilizando cursor no SQL Server

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 FOR
SELECT 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.

Nenhum comentário: