代码之家  ›  专栏  ›  技术社区  ›  Niner

返回分页结果集的Oracle存储过程

  •  0
  • Niner  · 技术社区  · 14 年前

    Oracle存储过程是否有返回分页结果集(作为refcursor)的方法?例如,我想将要返回的记录数和感兴趣的页码传递给存储过程。然后我只想看到返回给我的客户的记录的数量。在甲骨文方面是如何做到的?

    var v_numrecords number := 30;
    var v_pagenum number: = 5;
    var v_rows refcursor;
    exec my_stored_proc(:v_rows, :v_numrecords, :v_pagenum);
    print v_rows;  -- expecting only 30 records of page number 5 back
    

    非常感谢。

    2 回复  |  直到 14 年前
        1
  •  2
  •   DOK    14 年前

    你可以使用 ROWNUM. 你需要应用它 之后 结果已排序。

    下面是一个例子:我们需要第6行到第10行。

       SELECT *
        FROM (SELECT e.*, ROWNUM rnum
              FROM (SELECT *
                    FROM employee
                    ORDER BY employee_id) e
              WHERE ROWNUM <= 10)
        WHERE rnum >= 6;
    

    要获取记录121到150,您应该用150替换内部select中的10,然后用121替换where子句中的6。

    在存储过程中,您将希望用变量替换这些硬编码的值。

        2
  •  2
  •   Adam Musch    14 年前

    如果您希望Oracle返回结果集的第n行到第m行,那么根据您的实际需要,您有几个选择。

    如果希望整个结果集是静态的-例如,第5页上的行将永远不会出现在任何其他页上,则必须:

    1. 打开整个结果集的光标,并在应用程序中执行分页。

    2. 让存储过程将整个结果集持久化到一个全局临时表中,并将其分页。这使得您的存储过程更加复杂,因为当应用程序告诉它时,它必须从头开始构建结果集。

    如果您不关心第6页上的行可能在第5页上(结果集是动态的),那么让光标执行常规的Oracle分页:

    select [columns] 
      from (select [columns], rownum as rn
              from [some such tables]
             where [some such conditions]
               and rownum < (:v_pagenum + 1) * :v_numrecs
             order by [some expression])
     where rn >= :v_pagenum * :v_numrecs;