none
Ajuda a constuir cursor RRS feed

  • Pergunta

  •  

    Oi estou a precisar fazer um select mas com uma pequena particularidade

     

    O select em causa é o seguinte :

     

    Select PrecoUnidade,Quantidades From tblEntradas

     

    Agora eu queria era durante a execuçao do Select poder calcular a soma da Coluna Quantidades e parar o select quando esta soma for <=7

     

    Acho que isto so sera possivel com um cursor mas estou aberto a sugestoes

    Eu nunca criei um cursor precisava de uma ajuda pra construir algo do genero que refiro em cima....

     

    tks

    segunda-feira, 4 de junho de 2007 19:32

Respostas

  •  

    Olá Collito,

     

    Este exemplo deve resolver seu problema:

     

    Code Snippet

    DECLARE @Soma INT, @Preco NUMERIC (9,2), @Quant INT

    DECLARE @Tbl (PrecoUnidade NUMERIC (9,2), Quantidades INT)

    DECLARE Cur CURSOR FOR

    Select PrecoUnidade,Quantidades From tblEntradas

    OPEN Cur

    FETCH NEXT FROM Cur INTO @Preco, @Quant

    SET @Soma = @Quant

    WHILE @@FETCH_STATUS = 0 AND @Quant <= 7

    BEGIN

    INSERT INTO @Tbl VALUES (@Preco, @Quant)

    FETCH NEXT FROM Cur INTO @Preco, @Quant

    SET @Soma = @Soma + @Quant

    END

    SELECT * FROM @tbl

    CLOSE Cur

    DEALLOCATE Cur

     

    Qualquer dúvida, retorne.

     

    Abraço

    segunda-feira, 4 de junho de 2007 19:46

Todas as Respostas

  •  

    Olá Collito,

     

    Este exemplo deve resolver seu problema:

     

    Code Snippet

    DECLARE @Soma INT, @Preco NUMERIC (9,2), @Quant INT

    DECLARE @Tbl (PrecoUnidade NUMERIC (9,2), Quantidades INT)

    DECLARE Cur CURSOR FOR

    Select PrecoUnidade,Quantidades From tblEntradas

    OPEN Cur

    FETCH NEXT FROM Cur INTO @Preco, @Quant

    SET @Soma = @Quant

    WHILE @@FETCH_STATUS = 0 AND @Quant <= 7

    BEGIN

    INSERT INTO @Tbl VALUES (@Preco, @Quant)

    FETCH NEXT FROM Cur INTO @Preco, @Quant

    SET @Soma = @Soma + @Quant

    END

    SELECT * FROM @tbl

    CLOSE Cur

    DEALLOCATE Cur

     

    Qualquer dúvida, retorne.

     

    Abraço

    segunda-feira, 4 de junho de 2007 19:46
  • Olá amigo, sera que vc poderia me explicar esta procedure, pois nãso estou conseguindo implementar em meu código.

     

    Obrigado.

    terça-feira, 11 de dezembro de 2007 12:47
  • João,

     

    Mas qual é a sua dúvida?

    terça-feira, 11 de dezembro de 2007 13:24
  • Eu não estou entendo como funciona o cursor.

    Se alguem puder me ajudar.

     

    Obrigado.

    terça-feira, 11 de dezembro de 2007 18:03
  • João,

     

    O cursor é um recurso do SQL SERVER para processo que tenham de ser "loopados". É um implementação de loop teoricamente bem mais simples do que um While por exemplo, porém em termos de desempenho é um processio pesado e que a maioria dos DBA's evitam por ser danoso ao desempenho do banco. Sabe-se que o acesso a banco é feito por diversos programas , usuários simultaneamente então todo o processo pesado deve ser evitado. Entretanto existem casos que pode ser inevitável o uso do cursor. Pois bem, abaixo vou tentar explicar de maneira sussinta o uso do cursor:

     

    DECLARANDO UM CURSOR - Perceba que ao declarar um cursor vc usa a seguinte sintáxe e nomeia o cursor com um nome a escolha. Ao se declarar um cursor vc automaticamente carrega um cursor com os dados. Essa "carregamento" nada mais é do um select com quantos campos vc achar necessário. NO caso do exemplo apenas um campo para facilitar as coisa

     

    DECLARE Cursor_Select

    CURSOR FOR

    SELECT vl_mascara_retorno + ' AS [' + CAST(id_atributo_versao_estrut_corp AS VARCHAR) + ']'

    FROM tb_atributo_versao_estrut_corp (NOLOCK)

    WHERE id_versao_estrut_corp_fk = @id_versao_estrut_corp_fk

    ORDER BY nu_ordem_disposicao

     

    PRÓXIMO PASSO É ABRIR O CURSOR PARA O USO. Nada mais nada menos do que essa síntaxe:

    OPEN Cursor_Select

     

    AGORA VAMOS ATRIBUIR VARIÁVEIS AO CURSOR. Perceba que quantos campos vc tiver declarado no select que carrega o cursor será a quantidade de variáveis atribuidas no cursor. Nesse exemplo como existe apenas um campo então haverá apenas uma variável. Lembrando que na declaração das variáveis o tipo deve ser idêntico ao campo da tabela. Caso seja diferente não esquecer de converter o valor.

    --ATRIBUINDO VARIÁVEIS AOS CAMPOS DO CURSOR

    FETCH NEXT FROM Cursor_Select INTO @NomeCampoSelect

     

    AGORA VAMO COMEÇAR A TRABALHAR COM O CURSOR. Trabalhar com ele é simples. Basta iniciar o loop com uma variável global usada no cursor iniciar seu processo..

    WHILE @@FETCH_STATUS = 0

    BEGIN

    .

    .  PROCESSO COMPLETO

    .

     

    --PRÓXIMA LINHA DO CURSOR

    FETCH NEXT FROM Cursor_Select INTO @NomeCampoSelect

    END

     

    Essa forma de usar o cursor é a mesma para todos os cursores. Se existe alguma outra forma não conheço. Repare que o processo está dentro de um BEGIN/END e a chamada da próxima linha é idêntica a chamada da primeira. Isso ocorre pois existe um processo  que quem controla é justamente a variável @@FETCH_STATUS . Enquanto o resultado dela for 0 então existe processo. Sinceramente não sei o tipo de processo dela, vou ficar te devendo essa.. rsrsr

     

    POR FIM QUANDO ACABAR O PROCESSO DO LOOP BASTA  FECHAR O CURSOR E DESLOCAR DA MEMORIA. Esse processo é muito importante, pois eveita mais perda de desempenho por ter centenas de cursores abertos

     

    -- FECHANDO E EXCLUINDO DA MEMÓRIA O CURSOR

    CLOSE Cursor_Select

    DEALLOCATE Cursor_Select

     

    Bem João, essa é uma explicação da minha mente e bem resumida, espero ter ajudado. Qualquer dúvida posta aí que respondemos.

    Aos outros participantes se esqueci algum detalhes favor postem até mesmo para conhecimento.

     

    Abraço a todos,

     

    chapolin.rio@gmail.com

     

     

    terça-feira, 11 de dezembro de 2007 19:12
  •  

    João Paulo,

     

    Vou comentar o exemplo que postei.

     

    Code Block

    -- Variáveis que irão receber os dados de cada registro

    DECLARE @Soma INT, @Preco NUMERIC (9,2), @Quant INT

    -- Tabela usada pro exemplo do colega, sem relação com cursor

    DECLARE @Tbl (PrecoUnidade NUMERIC (9,2), Quantidades INT)

    -- Criação do cursor

    DECLARE Cur CURSOR FOR

    -- Dados que vão para o cursor

    Select PrecoUnidade,Quantidades From tblEntradas

    -- Abertura do cursor

    OPEN Cur

    -- Joga os dados do primeiro registro nas variáveis

    FETCH NEXT FROM Cur INTO @Preco, @Quant

    -- só para o exemplo

    SET @Soma = @Quant

    -- laço, que irá passar registro por registro

    WHILE @@FETCH_STATUS = 0 AND @Quant <= 7

    BEGIN

    INSERT INTO @Tbl VALUES (@Preco, @Quant)

    -- Joga os dados dos registros a cada repetição

    FETCH NEXT FROM Cur INTO @Preco, @Quant

    SET @Soma = @Soma + @Quant

    END

    SELECT * FROM @tbl

    -- Fecha o cursor

    CLOSE Cur

    -- Libera memória

    DEALLOCATE Cur

     

     

    Qualquer coisa estamos aí.

     

     

    Abraço

    terça-feira, 11 de dezembro de 2007 19:22
  • O que eu não estou entendo é que...

     

    Quando eu entro com os parametros para executar a procedure ela vai me retornar um valor, certo? Onde este valor de retorno esta definido no código, esta é a questao que eu não estou entendo.

    É nesta tabela temporaria ou tem outra forma de fazer?

     

    Obrigado.

    quarta-feira, 12 de dezembro de 2007 12:55