A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

Cursores 9/6/2016CEFET-RN1 José Antônio da Cunha George Azevedo da Silva.

Apresentações semelhantes


Apresentação em tema: "Cursores 9/6/2016CEFET-RN1 José Antônio da Cunha George Azevedo da Silva."— Transcrição da apresentação:

1 Cursores 9/6/2016CEFET-RN1 José Antônio da Cunha George Azevedo da Silva

2 Cursores Transact_SQL 9/6/2016CEFET-RN2 Um banco de dados relacional como o SQL Server, o Oracle, etc é naturalmente orientado a conjuntos. Isto significa, que uma dada instrução como SELECT, retornará um conjunto de resultados – muitas vezes representado por mais do que uma linha de dados.

3 Cursores Transact_SQL 9/6/2016CEFET-RN3 Por outro lado a maioria das linguagens de programação, bem como muitas aplicações, tendem a ser definitivamente baseada em registro (lista de clientes).

4 Cursores Transact_SQL 9/6/2016CEFET-RN4 A incompatibilidade entre a abordagem orientada a conjuntos e a abordagem baseada em registro é, algumas vezes, conhecida como, incompatibilidade de impedância. Então, o que fazer com essa incompatibilidade? Os SGBDs fornecem uma ponte significativa entre os dois modelos: os cursores.

5 Cursores Transact_SQL 9/6/2016CEFET-RN5 Você pode pensar em um cursor como conjunto de resultados nomeado, no qual sempre é mantida uma posição atual, à medida que você move ao longo do conjunto de resultados. É como, por exemplo, se você estivesse examinando nomes em um caderno de endereços. Seu dedo atua como um cursor – ele funciona como um ponteiro para a entrada atual, dentre as muitas que você tem à sua frente. Pense nas entradas na página atual do caderno de endereços como um conjunto de resultados de sua consulta.

6 Cursores Transact_SQL 9/6/2016CEFET-RN6 O SQL Server, Oracle, etc tem tipos diferentes de cursores, que você pode escolher com base em suas necessidades de rolagem e no quanto deseja que o cursor esteja protegido de alterações de dados feitas por terceiros.

7 Cursores Transact_SQL 9/6/2016CEFET-RN7 R1 R5 R7 R3 R2 R8 R4 R6 R1 R2 R3 R4 R5 R6 R7 R8 Consultar um conjunto de resultados Abrir o cursor

8 Cursores Transact_SQL 9/6/2016CEFET-RN8 R1 R2 R3 R4 R5 R6 R7 R8 Busca relativa 7 R1 R2 R3 R4 R5 R6 R7 R8 Primeira busca R1 R2 R3 R4 R5 R6 R7 R8 Busca seguinte

9 Fundamentos de cursores 9/6/2016CEFET-RN9 Declarar um cursor Abrir um cursor Fechar um cursor Liberar um cursor Usar um comando FETCH simples Colocar um registro em variáveis Colocar um registro pela sua posição absoluta Colocar um registro pela sua posição relativa Realizar uma atualização posicionada Realizar uma exclusão posicionada

10 Cursores Transact_SQL 9/6/2016CEFET-RN10 O que é um cursor? Um cursor é um objeto que aponta para uma determinada linha dentro de um conjunto. Microsoft SQL Server Cursores Transact-SQL Cursores de API ADO OLE DB ODBC DB-Library

11 Cursores Transact_SQL 9/6/2016CEFET-RN11 Os cursores Tansact-SQL – são cursores do lado do servidor. Os cursores API – podem ser tanto do lado cliente, quanto do lado servidor. O que isso significa?

12 Cursores Transact_SQL 9/6/2016CEFET-RN12 Características do cursor Sua capacidade de refletir alterações em dados subjacentes; Sua capacidade de rolar pelo conjunto de linhas; E sua capacidade de atualizar o conjunto de linhas.

13 Cursores Transact_SQL 9/6/2016CEFET-RN13 Tipos de cursores Static; Keyset; Dynamic; Firehose.

14 Cursores Transact_SQL 9/6/2016CEFET-RN14 Static: um cursor static faz uma espécie de ‘foto’ dos dados especificados pela sua instrução SELECT e a armazena no banco de dados tempdb. Ele é apenas de leitura. Ele pode ser forward-only (apenas para frente) ou scrollable(rolável). Keyset: um cursor keyset copia para o tempdb apenas as colunas necessárias para identificar exclusivamente cada linha. O cursor keyset pode ser updatable (atualizável) ou read-only (somente leitura) e também scrollable(rolável) ou forward-only(apenas para frente). Linhas adicionadas nas tabelas subjacentes não serão adicionadas ao cursor. Alterações feitas por outro usuário, não se refletirão no cursor.

15 Cursores Transact_SQL 9/6/2016CEFET-RN15 Dynamic: teoricamente os cursores dynamic comportam-se como se uma instrução SELECT fosse lançada novamente sempre que uma linha fosse referenciada. Os cursores dynamic refletem as alterações de valor tanto da associação quanto dos dados subjacentes, quer essas alterações tenham sido feitas pelo cursor ou por qualquer outro usuário. Porém, há uma restrição para o cursor dynamic: a instrução SELECT usada para defini-lo só pode conter uma cláusula ORDER BY se existir um índice contendo as colunas na cláusula ORDER BY. Se você declarar um cursor dynamic com uma cláusula ORDER BY que não esteja apoiada por um índice, o SQL converterá o cursor para o cursor keyset.

16 Cursores Transact_SQL 9/6/2016CEFET-RN16 Firehose: Esta é uma forma especializada de cursor do tipo somente leitura fixa, suportada pelo SQL Server. Esses cursores são muito eficientes, mas existem duas restrições importantes quanto ao seu uso: 1.Se a instrução SELECT que você usou para definir o cursor referenciar colunas text, ntext ou image e contiver a cláusula TOP, o SQL Server converterá o cursor firehore em um cursor keyset. 2.Se a instrução SELECT que você usou para definir o cursor combinar tabelas que contenham gatilhos com tabelas que não tenham gatilhos, cursor será convertido para um cursor static.

17 Cursores Transact_SQL 9/6/2016CEFET-RN17 Usando cursores Usar um cursor é como usar uma variável local – você o declara, define o seu valor e, depois, o usa. Ao contrário das variáveis locais, porém, que são destruídas automaticamente quando ficam fora do escopo, você deve liberar explicitamente uma variável usada por um cursor e, depois destruí-la.

18 Cursores Transact_SQL 9/6/2016CEFET-RN18 Criando cursores – sintaxe: DECLARE nome_cursor CURSOR [visibilidade] [rolagem] [tipo] [bloqueio] [DIGITAR_AVISO] FOR instrução_select [FOR UPDATE[OF nomes_colunas]]

19 Cursores Transact_SQL 9/6/2016CEFET-RN19 Visibilidade: LOCAL ou GLOBAL Rolagem: FORWARD_ONLY e SCROLL Tipo: STATIC, KEYSET, DYNAMIC e FAST_FORWARD(Firehose) Bloqueio: READ_ONLY – nenhuma alteração pode ser feita aos dados subjacentes pelo cursor. (UPDATE) SCROLL_LOCKS – as atualizações podem ser feitas apenas pelo cursor. OPTIMISTIC – permite atualizações tanto pelo cursor como de fora dele.

20 Cursores Transact_SQL 9/6/2016CEFET-RN20 DIGITAR_AVISO: Instrui O SQL Server para enviar uma mensagem de aviso para o cliente se um cursor for convertido do tipo especificado em outro tipo. Instrução_select: Especifica as linhas a serem incluídas no conjunto do cursor. FOR UPDATE: Indica que o cursor é atualizável(padrão, a menos que o bloqueio READ-ONLY seja especificado. OF nomes_colunas especifica as coluna que serão atualizáveis. Se você omitir, então todas as colunas serão atualizáveis.

21 Cursores Transact_SQL 9/6/2016CEFET-RN21 Abra um cursor O conjunto do cursor não será criado até que você abra o cursor. OPEN meu_cursor

22 Cursores Transact_SQL 9/6/2016CEFET-RN22 Feche um cursor Assim que você tiver terminado de usar um cursor, deve fechá-lo. A instrução CLOSE libera os recursos usados para manter o conjunto do cursor e também libera quaisquer bloqueios que tenham sido colocados nas linhas se você tiver usado o parâmetro SCROLLOCKS. CLOSE meu_cursor

23 Cursores Transact_SQL 9/6/2016CEFET-RN23 Desaloque um cursor A última instrução na seqüência de criação do cursor é DEALLOCATE. DEALLOCATE meu_cursor Atenção!, a instrução DEALLOCATE remove o identificador do cursor ou variável do cursor, mas ela não remove necessariamente o cursor. O próprio cursor não será removido até que todos os seus identificadores sejam desalocados.

24 Cursores Transact_SQL 9/6/2016CEFET-RN24 Considere o seguinte exemplo: --Crie o cursor DECLARE meuCursor CURSOR KEYSET READ_ONLY FOR SELECT * FROM authors --Crie o conjunto do cursor OPEN meuCursor... --Libere o cursor DEALLOCATE meuCursor

25 Cursores Transact_SQL 9/6/2016CEFET-RN25 Manipulando linhas com um cursor O Transact-SQL suporta três comandos diferentes para trabalhar com cursores: FETCH, UPDATE e DELETE. O comando FETCH recupera uma linha específica do conjunto do cursor. Sua sintaxe é: FETCH cursor_ou_variável Esse formato retorna a linha na qual o cursor está posicionado (a linha atual).

26 Cursores Transact_SQL 9/6/2016CEFET-RN26 Exemplo 1 - FETCH USE pubs DECLARE simpleCursor CURSOR--Cria o cursor LOCAL FOR SELECT au_fname, au_lname FROM authors OPEN simpleCursor--Cria o conjunto do cursor FETCH simpleCursor--Recupera a 1ª linha CLOSE simpleCursor--Libera o conjunto do cursor DEALLOCATE simpleCursor--Desaloca o cursor.

27 Cursores Transact_SQL 9/6/2016CEFET-RN27 Em vez de retornar uma linha diretamente, o comando FETCH também permite que você armazene os valores de coluna retornados em variáveis. FETCH cursor_ou_variável INTO lista_de_variáveis Sintaxe: Você deve declarar as variáveis antes de executar o comando FETCH. A lista de variáveis deve incluir uma variável para cada coluna na instrução SELECT que definiu o cursor e os tipos de dados devem ser compatíveis.

28 Cursores Transact_SQL 9/6/2016CEFET-RN28 Exemplo 2 – FETCH INTO USE pubs DECLARE simpleCursor CURSOR LOCAL FOR SELECT au_fName, au_LName FROM authors DECLARE @pNome char(20), @sNome char(50) OPEN simpleCursor--Abre o cursor FETCH simpleCursor INTO @pNome, @sNome PRINT RTRIM(@pNome) + ' é o primeiro nome' PRINT RTRIM(@sNome) + ' é o sobre nome' CLOSE simpleCursor DEALLOCATE simpleCursor

29 Cursores Transact_SQL 9/6/2016CEFET-RN29 Todos os exemplos anteriores usaram a instrução FETCH para retornar a linha atual. Três palavras-chaves permitem que você especifique uma posição absoluta no conjunto de cursores. FIRST e LAST: retornarão a primeira e última linha, respectivamente ABSOLUTE n: especifica uma linha no conjunto do cursor Você pode especificar o valor de n como uma constante (5) ou como uma variável (@linha.

30 Cursores Transact_SQL 9/6/2016CEFET-RN30 Exemplo 3 – FETCH FIRST/ABSOLUTE USE pubs DECLARE simpleCursor CURSOR LOCAL KEYSET FOR SELECT au_fname FROM authors DECLARE @pNome char(20) OPEN simpleCursor FETCH FIRST FROM simpleCursor INTO @pNome PRINT RTRIM(@pNome) + ' é o primeiro nome' FETCH ABSOLUTE 5 FROM simpleCursor INTO @pNome PRINT RTRIM(@pNome) + ' é o 5º nome' CLOSE simpleCursor DEALLOCATE simpleCursor

31 Cursores Transact_SQL 9/6/2016CEFET-RN31 Recuperando linha com base na sua posição relativa. FETCH NEXT: retorna a linha seguinte FETCH PRIOR: retorna a linha anterior FETCH RELATIVE n: retorna uma linha n linhas da linha atual (pode ser positivo ou negativo).

32 Cursores Transact_SQL 9/6/2016CEFET-RN32 Exemplo 4 – FETCH RELATIVE USE pubs DECLARE simpleCursor CURSOR LOCAL KEYSET FOR SELECT au_fname FROM authors DECLARE @pNome char(20) OPEN simpleCursor FETCH NEXT FROM simpleCursor INTO @pNome PRINT RTRIM(@pNome) + ' é o primeiro nome' FETCH RELATIVE 1 FROM simpleCursor INTO @pNome PRINT RTRIM(@pNome) + ' é o próximo nome' CLOSE simpleCursor DEALLOCATE simpleCursor

33 Cursores Transact_SQL 9/6/2016CEFET-RN33 USE pubs DECLARE simpleCursor CURSOR LOCAL FAST_FORWARD FOR SELECT au_fname FROM authors DECLARE @Nome char(20) DECLARE @count int OPEN simpleCursor SET @count = 1 WHILE @count <= 6 BEGIN FETCH NEXT FROM simpleCursor INTO @Nome PRINT RTRIM(@Nome) + ' Nome ' + LTRIM(STR(@count)) SET @count = @count + 1 END CLOSE simpleCursor DEALLOCATE simpleCursor Exemplo – 5 FETCH NEXT

34 Cursores Transact_SQL 9/6/2016CEFET-RN34 Atualizando e excluindo linhas com um cursor. Desde que o cursor seja atualizável, alterar os valores subjacentes em um conjunto do cursor é bastante simples. Veja a seguir a sintaxe: UPDATE tabel_ou_visualização SET LISTA_DE_ATUALIZAÇÃO Where current of CURSOR_OU_VARIÁVEL ATUALIZAÇÃO POSICIONADA.

35 Cursores Transact_SQL 9/6/2016CEFET-RN35 Exemplo 6 - UPDATE USE PUBS DECLARE simpleCursor CURSOR LOCAL KEYSET FOR SELECT AU_fname, city FROM authors ORDER BY AU_fname, city FOR UPDATE OPEN simpleCursor FETCH NEXT FROM simpleCursor UPDATE authors SET city = 'Natal' WHERE CURRENT OF simpleCursor Select TOP 1 au_fname, city FROM authors ORDER BY AU_fname, city CLOSE simpleCursor DEALLOCATE simpleCursor

36 Cursores Transact_SQL 9/6/2016CEFET-RN36 @@FETCH_STATUS: retorna informações sobre o último comando FETCH que foi lançado. RetornoSignificado. 0 O FETCH foi realizado com sucesso. O FETCH falhou. -2 O registro trazido foi perdido.

37 Cursores Transact_SQL 9/6/2016CEFET-RN37 Exemplo 6 – @@CURSOR_ROWS USE pubs DECLARE simpleCursor CURSOR LOCAL STATIC FOR SELECT au_fname FROM authors OPEN simpleCursor SELECT @@CURSOR_ROWS AS CursorRows FETCH simpleCursor If @@FETCH_STATUS <> 0... CLOSE simpleCursor DEALLOCATE simpleCursor

38 9/6/2016CEFET-RN38 Cursores Transact_SQL Exemplo 7 - @@FETCH_STATUS USE pubs DECLARE simpleCursor CURSOR LOCAL STATIC FOR SELECT au_fname FROM authors ORDER BY au_fname DECLARE @pNome char(20) OPEN simpleCursor FETCH NEXT FROM simpleCursor INTO @pNome WHILE @@FETCH_STATUS = 0 BEGIN PRINT RTRIM(@pNome) FETCH NEXT FROM simpleCursor INTO @pNome END CLOSE simpleCursor DEALLOCATE simpleCursor


Carregar ppt "Cursores 9/6/2016CEFET-RN1 José Antônio da Cunha George Azevedo da Silva."

Apresentações semelhantes


Anúncios Google