Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

rick_simmons

Rownum

Recommended Posts

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.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tu já tento colocar rownum dentro do select para exibir seu pseudo-código.

 

Isso é uma coisa interessante... vamos ver...

 

Abraços,

 

http://forum.imasters.com.br/public/style_emoticons/default/grin.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

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)

Compartilhar este post


Link para o post
Compartilhar em outros sites

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/default/grin.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

OPA! 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/default/joia.gif

 

Abraços, Brow...

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

Compartilhar este post


Link para o post
Compartilhar em outros sites

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/default/bye1.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

Compartilhar este post


Link para o post
Compartilhar em outros sites

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/default/bye1.gif

<{POST_SNAPBACK}>

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

<{POST_SNAPBACK}>

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

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

Compartilhar este post


Link para o post
Compartilhar em outros sites

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)

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.