在 SELECT ... BULK COLLECT INTO 中使用 LIMIT 选项

Posted

技术标签:

【中文标题】在 SELECT ... BULK COLLECT INTO 中使用 LIMIT 选项【英文标题】:usage of LIMIT option in SELECT ... BULK COLLECT INTO 【发布时间】:2018-09-18 17:12:32 【问题描述】:

从这个问题的答案开始(Use Bulk Collect result in a select query without cursor),我想知道是否可以在 SELECT ... BULK COLLECT INTO ... 中使用 LIMIT 选项。

我知道使用显式游标的可能性,但我想知道是否可以使用直接选择语句。

谢谢,

【问题讨论】:

【参考方案1】:

From the documentation:

返回大量行的SELECT BULK COLLECT INTO 语句会产生一个大集合。要限制行数和集合大小,请使用以下之一:

ROWNUM 伪列(在 Oracle 数据库 SQL 语言参考中描述)

SAMPLE 子句(在 Oracle 数据库 SQL 语言参考中描述)

FETCH FIRST 子句(在 Oracle 数据库 SQL 语言参考中描述)

因此,从您链接到的上一个问题的示例中,您可以这样做:

SELECT id BULK COLLECT INTO result_bulk FROM table1 WHERE rownum <= 1000;

或者如果你在 12c:

SELECT id BULK COLLECT INTO result_bulk FROM table1 FETCH FIRST 1000 ROWS ONLY;

可能使用 order-by(在第一个版本的子查询中)使其具有确定性。

带有limit 子句的显式fetch 版本的优势在于,您可以在循环中执行此操作并继续获取接下来的1000 行(或任意多行),直到您全部看到它们为止。使用select 版本,您只能获得一枪;除非你把它放在一个循环中并处理分页,即使那样每个select 都是独立的,数据可能会在查询之间发生变化(除非你也改变了隔离级别)。

【讨论】:

指定 BULK COLLECT INTO ... LIMIT 子句是使用显式游标的少数充分理由之一。

以上是关于在 SELECT ... BULK COLLECT INTO 中使用 LIMIT 选项的主要内容,如果未能解决你的问题,请参考以下文章

Oracle Bulk Collect and Update from cursor or user Update with Select 子查询

将 BULK COLLECT 与 rownum 一起使用

FORALL和BULK COLLECT

ORA-00932 在执行 BULK COLLECT 时

ORACLEBulk Processing with BULK COLLECT and FORALL

BULK COLLECT 的奇怪行为