首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在oracle中使用存储过程进行分页和排序

问在oracle中使用存储过程进行分页和排序
EN

Stack Overflow用户
提问于 2014-09-10 11:49:32
回答 2查看 5.2K关注 0票数 3

我创建了一个用于分页的存储过程。现在我正在寻找列排序。

我的工作分页存储过程:

代码语言:javascript
复制
PROCEDURE paging (PageSize     IN     INT,
                  PageIndex    IN     INT,
                  SortColumn   IN     VARCHAR,
                  PageData        OUT Page) AS
    FirstIndex   INT;
    LastIndex    INT;
    SortCol      VARCHAR;
BEGIN
    LastIndex := PageSize * (PageIndex + 1);
    FirstIndex := LastIndex - PageSize + 1;
    SortCol := SortColumn;

    OPEN PageData FOR
        SELECT *
          FROM (SELECT a.*, ROWNUM AS rnum
                  FROM (  SELECT *
                            FROM table_name
                        ORDER BY SortCol) a
                 WHERE ROWNUM <= LastIndex)
         WHERE rnum >= FirstIndex;
END paging;
/
EN

回答 2

Stack Overflow用户

发布于 2014-09-10 17:39:44

我建议您使用一个很棒的特性,称为Dynamic SQL (Oracle Docs)。

我还修改了您的SQL查询,使用了ROW_NUMBER()而不是rownum。与后者相比,它是一种更健壮的对输出行进行排序和编号的方法。

我还从PL/SQL中删除了一些我认为不需要的变量:

代码语言:javascript
复制
PROCEDURE paging (PageSize     IN     INT,
                  PageIndex    IN     INT,
                  SortColumn   IN     VARCHAR2, -- Assuming this always contains
                                                -- the ordering column name
                  PageData        OUT Page) AS
    FirstIndex   INT;
    LastIndex    INT;
    v_sql        VARCHAR2(4000);
BEGIN
    LastIndex := PageSize * (PageIndex + 1);
    FirstIndex := LastIndex - PageSize + 1;

    v_sql :=  'SELECT *'
            ||'  FROM (SELECT a.*,'
            ||'              ROW_NUMBER() '
            ||'                OVER (ORDER BY ' || SortColumn || ') AS rnum'
            ||'          FROM table_name a)'
            ||' WHERE rnum BETWEEN FirstIndex AND LastIndex';

    OPEN PageData FOR v_sql;

END paging;
/
票数 3
EN

Stack Overflow用户

发布于 2017-07-21 13:56:01

仅此SP就可以完成Oracle中的所有三件事,Paging, Sorting and Filtering of records。

代码语言:javascript
复制
create or replace procedure GetResults 
(
 p_userId In Number,
 p_dueDateFrom In Date,
 p_dueDateTo in Date,
 p_durationMax in Number,
 p_durationMin in Number,
 p_sortColumn In Varchar2,
 p_sortOrder In Varchar2,
 p_pageSize In Number,
 p_pageIndex in number,
 cv_1 OUT SYS_REFCURSOR
)
as 
v_FirstIndex   NUMBER;
v_LastIndex    NUMBER;
begin
-- Paging
  v_LastIndex := p_pageSize * (p_pageIndex + 1);
  v_FirstIndex := v_LastIndex - p_pageSize + 1;

 OPEN cv_1 FOR 

  SELECT * FROM (SELECT a.*, ROWNUM AS rnum
              FROM (Select * From Newjob nj Where nj.userId = p_userId  
               -- Filtering
             And ((p_dueDateFrom IS NULL AND p_dueDateTo Is NULL) OR 
                  (nj.Due_Date >= p_dueDateFrom and nj.Due_Date <= p_dueDateTo)
                 )
             And ((p_durationMax IS NULL AND p_durationMin Is NULL) OR 
                  (nj.Duration >= p_durationMax and nj.Duration <= p_durationMin)
                 )   
             -- Sorting     
            order by   
            Case when p_sortOrder = 'Ascending' And p_sortColumn = 'DUE_DATE' then  nj.Due_Date End,
            Case When p_sortOrder = 'Ascending' And p_sortColumn = 'DURATION' then nj.DURATION end,     
            Case when p_sortOrder = 'Descending' And p_sortColumn = 'DUE_DATE' then  nj.Due_Date End desc,
            Case When p_sortOrder = 'Descending' And p_sortColumn = 'DURATION' then nj.DURATION end desc)a
   WHERE ROWNUM <= v_LastIndex)    
   WHERE rnum >= v_FirstIndex;
end;
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25757014

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档