none
Dúvida sobre cursores RRS feed

  • Pergunta

  • Pessoal imagina a seguinte situação.

     

    CREATE TABLE TABELA1

    (

    C1 INT,

    C2 VARCHAR(30)

    )

     

     

    INSERT INTO TABELA1 VALUES (1,'TEXTO 1')

    INSERT INTO TABELA1 VALUES (2,'TEXTO 2')

    INSERT INTO TABELA1 VALUES (3,'TEXTO 3')

    INSERT INTO TABELA1 VALUES (4,'TEXTO 4')

     

     

    APÓS ISSO EU CRIO UM CURSOR.

     

    DECLARE CR1 CURSOR FOR

    SELECT C1,C2 FROM TABELA1

    FOR READ ONLY

     

    OPEN CR1

     

    DECLARE @C1 INT,

    @C2 VARCHAR(30)

     

    FETCH CR1 INTO @C1, @C2

     

    WHILE @@FETCH_STATUS = 0

    BEGIN

    SELECT @C1, @C2 FETCH CR1 INTO @C1, @C2

    END

     

    CLOSE CR1

    DEALLOCATE CR1

     

     

    1º) Eu queria entender, realmente eu preciso especificar qual tipo de cursor é:

    FOR READ ONLY

    E se eu não especificar qual tipo esse assume?

    2º) No while do cursor eu faço

    SELECT @C1, @C2 FETCH CR1 INTO @C1, @C2

    Ou seja, eu estou dando um select nas variáveis @C1 e @C2 e introduzindo no INTO @C1 e @C2? seria isso mesmo?

     

     

    Eu peguei esse exemplo na internet explicando sobre cursor, mas ainda não entendi muito bem sobre os cursores.

    Fico no aguardo.

    Obrigado

     

    quarta-feira, 16 de novembro de 2011 16:05

Respostas

  • Boa Tarde,

    Há basicamente dois tipos de cursores.

    - Aqueles que você usa muito raramente e somente em ocasiões bem especiais
    - Aqueles que você nunca usa em situação nenhuma

    Sou radicalmente contra cursores, pois, normalmente incorrem em perda de desempenho e quase sempre há outra forma de retornar o resultado sem cursor.

    O cursor de uma forma geral é o mesmo, o que ocorre é que suas propriedades podem mudar. Se você usar o STATIC por exemplo, o cursor lê os dados e não é mais sensibilizados por alterações. Há diversas propriedades em questão SCROLLABLE, FAST_FORWARD, DYNAMIC, etc. De uma forma geral, a maioria das vezes você só irá ler e avançar então recomendo o FAST_FORWARD. Os detalhes de cada propriedade só mesmo no Books OnLine (há muitas propriedades e não dá pra descrevê-las todas aqui nesse post)

    [ ]s,

    Gustavo Maia Aguiar
    Blog: http://gustavomaiaaguiar.wordpress.com
    Vídeos: http://www.youtube.com/user/gmasql


    Classifique as respostas. O seu feedback é imprescindível
    • Marcado como Resposta Richard Juhasz terça-feira, 22 de novembro de 2011 17:25
    quinta-feira, 17 de novembro de 2011 20:03

Todas as Respostas

  • Bruno,

     

    1) O Read-only serve como garantia que voce não utilzara nenhum dado vindo do cursor no where de uma query para atualizações por exemplo

    2) Isso, mas esta estranho, voce pode fazer assim:

     

    FETCH NEXT FROM Cursor_Name INTO @Variavel1,@Variavel2

     

    Maiores informações: http://msdn.microsoft.com/pt-br/library/ms180169.aspx


    Fabrizzio A. Caputo
    Certificações:
    Oracle OCA 11g
    MCITP SQL Server 2008 Implementation and Maintenance
    MCITP SQL Server 2008 Developer
    Blog Pessoal: www.fabrizziocaputo.wordpress.com
    Blog Empresa: www.tripletech.com.br/blog
    Twitter: @FabrizzioCaputo
    Email: fabrizzio.antoniaci@gmail.com
    quarta-feira, 16 de novembro de 2011 16:23
    Moderador
  • Boa Tarde,

    O READ_ONLY é comumente mal interpretado quando se utiliza cursores. Ao contrário do que muitos podem pensar, o READ ONLY não é para impedir que o cursor seja utilizado em atualizações. Você pode perfeitamente ler dados de um cursor READ ONLY e utilizá-los em instruções do tipo UPDATE. A questão é que o READ ONLY impede que as atualizações seja feitas diretamente a partir do cursor com base em uma posição (WHERE CURRENTOF). Se não tiver o READONLY é possível ler a linha 5 do cursor e já efetuar o UPDATE diretamente. Entretanto, isso não impede que se leia o dado e se monte um UPDATE dinâmico.

    Não conheço ninguém que precisou fazer uma atualização diretamente pelo cursor. Normalmente se lê o dado e se faz o UPDATE. Colocar o cursor como READ ONLY reduz o overhead e os bloqueios associados e recomendo que você o faça. Melhor mesmo é utilizar o FAST_FORWARD que é a mistura do READ ONLY com o FORWARD ONLY (o cursor só avança).

    A parte do SELECT não tem nenhum resultado prático. Você pode repetir o comando apenas a partir do FETCH.

    [ ]s,

    Gustavo Maia Aguiar
    Blog: http://gustavomaiaaguiar.wordpress.com
    Vídeos: http://www.youtube.com/user/gmasql


    Classifique as respostas. O seu feedback é imprescindível
    quarta-feira, 16 de novembro de 2011 18:56
  • Gustavo ficou perfeito suas explicações, a unica coisa que não entendi muito bem sobre os cursores é o comando INTO dentro do While.

    Nesse exemplo, eu faço um select nas váriaveis @C1 e @C2 e após eu do um INTO o que seria esse INTO?

     

    Abraços até mais!!

    quarta-feira, 16 de novembro de 2011 20:44
  • Boa Noite,

    A idéia do cursor é varrer linha a linha e cada coluna do SELECT é mapeada para uma variável. Quando você coloca FETCH e o INTO, você está solicitando que o cursor vá para uma linha específíca (normalmente a próxima linha) e coloque os valores das colunas nas variáveis após o INTO.

    Particularmente sou contra o uso de cursores e só recomendo quando não há mesmo outro jeito de fazê-lo (embora quase sempre há um jeito). Como diria um renomado conhecedor do T-SQL:

    "Usar o cursor é como pescar com uma vara, você pesca um peixe por vez. Trabalhar melhor sua consulta para não usar o cursor é como pescar de rede, ou seja, com uma única tentativa, você pesca todos os peixes de uma vez"

    [ ]s,

    Gustavo Maia Aguiar
    Blog: http://gustavomaiaaguiar.wordpress.com
    Vídeos: http://www.youtube.com/user/gmasql


    Classifique as respostas. O seu feedback é imprescindível
    quinta-feira, 17 de novembro de 2011 01:21
  • Agora eu entendi perfeitamente Gustavo.

    E quais são os tipos de cursores existentes, e quando eu um e quando eu uso outro?

    quinta-feira, 17 de novembro de 2011 11:30
  • Boa Tarde,

    Há basicamente dois tipos de cursores.

    - Aqueles que você usa muito raramente e somente em ocasiões bem especiais
    - Aqueles que você nunca usa em situação nenhuma

    Sou radicalmente contra cursores, pois, normalmente incorrem em perda de desempenho e quase sempre há outra forma de retornar o resultado sem cursor.

    O cursor de uma forma geral é o mesmo, o que ocorre é que suas propriedades podem mudar. Se você usar o STATIC por exemplo, o cursor lê os dados e não é mais sensibilizados por alterações. Há diversas propriedades em questão SCROLLABLE, FAST_FORWARD, DYNAMIC, etc. De uma forma geral, a maioria das vezes você só irá ler e avançar então recomendo o FAST_FORWARD. Os detalhes de cada propriedade só mesmo no Books OnLine (há muitas propriedades e não dá pra descrevê-las todas aqui nesse post)

    [ ]s,

    Gustavo Maia Aguiar
    Blog: http://gustavomaiaaguiar.wordpress.com
    Vídeos: http://www.youtube.com/user/gmasql


    Classifique as respostas. O seu feedback é imprescindível
    • Marcado como Resposta Richard Juhasz terça-feira, 22 de novembro de 2011 17:25
    quinta-feira, 17 de novembro de 2011 20:03