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