下面是我用sql server 2000写的存储过程分页,怎么把它改成oracle的存储过程:
--根据传进来的类型id自定义分页绑定数据
create proc more_message
(
@t_id int,--传过来的id
@PageIndex int,--显示哪一页
@PageSize int ,--每页显示多少行
@PageCount int output--总共多少页
)
as
declare @total_cow int--定义总的行数
set @total_cow=(select count(*) from article where t_id=@t_id)
if (@total_cow%@PageSize)>0
begin
set @PageCount=(@total_cow/@PageSize)+1
end
if (@total_cow%@PageSize)=0
begin
set @PageCount=(@total_cow/@PageSize)
enddeclare @Page_before int --定义要显示的页面前面有多少行
set @Page_before=@PageSize*@PageIndexdeclare @sqlstr varchar(2000)
set @sqlstr='select top '+cast(@PageSize as varchar)+'* from article
where t_id='+cast(@t_id as varchar)+' and a_id not in(
select top '+cast(@Page_before as varchar)+'a_id from article
where t_id='+cast(@t_id as varchar)+' order by a_time desc
) order by a_time desc'
exec(@sqlstr)GO
或者谁有写过oracle存储过程分页的发一个上来看看。
--根据传进来的类型id自定义分页绑定数据
create proc more_message
(
@t_id int,--传过来的id
@PageIndex int,--显示哪一页
@PageSize int ,--每页显示多少行
@PageCount int output--总共多少页
)
as
declare @total_cow int--定义总的行数
set @total_cow=(select count(*) from article where t_id=@t_id)
if (@total_cow%@PageSize)>0
begin
set @PageCount=(@total_cow/@PageSize)+1
end
if (@total_cow%@PageSize)=0
begin
set @PageCount=(@total_cow/@PageSize)
enddeclare @Page_before int --定义要显示的页面前面有多少行
set @Page_before=@PageSize*@PageIndexdeclare @sqlstr varchar(2000)
set @sqlstr='select top '+cast(@PageSize as varchar)+'* from article
where t_id='+cast(@t_id as varchar)+' and a_id not in(
select top '+cast(@Page_before as varchar)+'a_id from article
where t_id='+cast(@t_id as varchar)+' order by a_time desc
) order by a_time desc'
exec(@sqlstr)GO
或者谁有写过oracle存储过程分页的发一个上来看看。
解决方案 »
- 简单的问题不会
- oracle用127.0.0.1接连不上
- 2个to_date函数相减问题;
- 如何用触发器记录对表执行的SQL语句(INSERT,UPDATE,DELETE)?
- 请教:oracle10g导入导出的问题。请高手赐教!
- 求取资料
- 批量更新有重复记录,怎么办
- 高分请教! Oracle中的初始化参数文件initxxxx.ora中的各种值如 : shared_pool_size , sort_area_size等等应该如何根据实际情况来分配及赋
- 求SQL SEVER与ORACLE都精通高手,急
- oracle 有没有类似于SQL Server Profiler这样的工具
- 怎样让order by提高查询速度--oracle?
- oracle developer suite 10g如何将form发布到web上?
如:select * from (select table.*,row_number over(order by aa desc) rk from table ) where rk>=1 and rk<=100
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;
1、存储过程传入(in)当前页数(页码)和每页显示记录数
2、根据1中传入的两个参数curr_page,count_records写查询语句
查询结果的rownum满足以下关系:
(curr_page-1)*count_records < rownum <= curr_page*count_records
做到以上两点,即实现分页
allcount int;
type cur is ref cursor;
begin
tools.sp_Page(3,2,'select * from emp','select count(*) from emp',allcount,cur);
dbms_output.put_line(allcount);
dbms_output.put_line(cur);
end;
/
自己又不懂.还有的,对于上面这个存储过程,为什么不能直接用 rownum <= '|| to_char(v_heiRownum) || ' AND rownum >= ' || to_char(v_lowRownum)????