求一个通用ORACLE存储过程,实现分页和查询?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了求一个通用ORACLE存储过程,实现分页和查询?相关的知识,希望对你有一定的参考价值。
参考技术A createor
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; 参考技术B 数据库中定义一个包,定义游标类型,比如可以这样:
create
or
replace
package
package_name
as
type
outcur
is
ref
cursor;
end
;
然后存储过程返回结果集:
create
procedure
ttt(
p_cur
out
package_name.outcur)
as
begin
open
p_cur
for
select
...;
end;
这样就可以返回结果集了.
如果数据量太大,返回全部记录再通过程序控制分页意义不大,效率同样太低,楼上的那个rownbr我没听过,只知道rownum,但这个伪列是不能满足分页要求的,如果数据量非常大,快速分页的话可以考虑用rowid这个列,
试试
select
rowid
from
任意表;
能看出结果了吧.剩下的自己想办法吧.
oracle分页查询,一个select语句解决,不需要子查询。
select column1, column2from (select rownum recno, column1, column2
from table_name
order by column1)
where recno between N and N+10
不用子查询似乎不可能,上面语句可以输入参数实现分页查询,要不就食用存储过程。 参考技术A oracle没有这么简单的分页查询~
mysql和sqlserver倒是有关键字可以直接限定返回结果集,oracle是不行滴~ 参考技术B select * from (select t1.*,rownum rn from (select * from '||tablename||')t1 where rownum>='||v_end||')where rn>='||v_begin';
以上是关于求一个通用ORACLE存储过程,实现分页和查询?的主要内容,如果未能解决你的问题,请参考以下文章