我有一个返回大量数据的查询。当用户搜索较大日期范围的数据时,它最多可以记录500万条记录,并且在这种情况下,应用程序冻结了一定时间。
因此,我决定对查询结果进行分页,但是我试图在不对数据库进行任何更改的情况下进行。让我解释一下:
我有一个用于使用动态SQL检索所有数据的存储过程。输入参数为3:
例如,我调用查询的过程如下:
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。 :我从未做过分页,所以如果我写了一些愚蠢的东西,请原谅我;)
答案 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)-它是免费的,易于设置,并且内置了分页。