在 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 子查询