oracle如何分页存储,oracle分页的几种方式

求一个通用ORACLE存储过程,实现分页和查询?

create

创新互联专注于合川网站建设服务及定制,我们拥有丰富的企业做网站经验。 热诚为您提供合川营销型网站建设,合川网站制作、合川网页设计、合川网站官网定制、微信平台小程序开发服务,打造合川网络公司原创品牌,更为您提供合川网站排名全网营销落地服务。

or

replace

package

Tools

is

type

ResultData

is

ref

cursor;

procedure

sp_Page(p_PageSize

int,

--每页记录数

p_PageNo

int,

--当前页码,从

1

开始

p_SqlSelect

varchar2,

--查询语句,含排序部分

p_SqlCount

varchar2,

--获取记录总数的查询语句

p_OutRecordCount

out

int,--返回总记录数

p_OutCursor

out

ResultData);

end

Tools;

create

or

replace

package

body

Tools

is

procedure

sp_Page(p_PageSize

int,

--每页记录数

p_PageNo

int,

--当前页码,从

1

开始

p_SqlSelect

varchar2,

--查询语句,含排序部分

p_SqlCount

varchar2,

--获取记录总数的查询语句

p_OutRecordCount

out

int,--返回总记录数

p_OutCursor

out

ResultData)

as

v_sql

varchar2(3000);

v_count

int;

v_heiRownum

int;

v_lowRownum

int;

begin

----取记录总数

execute

immediate

p_SqlCount

into

v_count;

p_OutRecordCount

:=

v_count;

----执行分页查询

v_heiRownum

:=

p_PageNo

*

p_PageSize;

v_lowRownum

:=

v_heiRownum

-

p_PageSize

+1;

v_sql

:=

'SELECT

*

FROM

(

SELECT

A.*,

rownum

rn

FROM

('||

p_SqlSelect

||')

A

WHERE

rownum

=

'||

to_char(v_heiRownum)

||

'

)

B

WHERE

rn

=

'

||

to_char(v_lowRownum)

;

--注意对rownum别名的使用,第一次直接用rownum,第二次一定要用别名rn

OPEN

p_OutCursor

FOR

v_sql;

end

sp_Page;

end

Tools;

如何在Oracle存储过程中实现分页

我以前写过一个

PLSQL通用 分页 Function,可以参考一下我的博客:

oracle存储过程的分页

调用的时候这样

declare

ocur tespackage.test_cursor;

v_count int:=0;

v_pagecount int :=0;

v_out int;

begin

fenye('table1',20,1,v_count,v_pagecount,ocur);

loop

fetch ocur into v_out ;

exit when ocur%notfound ;

dbms_output.put_line('count='||v_count);

end loop;

end ;

/

oracle怎么实现分页

因为Oracle数据库没有Top关键字,所以这里就不能够像微软的数据据那样操作,这里有两种方法:

一种是利用相反的。

PAGESIZE:每页显示的记录数

CURRENTPAGE:当前页号

数据表的名字是:components

索引主键字是:id

select * from components where id not in(select id from components where rownum=(PAGESIZE*(CURRENTPAGE-1))) and rownum=PAGESIZE order by id;

如下例:

select * from components where id not in(select id from components where rownum=100) and rownum=10 order by id;

从101到记录开始选择,选择前面10条。

使用minus,即中文的意思就是减去,呵呵,这语句非常的有意思,也非常好记

select * from components where rownum=(PAGESIZE*(CURRENTPAGE-1)) minus select * from components where rownum=(PAGESIZE*(CURRENTPAGE-2));

如例:select * from components where rownum=10 minus select * from

一种是利用Oracle的rownum,这个是Oracle查询自动返回的序号,一般不显示,但是可以通过select rownum from [表名],可以看到,是从1到当前的记录总数。

select * from (select rownum tid,components.* from components where rownum=100) where tid=10;

oracle:写一个用于分页的存储过程.调用的时候可以传参

select

*

from

(select

a.*,rownum

r

from

(select

*

from

table_a)

a

where

rownum=b)

where

r=a

该sql语句实现了分页查询。

其中table_a表示你要查询的那张表,r=a,rownum=b中的a和b表示需要查询的记录的起止数。

需要做分页的话,上面的b可以改成currentPage*pageCount,a可以改成(currentPage-1)*pageCount,

currentPage表示当前页数,pageCount表示总页数

oracle做分页查询怎么做?

sql语句如下:

分页1

SELECT *

FROM (Select ROWNUM AS ROWNO, T.*

from 表名 T(别名)

where 表字段 between to_date('20060501', 'yyyymmdd') and  to_date('20060731', 'yyyymmdd')

AND ROWNUM = 20) TABLE_ALIAS

WHERE TABLE_ALIAS.ROWNO = 10;

经过测试,此方法成本最低,只嵌套一层,速度最快,即使查询的数据量再大,也几乎不受影响,速度依然.

分页2:

SELECT *

FROM (SELECT TT.*, ROWNUM AS ROWNO

FROM (Select t.*

    from 表名 T(别名)

    where flight_date between to_date('20060501', 'yyyymmdd') and

       to_date('20060531', 'yyyymmdd')

    ORDER BY FACT_UP_TIME, flight_no) TT(别名二)

WHERE ROWNUM = 20) TABLE_ALIAS

where TABLE_ALIAS.rowno = 10;

经过测试,此方法随着查询范围的扩大,速度也会越来越慢,


当前题目:oracle如何分页存储,oracle分页的几种方式
标题URL:http://scjbc.cn/article/heddid.html

其他资讯