none
Duvidas sobre Cursores(Como montar e utilizar) RRS feed

  • Pergunta

  • Olá colegas,
    Tenho de fazer uma Trigger que vai executar varios Updates dependo de varios valores dentro de uma consulta, andei pesquisando e encontrei um objeto chamdo de CURSOR.

    Se eu entendi ele me parece um DataTable ou RecorSet (lá .NET e VB), então como utilizar os valores contidos dentro dele?

    Estou precisando de um modelo mais ou menos assim:

    CREATE TRIGGER TRG_TESTE ON TAB_TESTE
    
    FOR INSERT
    
    DECLARE tmp_cursor CURSOR
    
    FOR 
    
         SELECT *
    
         FROM TAB_TESTE2
    
    
    
    OPEN tmp_cursor
    
    FETCH NEXT FROM tmp_cursor
    
     WHILE @@FETCH_STATUS = 0
    
        BEGIN
    
           UPDATE TAB_TESTE3
    
           --(Valor do campo de um cursor)  Como pegar um valor de um campo na linha de umCURSOR ?
    
              SET [CAMPO1] = @VAL1 
    
           WHERE
    
              [CMPx] = @CMP2
    
           
    
           FETCH NEXT FROM temp_cursor
    
        END 
    
    CLOSE TEMP 
    
     
    
    GO
    
    

    Outras perguntas: 

    O que falta nesse modelo?
    Estou fazendo algo errado?
    E como posso consiguir os valores da linha de um cursor?

    Se esse objeto vai receber um Select, mudar algo nele vai refletir na origem do Select ? (é como se ele fosse um dataTable em memoria ?)
    Existe algum objeto mais rapido só de leitura? Que nem o DataReader ?   



    Obrigado pela atenção galera!
    e desculpa pelas varias perguntas em topico só.
      


    Abraão Alves - Um eterno estudante
    sexta-feira, 30 de outubro de 2009 14:40

Respostas

  • Boa tarde Abraão

    Sem dúvida os cursores facilitam e muito a vida, contudo, você pode ter alguns problemas de desempenho bem como de locks uma dica é você utilizar o hint FORWARD_ONLY, com ele a declaração ficaria assim :


    DECLARE tmp_cursor CURSOR FORWARD_ONLY


    Para você pegar os valores basta você declarar variáveis e no FETCH atribuir para as variaveis os campos


    Declare @codigo int
    Declare @nome varchar(100)

    Declare tmp_cursor Forward_Only For Select codigo,nome from suatabela

    Open tmp_cursor

    FETCH NEXT FROM tmp_cursor
    INTO @codigo,@nome


    Espero ter ajudado
    Anderson - DBA/MCP/MCTS/MCITP/MCT - Sua pergunta foi respondida ? Marque-a como tal! www.myspace.com/andersondpa
    • Marcado como Resposta Abraão Alves sexta-feira, 30 de outubro de 2009 16:32
    sexta-feira, 30 de outubro de 2009 15:05

Todas as Respostas

  • Abraão,

    Cara não rcomendo uso de cursores, ele vai fazer com que sua performance seja ruim.
    no seu script existe uma maneira mais simples e rápida para fazer o update

    UPDATE a
    SET a.campo1 = b.VAL1 
    FROM TAB_TESTE3 a inner join TAB_TESTE2 b ON  a.CMPx] = b.CMP2
    


    Att.
    Marcelo Fernandes
    MCP, MCDBA, MCSA, MCTS. Se útil, classifique!!!
    sexta-feira, 30 de outubro de 2009 15:03
  • Boa tarde Abraão

    Sem dúvida os cursores facilitam e muito a vida, contudo, você pode ter alguns problemas de desempenho bem como de locks uma dica é você utilizar o hint FORWARD_ONLY, com ele a declaração ficaria assim :


    DECLARE tmp_cursor CURSOR FORWARD_ONLY


    Para você pegar os valores basta você declarar variáveis e no FETCH atribuir para as variaveis os campos


    Declare @codigo int
    Declare @nome varchar(100)

    Declare tmp_cursor Forward_Only For Select codigo,nome from suatabela

    Open tmp_cursor

    FETCH NEXT FROM tmp_cursor
    INTO @codigo,@nome


    Espero ter ajudado
    Anderson - DBA/MCP/MCTS/MCITP/MCT - Sua pergunta foi respondida ? Marque-a como tal! www.myspace.com/andersondpa
    • Marcado como Resposta Abraão Alves sexta-feira, 30 de outubro de 2009 16:32
    sexta-feira, 30 de outubro de 2009 15:05