oracle - Oracle中的分页与动态查询
问题描述
我有一个返回大量数据的查询。当用户在更大的日期范围内搜索数据时,它可能会出现多达 500 万条记录,当这种情况发生时,应用程序会冻结一定的时间。
所以我决定对查询结果进行分页,但我试图在没有任何数据库更改的情况下做到这一点。让我解释:
我有一个使用动态 SQL 检索所有数据的存储过程。输入参数为 3 :
- Varchar 用于选择案例的数量(选择应该执行的选择),
- 和 2 个其他 Varchar 参数,用于选择查询的字段和条件,换句话说 - 一个在FROM之前,一个在WHERE子句之后。这两个参数在这个问题中很重要。
例如,我调用查询的过程如下所示:
第一个参数|| ' 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:我从来没有做过分页,如果我写了一些愚蠢的东西,请原谅我;)
解决方案
一种选择是计算每一行的行号,例如
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
推荐阅读
- arrays - Golang 从 .. 读取字节数组并显示结果
- sql-server - 在 linux docker 映像上为 mssql 服务器启用 xa 数据源
- java - 如何在 Android 中发送带文件的请求?
- javascript - 如何引用 JSON 列表中的特定元素?
- ios - iOS 启动屏幕将以纵向而不是横向显示
- macros - Crystal lang:如何获取宏本身的位置而不是宏参数。
- intershop - BasketAddProductBehaviour 应用服务器配置的自定义逻辑
- java - “值”属性在什么地方
spring web flow的元素包含? - javascript - 如何在使用 Bootstrap 3 的 Angularjs 应用程序中正确导入 Bootstrap 4
- android - 将字符串从 AsyncTask 传递到 onCreate 或其他活动