Paginação

Dúvidas, dicas e truques de SQL, Select, Update, Delete, cláusulas, operações com joins, Funções em SQLs, etc
edu_oracle
Moderador
Moderador
Mensagens: 53
Registrado em: Seg, 12 Jul 2004 11:24 am
Localização: Salvador
Atenciosamente,

Eduardo Santana

"Viva o dia de hoje como se fosse amanhã, por isso, não perca as oportunidades...."

Prezados,

Estamos com uma tela com uma pouco mais de mil registros e quando esta é selecionada ela traz todos os registros para a tela, deixando-a imensa.

eu quero paginá-la para a cada 100 registros ela ir pra outra página.

Alguém sabe como?

Espero noticas
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

Bem, tem uma forma que eu não sei se é a melhor...
Veja:

Selecionar tudo

select b.campo
from 
(
select rownum seq, a.*
from
  (select  'numero '||rownum campo      --> este é o SQL que você pode mduar. 
  from all_tables                                 
  ) a
order by a.campo
) b
where b.seq>=  ( 3 * 10 ) - 10
  and b.seq<     3 * 10
/
Esse exemplo vai pegar a pagina 3, quebrando de 10 em 10.
Avatar do usuário
tfg
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 83
Registrado em: Seg, 03 Mai 2004 3:38 pm
Localização: Novo Hamburgo - RS

O Thomas Kyte deu a seguinte dica sobre paginação:
http://asktom.oracle.com/pls/ask/f?p=49 ... 7412348064

Selecionar tudo

select * 
  from ( select a.*, rownum rnum
           from ( SEU_SQL_VAI_AQUI -- com order by ) a
          where rownum <= MAX_ROWS )
 where rnum >= MIN_ROWS
/
Exemplo:

Selecionar tudo

select *
  from ( select a.*, rownum rnum
           from
  (select  'numero '||rownum campo
  from all_tables
  ) a
where rownum <= 30 )
 where rnum >= 10
caracamaneh
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 4
Registrado em: Seg, 09 Ago 2010 3:14 pm
Localização: rio de janeiro - RJ

Tenho uma paginação, mas está dentro de um cursor e não funciona de jeito nenhum com a dica acima.
O script da procedure com erro e do package referenciado por ela seguem abaixo.

Selecionar tudo

create or replace
PROCEDURE SUPPSEARCH (
    v_cursor IN OUT PKG_PORTAL.RCT1 ,
    v_dateNow IN VARCHAR2,
   v_country IN VARCHAR2,
   v_city IN VARCHAR2,
   v_praticeField IN NUMBER,
   v_title IN VARCHAR2,
   v_currentPage IN INTEGER ,
   v_pageSize IN INTEGER ,
   v_status IN VARCHAR2
)
AS
BEGIN

OPEN v_cursor FOR

SELECT * 
  FROM ( SELECT topn.*, ROWNUM rnum FROM (
SELECT
   S.SUPPID,S.PRAREAID,S.SUPPDATENOW,S.SUPPSTATUS,suppDateNow,P.counNamePT AS suppCountry,PR.prareaTitle
FROM 
  Supplier S
inner join 
  country p 
    on p.counId = s.counId 
inner join 
  pracarea pr 
    on s.prareaId = pr.prareaId
where
  TO_CHAR( s.suppDateNow, 'DD/MM/YYYY' ) = NVL( v_dateNow, TO_CHAR( s.suppDateNow, 'DD/MM/YYYY' ) )
and
  S.counId = NVL( v_country, S.counId )
and
  S.suppCity LIKE '%' || v_city || '%'
and
  S.prareaId = NVL( v_praticeField, S.prareaId )
and
  S.suppStatus = NVL(v_status,s.suppStatus)

order by S.SUPPID; 
 ) topn where ROWNUM <= ( ( ( v_currentPage + 1 ) * v_pageSize )  ) ) where rnum  >= ( v_currentPage * v_pageSize );
END;

Agora o codigo do Package:

Selecionar tudo

create or replace PACKAGE PKG_PORTAL
AS
	TYPE RCT1 IS REF CURSOR ;
	TRANCOUNT INTEGER := 0 ;
	IDENTITY INTEGER ;
END ;
alguém pode ajudar?
SergioLBJr
Rank: Oracle Guru
Rank: Oracle Guru
Mensagens: 448
Registrado em: Ter, 16 Jun 2009 3:07 pm
Localização: Parobé - RS
Sérgio Luiz Bonemberger Junior
Programador Junior
Parobé RS

[]s

Qual o erro que esta aparecendo??


Obs: sempre que for postar código utilize a tag code dae fica mais facil para todo mundo ler

ex:
burga
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 232
Registrado em: Qui, 26 Nov 2009 1:05 pm
Localização: SP

Em uma lista de discussão um usuário fez esta mesma pergunta a poucos dias, segue a resposta do Chiappa:
A técnica básica é algo do tipo :

Selecionar tudo

select *
from ( select /*+ FIRST_ROWS(n) */
a.*, ROWNUM rnum
from ( aqui entra a sua SELECT com order by ) a
where ROWNUM <=
:num_da_ultima_linha )
where rnum >= :num_da_primeira_linha;
Em http://asktom.oracle.com/pls/apex/f?p=1 ... 0346816567 se discute alguns pontos de performance, mas para apenas 350k linhas num hardware de produção dificilmente você deve ter qualquer issue...

[]s

Chiappa
caracamaneh
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 4
Registrado em: Seg, 09 Ago 2010 3:14 pm
Localização: rio de janeiro - RJ

O erro que apresenta é o seguinte:

Selecionar tudo

Error(22,1): PL/SQL: SQL Statement ignored
Error(23,22): PL/SQL: ORA-00918: column ambiguously defined
caracamaneh
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 4
Registrado em: Seg, 09 Ago 2010 3:14 pm
Localização: rio de janeiro - RJ

O erro é nessa linha

Selecionar tudo

SELECT * 
  FROM ( SELECT topn.*, ROWNUM rnum FROM (
SELECT

Selecionar tudo

Error(18,1): PL/SQL: SQL Statement ignored
Error(19,22): PL/SQL: ORA-00918: column ambiguously defined
SergioLBJr
Rank: Oracle Guru
Rank: Oracle Guru
Mensagens: 448
Registrado em: Ter, 16 Jun 2009 3:07 pm
Localização: Parobé - RS
Sérgio Luiz Bonemberger Junior
Programador Junior
Parobé RS

[]s

Este erro quer dizer que o oracle não sabe de qual tabela ele deve buscar o valor.

Você precisa definir em que tabela quer buscar o rownum.

Acredito que isso deva resolver :

Selecionar tudo

SELECT * 
  FROM ( SELECT topn.*, topn.ROWNUM rnum FROM ( 
SELECT
lembrando que neste exemplo eu busco o rownum da topn
rogenaro
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 232
Registrado em: Sex, 30 Mar 2007 7:26 pm
Localização: Londrina - PR
Rafael O. Genaro

Tem como postar a consulta inteira?

Duas colunas de tabelas diferentes estão com o mesmo nome em alguma query mais interna, causand o erro.
caracamaneh
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 4
Registrado em: Seg, 09 Ago 2010 3:14 pm
Localização: rio de janeiro - RJ

Rogenaro muito obrigado.
Na query mais interna havia a mesma coluna duas vezes na query.
Tinha suprimido isso quando postei o código porque são muuuuuitas colunas.
por isso não estava no código.
Mas seu post me fez pensar e conferir.
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 14 visitantes