问题描述
你好,
我知道我们可以使用BULK COLLECT将游标中的所有记录加载到一组收集变量中,此外,我们还可以使用LIMIT子句设置每次加载的最大记录数。如果Oracle可以支持批量收集的功能,那将非常方便。
例如,这里是数据从我的光标:
频道小时等级
---------------------------------
1 00:00 0.3
1 01:00 0.4
1 02:00 0.4
1 03:00 0.2
2 00:00 0.3
2 01:00 0.4
2 02:00 0.4
2 03:00 0.2
2 04:00 0.1
Case 1)
Execution:
第一个循环将通道1的所有4条记录加载到阵列中。
第二个循环将通道2的所有5条记录加载到阵列中。
执行在第三个循环中退出。
Case 2)
Execution:
第一个循环将通道1的前3条记录加载到阵列中。
第二个循环将通道1的第4条记录加载到阵列中。
第三个循环将通道2的前3条记录加载到阵列中。
第4循环将通道2的最后2条记录加载到阵列中。
执行在第5个循环中退出。
可选地,如果有新的游标属性可用来判断当前负载是新批次还是与先前负载处于同一批次,这将是很好的。这对于情况2) 很有用,其中限制与批量收集一起指定。对于情况1) 每次加载都是一个新批次。
谢谢。
大卫
我知道我们可以使用BULK COLLECT将游标中的所有记录加载到一组收集变量中,此外,我们还可以使用LIMIT子句设置每次加载的最大记录数。如果Oracle可以支持批量收集的功能,那将非常方便。
例如,这里是数据从我的光标:
频道小时等级
---------------------------------
1 00:00 0.3
1 01:00 0.4
1 02:00 0.4
1 03:00 0.2
2 00:00 0.3
2 01:00 0.4
2 02:00 0.4
2 03:00 0.2
2 04:00 0.1
Case 1)
open cur for
select channel, hour, grade
from some_table
where …
order by channel, hour;
loop
fetch cur bulk collect into
channel_arr, hour_arr, grade_arr
IN BATCHES OF CHANNEL;
exit when channel_arr.count = 0;
-- process data in a batch
end loop;
close cur;
Execution:
第一个循环将通道1的所有4条记录加载到阵列中。
第二个循环将通道2的所有5条记录加载到阵列中。
执行在第三个循环中退出。
Case 2)
open cur for
select channel, hour, grade
from some_table
where …
order by channel, hour;
loop
fetch cur bulk collect into
channel_arr, hour_arr, grade_arr
IN BATCHES OF CHANNEL LIMIT 3;
exit when channel_arr.count = 0;
-- process data in a batch
end loop;
close cur;
Execution:
第一个循环将通道1的前3条记录加载到阵列中。
第二个循环将通道1的第4条记录加载到阵列中。
第三个循环将通道2的前3条记录加载到阵列中。
第4循环将通道2的最后2条记录加载到阵列中。
执行在第5个循环中退出。
可选地,如果有新的游标属性可用来判断当前负载是新批次还是与先前负载处于同一批次,这将是很好的。这对于情况2) 很有用,其中限制与批量收集一起指定。对于情况1) 每次加载都是一个新批次。
谢谢。
大卫
专家解答
好主意。
我们有一个社区想法区域,您可以在其中提出新功能和增强功能,并由社区对其进行投票。
https://community.oracle.com/community/groundbreakers/database/database-ideas
我们有一个社区想法区域,您可以在其中提出新功能和增强功能,并由社区对其进行投票。
https://community.oracle.com/community/groundbreakers/database/database-ideas
文章转载自ASKTOM,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




