Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Muita gente vive discutindo sobre isso e cá estou eu com problemas com o rownum... quero por meio de uma função gerar um número randômico usando o dbms_random e pegar numa tabela a tupla q contem o rownum igual a esse valor gerado aleatoriamente, se alguém puder me ajudar, fico agradecido.
Eu li em alguns fóruns estrangeiros que o Rownum só funciona quando tu busca pela linha 1, ou seja:select from tabela where rownum = 1;1 linha retornada.------select from tabela where rownum = 2;0 linhas retornadas.------E assim sucessivamente portanto, não se pode usar o rownum quando se quer buscar uma linha específica da tabela.Exemplo prático para esse tipo de busca: - Buscar o 3º colocado na chegada da corrida e adicionar no prêmio "500 reais" (levando em conta que o cadastro na tabela foi feito por ordem de chegada no fim da corrida)
Encontrei uma forma de fazê-lo mas a performance não fica bem o esperado com muitos registros:
- Digamos que a linha desejada seja a linha de número 3:
(select produto from ricardo_pro where rownum <= 3)
minus
(select produto from ricardo_pro where rownum <= 2);
[http://forum.imasters.com.br/public/style_emoticons/](http://forum.imasters.com.br/public/style_emoticons/)default/grin.gifOPA! Quem disse que ROWNUM serve só para a 1º linha irá para o LIMBO!
HAehehaehaheaheaheaheaheh
Que isso... o rownum é um pseudo-código do Oracle para identificar os registros, ou melhot dizendo as TUPLAS!
Tu pode fazer um teste simples usando seu exemplo, para os 5 primeiros colocados.
SQL > select * from tabela where rownum between 1 and 5;
Olha que maravilha... heheheheheheheh [http://forum.imasters.com.br/public/style_emoticons/](http://forum.imasters.com.br/public/style_emoticons/)default/joia.gif
Abraços, Brow...retornar um conjunto de linhas ele serve mas eu precisava retornar uma linha específica
>
SQL > select * from tabela where rownum between 1 and 5;
já tentou rodar por exemplo "between 6 and 10" ? aqui pra mim no Oracle 8i ele não retorno nenhuma linha sendo que a tabela testada tem em torno de 5 mil tuplas...
Simples,
Na sua tabela como está com alguns registros, e nela está sofreu algumas DELEÇÕES, então o Oracle não está com os rowids organizados.
Passe um analyze table OWNER.SUA_TABELA compute statistics;
Que seu select anterior irá rodar.
Abraços, [http://forum.imasters.com.br/public/style_emoticons/](http://forum.imasters.com.br/public/style_emoticons/)default/bye1.gifRapaz,
ja tive um problema desses...
Vou mandar um script que fiz pra você dar uma olhada...
1) Faz um select de count(*) de determinadas tuplas, colocando o valor nunha variavel qualquer, ela servira para o FOR neste script abaixo;
2) Faz o FOR a partir dessa variavel
FOR I IN 1 .. VAR_COUNT LOOP
IF(I = VAR_COUNT) THEN
SELECT MAX(SUBSTR(TO_CHAR(DATA, 'DD/MM/YYYY HH24:MI:SS'), 12, 8)) INTO VAR_DATA
FROM (SELECT * FROM tabela WHERE TO_CHAR(DATA, 'DD/MM/YYYY') = TO_CHAR(SYSDATE, 'DD/MM/YYYY') AND NOME = algum_nome ORDER BY DATA)
WHERE NOME = algum_nome AND ROWNUM BETWEEN 0 AND I;
ELSE
alguma coisa...
END IF;
END LOOP;
Esse script e bem complexo, coloquei uma parte dele pra ver se quebra seu galho...
Tipo, presta a atencao la no BETWEEN, e no MAX la do select,
agora so vai pegar um campo, no meu caso so precisei de um campo mesmo,
caso queira mais de um campo, você tera que fazer um GROUP BY,
Acho que com isso da pra resolver seu problema,
http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif
>
Simples,
Na sua tabela como está com alguns registros, e nela está sofreu algumas DELEÇÕES, então o Oracle não está com os rowids organizados.
Passe um analyze table OWNER.SUA_TABELA compute statistics;
Que seu select anterior irá rodar.
Abraços, [http://forum.imasters.com.br/public/style_emoticons/](http://forum.imasters.com.br/public/style_emoticons/)default/bye1.gif
[](/topic/130680-rownum/?do=findComment&comment=353755)
A minha tabela já estava organizada e mesmo assim não consigo rodar um "rownum between x and y"... quanto ao meu sql usando MINUS, está funcionando perfeitamente mas quando a linha tem um número grande, por exemplo 6790, aí o oracle da uma paradinha até buscar tudo pois são 2 selects...
>
Rapaz,
ja tive um problema desses...
Vou mandar um script que fiz pra você dar uma olhada...
1) Faz um select de count(*) de determinadas tuplas, colocando o valor nunha variavel qualquer, ela servira para o FOR neste script abaixo;
2) Faz o FOR a partir dessa variavel
FOR I IN 1 .. VAR_COUNT LOOP
IF(I = VAR_COUNT) THEN
SELECT MAX(SUBSTR(TO_CHAR(DATA, 'DD/MM/YYYY HH24:MI:SS'), 12, 8)) INTO VAR_DATA
FROM (SELECT * FROM tabela WHERE TO_CHAR(DATA, 'DD/MM/YYYY') = TO_CHAR(SYSDATE, 'DD/MM/YYYY') AND NOME = algum_nome ORDER BY DATA)
WHERE NOME = algum_nome AND ROWNUM BETWEEN 0 AND I;
ELSE
alguma coisa...
END IF;
END LOOP;
Esse script e bem complexo, coloquei uma parte dele pra ver se quebra seu galho...
Tipo, presta a atencao la no BETWEEN, e no MAX la do select,
agora so vai pegar um campo, no meu caso so precisei de um campo mesmo,
caso queira mais de um campo, você tera que fazer um GROUP BY,
Acho que com isso da pra resolver seu problema,
http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif
[](/topic/130680-rownum/?do=findComment&comment=354019)
o seu script é interessante mas o seu between é entre 0 e I, ou seja, é quase o mesmo do meu select com minus pois você está fazendo 2 selects pegando do início até a linha desejada. só para completar, você está usando um "where nome = algum_nome" e no caso eu preciso de toda tupla sem saber nada contido nela... é uma escolha randomica na tabela.
vou continuar buscando uma maneira rápida de buscar linhas e agradeço aos que tentaram me ajudar, qualquer novidade eu colocarei aqui.
http://forum.imasters.com.br/public/style_emoticons/default/grin.gif
Lembrando só para ter certeza. ROWNUM sempre começa do 1 em diante certo? Não existe rownum igual a zero. Concordam? Abraços, :o
mas o oracle aceita por exemplo "between 0 and 150"
Aceita sim,
pode fazer tranquilo.
Se você precisar de mais campos no exemplo que coloquei acima você pode pegar o codigo que ele retorna e fazer um SELECT a partir dele
beleza?
http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif
Aceita pq é apenas referência de valores númericos.
Mais ROWNUM = 0 não existe....
Retornará nenhum registro....
Pode testar!!! http://forum.imasters.com.br/public/style_emoticons/default/shifty.gif
usando o operador de igualdade, o rownum só retorna a linha 1... qualquer outra ele não retorna nada
http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif
Galera,O Between = 0 num retorna nada mesmo,mas quando colocamos BETWEEN 0 and X (numero escolhido);sera retornado os valores ENTRE o 0 e o numero escolhido,nakele script que mandei pra Rick,ele esta retornando um CAMPO da 1° linha dakele SELECT,você pode pegar o ROWNUM ou ROWID a partir desse CAMPO e pegar a linha inteira se necessário,Tipo, presta a atencao no MAX la do select... B)
a coisa mais simples a fazer e mais eficaz (na minha opinião) é criar uma visão contendo o rownum com um nome alternativo e fazer a consulta em cima dessa visão, ex:
tabela tb_tabela(campo1, campo2, campo3)
--------------
create view vw_tabela
as
select rownum rn, campo1, campo2, campo3 from tb_tabela;
--------------
select * from vw_tabela where rn = 3;
--------------
funciona para qualquer linha, qualquer intervalo de tempo e tudo o que for imaginado usando linhas
http://forum.imasters.com.br/public/style_emoticons/default/joia.gif
Rick,
boaa!
Acabou com a confusão,
hehehehehe
http://forum.imasters.com.br/public/style_emoticons/default/clap.gif
http://forum.imasters.com.br/public/style_emoticons/default/clap.gif