Inquiridor
fetch forward

Pergunta
-
Estou tentando exibir 5 linhas com um cursor, dá o seguinte erroMsg 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 cTesteDEALLOCATE cTesteEND
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 -
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!
-
-
-
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 -
-
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 -
-
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_CURSORCREATE 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=-1DECLARE Contador_Cursor CURSOR FOR
SELECT CodSequencialProduto FROM PQCxME Order By CodSequencialProduto
OPEN Contador_CursorWhile @Contador <=(Select Count(CodSequencialProduto) from PQCxME)
Begin
FETCH NEXT FROM Contador_Cursor
INTO @CodSequencialIf @CodSequencial <> @NovoCodSequencial
Begin
Set @NovoCodSequencial = @CodSequencial
Set @CodRelacionamento=@CodRelacionamento+1
Update PQCxME
Set CodRelacionamento=@CodRelacionamento
Where CodSequencialProduto=@NovoCodSequencial
EndSET @Contador=@Contador+1
ENDCLOSE 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]