使用动态查询在 Oracle 中分页

Pagination in Oracle with dynamic query

我有一个查询 returns 大量数据。当用户在更大的日期范围内搜索数据时,它可能会出现多达 500 万条记录,当发生这种情况时,应用会冻结一段时间。

所以我决定对查询结果进行分页,但我正在尝试在不更改任何数据库的情况下进行分页。让我解释一下:

我有一个动态检索所有数据的存储过程SQL。输入参数为 3 :

例如,我调用查询的过程如下所示:

first_parameter || ' FROM (...here is my query where all possible fields are selected with joins, db links etc.... ) WHERE ' || second_parameter

所以,我可以修改查询的开始和结束,现在我想修改它以启用分页,比如说一次最多 1.000 条记录。

我试图通过在 first_parameter 和 select 中添加 rownum 来在 C# 中修改它编辑字段

(Select rownum, field1,field2 etc...)

,并使用

rownum < 1000 in a WHERE clause

。这确实有效,但对于分页,我还需要告诉开始和结束的行,比如

WHERE rownum > 1000 AND rownum < 2000

,但这不起作用。

我如何在 Oracle 11g 中执行此操作,其中 OFFSET 不可用,有人可以告诉我吗?如果可能的话,我更喜欢不更改参数内部查询的解决方案,因为我可以在代码中从 C# 将我想要的所有内容发送到有问题的两个参数中(当然是 Varchar 值)。

P.S。 : 我从来没有做过分页所以如果我写了一些愚蠢的东西请原谅我;)

一个选项是计算每行的行号,例如

with ycq as
  -- your current query goes here
  (select col1, 
          col2, ..., 
       row_number() over (order by col1) rn         --> this is new ...
   from ...
   where ...
  )
select y.col1, 
       y.col2,
       ...
from ycq y
where y.rn between :lower_value and :upper_value    --> ... and is used here
order by y.some_col

对于真正的分页,您应该查看 Oracle REST Data Services (ORDS) - 它是免费的,易于设置,并且内置分页功能。