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

PAN*_*786 5 sql oracle stored-procedures

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

我的工作分页存储过程:

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;
/
Run Code Online (Sandbox Code Playgroud)

Rac*_*cha 4

我建议您使用一个称为动态 SQL(Oracle 文档)的出色功能。

我还修改了您的 SQL 查询并ROW_NUMBER()使用rownum. 它是一种比后者更可靠的对输出行进行排序和编号的方法。

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

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;
/
Run Code Online (Sandbox Code Playgroud)