首页 > 解决方案 > Oracle中的分页与动态查询

问题描述

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

所以我决定对查询结果进行分页,但我试图在没有任何数据库更改的情况下做到这一点。让我解释:

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

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

第一个参数|| ' FROM (...这是我的查询,其中所有可能的字段都通过连接、数据库链接等选择...) WHERE ' || 第二个参数

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

我试图通过在first_parameter中添加rownum以及选定的字段来在 C# 中修改它

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

, 并使用

WHERE 子句中的rownum < 1000

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

WHERE rownum > 1000 AND rownum < 2000

,但这不起作用。

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

PS:我从来没有做过分页,如果我写了一些愚蠢的东西,请原谅我;)

标签: oracledynamic-sql

解决方案


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

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

推荐阅读