programação em banco de dados

Propaganda
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
Download