使用动态查询在 Oracle 中分页
Pagination in Oracle with dynamic query
我有一个查询 returns 大量数据。当用户在更大的日期范围内搜索数据时,它可能会出现多达 500 万条记录,当发生这种情况时,应用会冻结一段时间。
所以我决定对查询结果进行分页,但我正在尝试在不更改任何数据库的情况下进行分页。让我解释一下:
我有一个动态检索所有数据的存储过程SQL。输入参数为 3 :
- Select 案例数量的 Varchar(选择应执行哪个 select),
- 和其他 2 个 Varchar 参数 select 字段和查询条件,换句话说 - 一个在 FROM 之前,一个在 WHERE[= 之后45=] 子句。 这两个参数在这个问题中很重要。
例如,我调用查询的过程如下所示:
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) - 它是免费的,易于设置,并且内置分页功能。
我有一个查询 returns 大量数据。当用户在更大的日期范围内搜索数据时,它可能会出现多达 500 万条记录,当发生这种情况时,应用会冻结一段时间。
所以我决定对查询结果进行分页,但我正在尝试在不更改任何数据库的情况下进行分页。让我解释一下:
我有一个动态检索所有数据的存储过程SQL。输入参数为 3 :
- Select 案例数量的 Varchar(选择应执行哪个 select),
- 和其他 2 个 Varchar 参数 select 字段和查询条件,换句话说 - 一个在 FROM 之前,一个在 WHERE[= 之后45=] 子句。 这两个参数在这个问题中很重要。
例如,我调用查询的过程如下所示:
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) - 它是免费的,易于设置,并且内置分页功能。