oracle结果集的分页,由存储过程返回

时间:2010-09-15 12:28:18

标签: sql oracle stored-procedures pagination

在我们的项目中,我们将所有数据库操作都集中在Oracle存储过程中。结果集由SYS_REFCURSOR类型的OUT参数返回。现在我们有一个分页任务,我们不想重写所有程序,向它们添加2个参数(pageNumber和pageSize)并编辑WHERE子句。我们有一个想法,可以编写某种类型的包装程序,它可以调用每个存储过程,从返回的结果集中获取切片并将其传递出去。问题是所有程序都有不同的参数列表,所以我们不知道如何在包装器中实现它。

有人可以帮助我们吗?也许我们可以使用Java存储过程来解决它?也许,我们可以用不同的方式解决它,而不是使用包装器?

抱歉我的英文。

THX。

3 个答案:

答案 0 :(得分:1)

你使用存储过程来执行选择很好,但不幸的是你没有预先考虑所有的要求 - 我猜的敏捷项目;-)我真的认为唯一可行的方法是修改存储过程。那里有多少?如果它非常多,则可能存在编写程序以自动执行任务的情况 - 即读取过程源,添加参数和额外的WHERE子句代码。

答案 1 :(得分:1)

这可能有用,但它是

  • 未经测试,
  • 可能不切实际,因为它依赖于称为字符串的存储过程,
  • 可能表现不佳,因为它
    • 使用动态SQL和
    • 重新运行基础SQL以进行分页;和
  • 未经测试。
create or replace function paginate_sys_refcursor
  (p_page_number   in number,
   p_rows_per_page in number,
   p_sp_call       in varchar2(4000))
return sys_refcursor
authid current_user
as
  open p_sysref_cursor for
    'select *  ' || 
    '  from (select c.*, rownum as rn ' ||
    '          from cursor(' || p_sp_call || ')' ||
    '         where rownum = ' || (p_page_number - 1) * rows_per_page ;
    ' where rn >= ' || (p_page_number - 1) * rows_per_page ;

  return p_sysref_cursor;
end paginate_sys_refcursor;

答案 2 :(得分:0)

您如何调用存储过程?您是否直接从调用程序打印结果?听起来您可能想要查看可以处理打印的报告工具。