none
fetch forward RRS feed

  • Pergunta

  • Estou tentando exibir 5 linhas com um cursor, dá o seguinte erro
    Msg 155, Level 15, State 1, Line 11
    'forward' is not a recognized FETCH option.
    Alguem pode ajudar?

    BEGIN


    DECLARE cTeste CURSOR SCROLL FOR  

    select * from tbl_produtos


    OPEN cTeste  

    FETCH forward 5 FROM cTeste


    CLOSE cTeste  
    DEALLOCATE cTeste
    END
    quarta-feira, 28 de abril de 2010 14:28

Todas as Respostas

  • Bom Dia,

    Não acho que seja necessário um cursor para exibir as cinco primeiras linhas. Você poderia utilizar um TOP ou até a função ROW_NUMBER. De qualquer forma, tente usar o FETCH NEXT (não há FETCH FORWARD)

    [ ]s,

    Gustavo Maia Aguiar
    http://gustavomaiaaguiar.spaces.live.com


    Classifique as respostas. O seu feedback é imprescindível
    quarta-feira, 28 de abril de 2010 14:33
  • Tem um site que tem esse FETCH FORWARD e apresenta um exemplo assim:

     

    O exemplo a seguir acessa uma tabela usando um cursor.

    -- Definir e usar o cursor:
    
    BEGIN WORK;
    DECLARE liahona CURSOR FOR SELECT * FROM filmes;
    
    -- Buscar as 5 primeiras linhas do cursor liahona:
    FETCH FORWARD 5 IN liahona;
    
    <tt class="COMPUTEROUTPUT"> cod  |     titulo     | did | data_prod | tipo  | duracao
    -------+-------------------------+-----+------------+----------+---------
     BL101 | The Third Man      | 101 | 1949-12-23 | Drama  | 01:44
     BL102 | The African Queen    | 101 | 1951-08-11 | Romance | 01:43
     JL201 | Une Femme est une Femme | 102 | 1961-03-12 | Romance | 01:25
     P_301 | Vertigo         | 103 | 1958-11-14 | Ação   | 02:08
     P_302 | Becket         | 103 | 1964-02-03 | Drama  | 02:28</tt>
    
    -- Buscar a linha anterior:
    FETCH BACKWARD 1 IN liahona;
    
    <tt class="COMPUTEROUTPUT"> cod  | titulo | did | data_prod | tipo  | duracao
    -------+---------+-----+------------+--------+---------
     P_301 | Vertigo | 103 | 1958-11-14 | Ação  | 02:08</tt>
    
    -- fechar a consulta e efetivar o trabalho:
    
    CLOSE liahona;
    COMMIT WORK;

    o site é: http://www.htmlstaff.org/postgresqlmanual/sql-fetch.html
    Realmente não é necessário para 5 linhas, mas a minha ideia é exibir 10.000 pra 
    depois manipular!

    quarta-feira, 28 de abril de 2010 14:36
  • Já usei no postgree, no sql não existe dessa forma que eu saiba, qual seu banco de dados?

    "ѕó αqυєℓєѕ q тєм α ¢σяαgєм ∂є ¢αмιηнαя, ρσ∂єм νινєя тσ∂σѕ σѕ ∂ιαѕ ηα ¢єятєzα ∂є ¢нєgαя" msn: poseidonfba@hotmail.com
    quarta-feira, 28 de abril de 2010 14:49
  • SQL SERVER..

     

    Eu precisava retornar de 10 mil em 10 mil, pra inserir em uma outra tabela!

     

    Só que eu não sei usar o cursor!

    quarta-feira, 28 de abril de 2010 14:57
  • Você pode fazer com um while tambem, um while que va de tanto em tando de acordo com o total de registros dessa tabela.

    E dentro do while você usa o insert into com select , eu ja fiz algo parecido, só não sei se te atende.


    "ѕó αqυєℓєѕ q тєм α ¢σяαgєм ∂є ¢αмιηнαя, ρσ∂єм νινєя тσ∂σѕ σѕ ∂ιαѕ ηα ¢єятєzα ∂є ¢нєgαя" msn: poseidonfba@hotmail.com
    quarta-feira, 28 de abril de 2010 16:48
  • Atende..

     

    Mas como eu faço isso?

    quinta-feira, 29 de abril de 2010 16:02
  • Segue um exemplo

     

    	create table #temp(CAMPO1 VARCHAR(50),CAMPO2 VARCHAR(50))
    	--PRIMEIRO CRIEI ESTA TABELA COMO EXEMPLO E INCLUI 1100 REGISTROS
    	DECLARE @cont int
    	set @cont = 1
    	while @cont<1100
    	begin
    		insert into #temp(CAMPO1,CAMPO2) VALUES ('Poseydon' + Convert(varchar(50),@cont),'Teste' + Convert(varchar(50),@cont))
    		set @cont = @cont + 1
    	end
    
    	
    	declare @varInicio int
    	declare @varFim int
    	declare @varQuantReg int
    	declare @varTotal int
    
    	set @varInicio = 1	
    	set @varQuantReg = 500 --AQUI VC INDICA DE QUANTO EM QUANTO VAI RETORNAR OS REGISTROS, NESSE EXEMPLO DE 500 EM 500
    	set @varFim = @varQuantReg
    
    	set @varTotal = (SELECT COUNT(*) AS TOTAL FROM #temp)
    
    	while @varInicio<=@varTotal
    	begin
    
    		--AQUI SÓ COLOQUEI O SELECT, MAIS PODERIA ADICIONAR O INSERT SELECT
    		SELECT * FROM (SELECT *, ROW_NUMBER() OVER (ORDER BY RAND()) AS ROW_NUM FROM #temp) AS SQL1 WHERE ROW_NUM BETWEEN @varInicio AND @varFim
    
    		set @varInicio = @varFim+1
    		set @varFim = @varFim + @varQuantReg
    
    	end
    
    	DROP TABLE #temp


    msn: poseidonfba@hotmail.com
    quinta-feira, 29 de abril de 2010 16:19
  • Poseidon, já me passaram essa idéia, mas eu quero fazer isso usando cursor e não sei como!
    sexta-feira, 30 de abril de 2010 13:06
  • Letícia,

    Veja se este código de exemplo ajuda:

     

    /************************************************************/
    --CURSOR NEXT--

    DECLARE @REGISTRO INT,
                 @CODIGO INT,
                 @DESCRICAO VARCHAR(50)

    SET @REGISTRO=0

    DECLARE PRODUTOS_CURSOR CURSOR FOR
     SELECT CODIGO, DESCRICAO FROM PRODUTOS
     OPEN PRODUTOS_CURSOR
     
     WHILE @REGISTRO <=10
      BEGIN
       FETCH NEXT FROM PRODUTOS_CURSOR
       INTO @CODIGO, @DESCRICAO
      
       INSERT INTO TESTE VALUES(@CODIGO, @DESCRICAO)

       SET @REGISTRO=@REGISTRO+1
      
       PRINT 'Código:'+CAST(@CODIGO AS VARCHAR(20))+' Declaração:'+@DESCRICAO
      END
      CLOSE PRODUTOS_CURSOR
     DEALLOCATE PRODUTOS_CURSOR

    CREATE TABLE TESTE(CODIGO INT, DESCRICAO VARCHAR(50))
    SELECT * FROM TESTE

    /************************************************************/
    -- CURSOR LAST --

    DECLARE PRODUTOS_CURSOR SCROLL CURSOR FOR
     SELECT CODIGO, DESCRICAO FROM PRODUTOS
     OPEN PRODUTOS_CURSOR
     
     WHILE @REGISTRO <=10
      BEGIN
       FETCH LAST FROM PRODUTOS_CURSOR

    /************************************************************/
    -- CURSOR PRIOR --

    DECLARE PRODUTOS_CURSOR SCROLL CURSOR FOR
     SELECT CODIGO, DESCRICAO FROM PRODUTOS
     OPEN PRODUTOS_CURSOR
     
     WHILE @REGISTRO <=10
      BEGIN
       FETCH PRIOR FROM PRODUTOS_CURSOR

    /************************************************************/
    -- CURSOR FIRST --

    DECLARE PRODUTOS_CURSOR SCROLL CURSOR FOR
     SELECT CODIGO, DESCRICAO FROM PRODUTOS
     OPEN PRODUTOS_CURSOR
     
     WHILE @REGISTRO <=10
      BEGIN
       FETCH FIRST FROM PRODUTOS_CURSOR

    /************************************************************/


    Declare @CodSequencial Int,
            @Contador Int,
            @CodRelacionamento Int,
            @NovoCodSequencial Int
      
            
    Set @Contador=0
    Set @CodRelacionamento=0
    Set @NovoCodSequencial=-1

    DECLARE Contador_Cursor CURSOR FOR
     SELECT CodSequencialProduto FROM PQCxME Order By CodSequencialProduto
      OPEN Contador_Cursor

    While @Contador <=(Select Count(CodSequencialProduto) from PQCxME)
     Begin
     
      FETCH NEXT FROM Contador_Cursor
      INTO @CodSequencial

      If @CodSequencial <> @NovoCodSequencial
       Begin
        Set @NovoCodSequencial = @CodSequencial
     
        Set @CodRelacionamento=@CodRelacionamento+1
       
        Update PQCxME
        Set CodRelacionamento=@CodRelacionamento
        Where CodSequencialProduto=@NovoCodSequencial
       End

       SET @Contador=@Contador+1  
     END

    CLOSE Contador_Cursor
    DEALLOCATE Contador_Cursor


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário]
    segunda-feira, 3 de maio de 2010 17:56