none
Cursor com passagem de parâmetro RRS feed

  • Pergunta

  •  Boa noite,

    gostaria de tirar uma dúvida sobre como criar um cursor onde possa ao abri passar valor para um parâmentro!

    Vamos supor que tenho a seguinte estrutura de tabela

    NM_ESTADO_ID INT
    DS_ESTADO_NOM VARCHAR(50)

    Contendo os seguintes registros


    Code Snippet
    NM_ESTADO_ID DS_ESTADO_NOME
    ------------------- ------------------------
    1                   SP
    2                   RJ
    3                   TO
    4                   PA
    5                   RR

     

     



    criarei um corsor que trás todos os registros


     
    Code Snippet


    DECLARE @DS_ESTADO_NOME VARCHAR(60)
    DECLARE NEWCURSOR CURSOR LOCAL FOR SELECT DS_ESTADO_NOME FROM TB_MENU

    OPEN NEWCURSOR

    FETCH NEXT FROM NEWCURSOR INTO  @DS_MENU_DESC

    WHILE @@FETCH_STATUS = 0
    BEGIN

    PRINT  @DS_MENU_DESC
    FETCH NEXT FROM NEWCURSOR INTO  @DS_ESTADO_NOME
    END

    CLOSE NEWCURSOR

    DEALLOCATE NEWCURSOR

     


    A saída disso seria


    queria passar como parâmeto um valor para filtrar por nm_estado_id

    SP
    RJ
    TO
    PA
    RR


    obrigado!

    quarta-feira, 2 de julho de 2008 02:52

Todas as Respostas

  •  

    Desculpe mais nao entendi qual seria a ideia, vc. pode explicar melhor pois as vezes nem e preciso usar um cursor.

     

    Abs;

    quarta-feira, 2 de julho de 2008 10:23
  • Bom Dia,

     

    Também não entendi qual seria a necessidade e de antemão pergunto senão existiria uma forma de fazer evitando o cursor.

     

    [ ]s,

     

    Gustavo

     

    quarta-feira, 2 de julho de 2008 13:31
  • Bom dia pessoal,

     

    Trabalho com Oracle e conheço a sintaxe para declarar um cursor que recebe parâmetros para utilizar nos filtros do select, agora para SQL Server não lembro a sintaxe.

     

    Na realidade quero relembrar a forma de declarar o cursor para que eu possa passar os parâmetros quando tiver que utilizar um cursor dentro de outro.

     

    Por exemplo,... Vamos supor que eu tenha dois cursores declarados e eu só vá abri o segundo depois do resultado que o primeiro me trouxer, passando esse resultado como parâmetro para o filtro do select existente no segundo cursor.

     

     

     

     

     

    quarta-feira, 2 de julho de 2008 16:45
  • Boa Tarde,

     

    Há um exemplo de como declarar um cursor dentro do outro no Books OnLine. Segue o exemplo:

     

    Code Snippet

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

    -- on vendor_id from the outer cursor.

    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

    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

     

     

    Ainda assim, aconselho a rever se há mesmo necessidade de produzir dois cursores. Cursores são mais lentos e mais caros em relação a instruções SELECT comuns.

     

    [ ]s,

     

    Gustavo

    quarta-feira, 2 de julho de 2008 17:53
  • Boa tarde Gustavo,
    A sim, essa forma eu havia visualizado já, mas tem uma forma de você deixar ele declarado já criando os campos de entrada de passagem de parâmentros, dai passar esses parâmetros quando executar o open nome_do_cursor param1, param2 ... , é esse que estou tentando lembrar.

    Havia tentado colocando os parametros depois do nome assim:

    Code Snippet

    DECLARE NEWCURSO (@ID INT ) CURSOR FOR SELECT * FROM TABELA WHERE CAMPO = @ID


    Mas da erro, me lembro que era alguma coisa assim!


    quarta-feira, 2 de julho de 2008 18:14