【发布时间】:2018-09-18 17:12:32
【问题描述】:
从这个问题的答案开始(Use Bulk Collect result in a select query without cursor),我想知道是否可以在 SELECT ... BULK COLLECT INTO ... 中使用 LIMIT 选项。
我知道使用显式游标的可能性,但我想知道是否可以使用直接选择语句。
谢谢,
【问题讨论】:
标签: oracle plsql bulk-collect
从这个问题的答案开始(Use Bulk Collect result in a select query without cursor),我想知道是否可以在 SELECT ... BULK COLLECT INTO ... 中使用 LIMIT 选项。
我知道使用显式游标的可能性,但我想知道是否可以使用直接选择语句。
谢谢,
【问题讨论】:
标签: oracle plsql bulk-collect
返回大量行的
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 都是独立的,数据可能会在查询之间发生变化(除非你也改变了隔离级别)。
【讨论】: