Paginação

Dúvidas, dicas e truques de SQL, Select, Update, Delete, cláusulas, operações com joins, Funções em SQLs, etc
  

Mensagemem Ter, 26 Out 2004 12:03 pm

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
edu_oracle
Localização: Salvador

Atenciosamente,

Eduardo Santana

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

Mensagemem Ter, 26 Out 2004 1:26 pm

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

Código: Selecionar todos
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.
dr_gori
Localização: Portland, OR USA

Thomas F. G

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

Mensagemem Ter, 23 Nov 2004 3:45 pm

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

Código: Selecionar todos
select *
  from ( select a.*, rownum rnum
           from ( SEU_SQL_VAI_AQUI -- com order by ) a
          where rownum <= MAX_ROWS )
where rnum >= MIN_ROWS
/


Exemplo:
Código: Selecionar todos
select *
  from ( select a.*, rownum rnum
           from
  (select  'numero '||rownum campo
  from all_tables
  ) a
where rownum <= 30 )
where rnum >= 10
tfg
Localização: Novo Hamburgo - RS

Mensagemem Ter, 10 Ago 2010 2:19 pm

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.
Código: Selecionar todos
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:
Código: Selecionar todos
create or replace PACKAGE PKG_PORTAL
AS
   TYPE RCT1 IS REF CURSOR ;
   TRANCOUNT INTEGER := 0 ;
   IDENTITY INTEGER ;
END ;


alguém pode ajudar?
caracamaneh
Localização: rio de janeiro - RJ

Mensagemem Ter, 10 Ago 2010 3:06 pm

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:

Código: Selecionar todos
  teste
SergioLBJr
Localização: Parobé - RS

Sérgio Luiz Bonemberger Junior
Programador Junior
Parobé RS

[]s

Mensagemem Ter, 10 Ago 2010 5:26 pm

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 :

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
burga
Localização: SP

Mensagemem Qua, 11 Ago 2010 10:48 am

O erro que apresenta é o seguinte:
Error(22,1): PL/SQL: SQL Statement ignored
Error(23,22): PL/SQL: ORA-00918: column ambiguously defined
caracamaneh
Localização: rio de janeiro - RJ

Mensagemem Qua, 11 Ago 2010 10:52 am

O erro é nessa linha
Código: Selecionar todos
SELECT *
  FROM ( SELECT topn.*, ROWNUM rnum FROM (
SELECT


Error(18,1): PL/SQL: SQL Statement ignored
Error(19,22): PL/SQL: ORA-00918: column ambiguously defined
caracamaneh
Localização: rio de janeiro - RJ

Mensagemem Qua, 11 Ago 2010 1:29 pm

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 :

Código: Selecionar todos
SELECT *
  FROM ( SELECT topn.*, topn.ROWNUM rnum FROM (
SELECT


lembrando que neste exemplo eu busco o rownum da topn
SergioLBJr
Localização: Parobé - RS

Sérgio Luiz Bonemberger Junior
Programador Junior
Parobé RS

[]s

Mensagemem Qua, 11 Ago 2010 3:50 pm

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.
rogenaro
Localização: Londrina - PR

Rafael O. Genaro

Mensagemem Qua, 11 Ago 2010 6:03 pm

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.
caracamaneh
Localização: rio de janeiro - RJ


  • Veja também
    Respostas
    ExibiÇões
    Última mensagem


      Voltar para SQL

      Quem está online

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