BANCO DE DADOS
CURSOR
PROGRAMAÇÃO EM BANCO DE DADOS
Código Armazenado
Cursor
Operações com conjunto de linhas definem um banco
de dados relacional
Um conjunto pode ser vazio ou conter N linhas
Apesar das extensões fornecidas pelo T-SQL algumas
operações possuem alto custo ou mesmo são inviáveis
por operações de conjunto
Os cursores ajudam a trabalhar com essas situações
Possibilitando diversas operações
PROGRAMAÇÃO EM BANCO DE DADOS
Código Armazenado
Cursor
O SQL Server possui três tipos de cursores
Cursor T-SQL – Foco do nosso estudo
Cursor API – Application Programming Interface)
Curor de cliente
Os cursores T-SQL são criados usando o comando
DECLARE CURSOR
São usados principalmente em procedimento armazenados
São associados a um comando SQL
PROGRAMAÇÃO EM BANCO DE DADOS
Código Armazenado
Cursor
Processo para utilização de um cursor
Declare variáveis para conter os dados retornados pelo
cursor.
Associe o cursor a uma instrução SELECT que usa a
instrução DECLARE CURSOR
Use a instrução OPEN para executar a instrução SELECT
Use a instrução FETCH INTO para buscar linhas
individuais
Isso moverá os dados de cada coluna para variáveis
específicas
Feche o cursor – evitando estouro de memória
PROGRAMAÇÃO EM BANCO DE DADOS
Código Armazenado
Cursor
Declarar variável do tipo CURSOR
Sintaxe – Padrão ISO
DECLARE cursor_name [ INSENSITIVE ] [ SCROLL ]
CURSOR FOR select_statement [ FOR { READ ONLY |
UPDATE [ OF column_name [ ,...n ] ] } ]
PROGRAMAÇÃO EM BANCO DE DADOS
Código Armazenado
Cursor
Declarar variável do tipo CURSOR
Sintaxe – Extensão SQL Server
DECLARE cursor_name CURSOR [ LOCAL | GLOBAL ] [
FORWARD_ONLY | SCROLL ] [ STATIC | KEYSET |
DYNAMIC | FAST_FORWARD ] [ READ_ONLY |
SCROLL_LOCKS | OPTIMISTIC ] [ TYPE_WARNING ] FOR
select_statement [ FOR UPDATE [ OF column_name [ ,...n ] ]
]
PROGRAMAÇÃO EM BANCO DE DADOS
Código Armazenado
Cursor
Argumentos
Cursor_name nome/identificador do cursor
INSENTITIVE Define um cursor que faz uma cópia
temporária dos dados
SCROLL define que todas opções de busca podem ser
realizadas (first, last, next, prior, relative, absolute)
SELECT instrução SQL que será associada ao cursor
READ ONLY previne para que o cursor não faça
atualizações
PROGRAMAÇÃO EM BANCO DE DADOS
Código Armazenado
Cursor
Argumentos
UPDATE [OF nome_coluna [, ... n]] define as colunas
atualizáveis em um cursor
LOCAL Especifica que o escopo do cursor é local, ou seja,
dentro do código armazenado em que foi criado
GLOBAL especifica que o cursor é global para a conexão
FORWARD_ONLY especifica que o cursor só pode ser
rolado da primeira à última linha (FETCH NEXT)
STATIC define um cursor que faz cópia dos dados
PROGRAMAÇÃO EM BANCO DE DADOS
Código Armazenado
Cursor
Argumentos
KEYSET especifica que a associação e a ordem de linhas no
cursor são fixas
DYNAMIC o cursor reflete todas as mudanças feitas às
linhas no seu conjunto de resultados
FAST_FORWARD especifica um cursor FORWARD, READ
ONLY, com otimizações de desempenho
READ_ONLY previne atualizações feitas por este cursor
PROGRAMAÇÃO EM BANCO DE DADOS
Código Armazenado
Cursor
Argumentos
SCROLL_LOCKS especifica se atualizações posicionadas ou
exclusões feitas pelo cursor têm garantia de execução
OPTMISTIC especifica que as atualizações ou exclusões
feitas pelo cursor não terão êxito se a linha tiver sido
atualizada desde que foi lida no cursor
TYPE_WARNING especifica que uma mensagem de aviso é
enviada ao cliente quando o cursor é convertido implicitamente
em outro a partir do tipo solicitado.
PROGRAMAÇÃO EM BANCO DE DADOS
Código Armazenado
Cursor
Argumentos
SELECT_STATEMENT instrução SQL padrão que define o
conjunto de resultados de um cursor
FOR UPDATE [OF column_name [,...n]] define colunas
atualizáveis em um cursor.
PROGRAMAÇÃO EM BANCO DE DADOS
Código Armazenado
Cursor
Comentários
DECLARE CURSOR define os atributos de um cursor de
servidor TRANSACT-SQL
A instrução OPEN popula o conjunto de resultados e o
FETCH retorna uma linha de resultados
A instrução CLOSE libera o conjunto de resultados atual
associados associado com o cursor.
A instrução DEALLOCATE libera os recursos usados pelo
cursor
PROGRAMAÇÃO EM BANCO DE DADOS
Código Armazenado
Cursor
Exemplos
Usando a sintaxe e o cursor simples
DECLARE vend_cursor CURSOR FOR
SELECT * FROM Purchasing.Vendor OPEN
vend_cursor FETCH NEXT into variaveis;
PROGRAMAÇÃO EM BANCO DE DADOS
Código Armazenado
Cursor
Exemplos
Usando cursores aninhados para produzir saída de relatório
SET NOCOUNT ON;
DECLARE @vendor_id int, @vendor_name
nvarchar(50),
@message varchar(80), @product nvarchar(50);
PRINT '-------- Vendor Products Report --------';
DECLARE vendor_cursor CURSOR FOR
SELECT VendorID, Name
DECLARE product_cursor CURSOR FOR
SELECT v.Name
FROM Purchasing.ProductVendor pv,
Production.Product v
WHERE pv.ProductID = v.ProductID AND
pv.VendorID = @vendor_id -- Variable value
from the outer cursor
OPEN product_cursor
FETCH NEXT FROM product_cursor INTO
@product
FROM Purchasing.Vendor
WHERE PreferredVendorStatus = 1
ORDER BY VendorID;
OPEN vendor_cursor
FETCH NEXT FROM vendor_cursor
INTO @vendor_id, @vendor_name
WHILE @@FETCH_STATUS = 0
BEGIN
PRINT ' '
SELECT @message = '----- Products From Vendor:
'+
@vendor_name
PRINT @message
-- Declare an inner cursor based
IF @@FETCH_STATUS <> 0
PRINT '
<<None>>'
WHILE @@FETCH_STATUS = 0
BEGIN
SELECT @message = '
' + @product
PRINT @message
FETCH NEXT FROM product_cursor
INTO @product
END
CLOSE product_cursor
DEALLOCATE product_cursor
-- Get the next vendor.
FETCH NEXT FROM vendor_cursor
INTO @vendor_id, @vendor_name
END
CLOSE vendor_cursor;
DEALLOCATE vendor_cursor;
PROGRAMAÇÃO EM BANCO DE DADOS
Código Armazenado
Cursor
Exemplos
Usando cursores aninhados para produzir saída de relatório
EXCLUIR TODOS OS ITENS DE UM PEDIDO
Crie uma procedure denominada estornar venda, a qual deverá
Incialmente retornar todos os itens da venda para o estoque e
Depois excluir a venda e seus itens.
MATERIAL COMPLEMENTAR
http://www.devmedia.com.br/cursores-no-sqlserver/5590