在Oracle中使用动态查询进行分页

时间:2019-07-14 19:40:14

标签: oracle dynamic-sql

我有一个返回大量数据的查询。当用户搜索较大日期范围的数据时,它最多可以记录500万条记录,并且在这种情况下,应用程序冻结了一定时间。

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

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

  • Varchar用于选择案例的数量(以选择应执行的选择),
  • 和另外两个选择查询字段和条件的Varchar参数,换句话说-一个在 FROM 之前,一个在 WHERE 子句之后。 这两个参数在这个问题中很重要。

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

  

first_parameter || 'FROM(...这是我的查询,其中所有可能的字段都通过联接,数据库链接等选择。...)WHERE'||    second_parameter

因此,我可以修改查询的开始和结束,现在我也想对其进行修改以启用分页,例如一次最多可记录1000条。

我试图在C#中通过在 first_parameter 中添加 rownum 以及所选字段

对其进行修改
  

选择rownum,field1,field2 等...)

,并使用

   WHERE子句中的

行编号<1000

。这实际上是可行的,但是对于分页,我还需要告诉开始和结束的行,例如

  

其中rownum> 1000 AND rownum <2000

,但这不起作用。

我该如何在没有可用OFFSET的Oracle 11g中做到这一点,有人可以告诉我吗?我希望有一个不更改参数内部查询的解决方案(如果可能的话),因为我可以将所需的所有内容从C#中的代码(课程的Varchar值)发送到两个相关的参数中。

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

2 个答案:

答案 0 :(得分:1)

一种选择是为每一行计算行号,例如

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

答案 1 :(得分:0)

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