cursor cur_avg_score is --返回数量有500万行
select c.name,course_name, avg(score)
from
(
select student_id,name --6
from a
where a.name like '张%' --4
) c --5
inner join --
(
select b.score,student_id,course_id,course_name
from b
where insert_time >to_date('2012-03-08','YYYY-MM-DD')
) d
on c.student_id=d.student_id
group by c.name,course_name
order by c.name,course_name
open cur_avg_score; --1
loop --3
fetch cur_avg_score bulk collect into --2
l_ary_name,
l_ary_course,
l_ary_score
limit 10000;
forall i in 1..l_ary_name.count
insert into t_avg_sorce_tmp
(
name,course_name,avg_score,create_time,modify_time
)
values
(
l_ary_name(i),
l_ary_course(i),
l_ary_score(i),
sysdate,
sysdate
);
commit;
exit when cur_avg_score;notfound or cur_avg_score;notfound is null;
end loop;
close cur_avg_score;
这是个完整的统计存储过程,当然去掉了变量声明
不明白之初
1 OPEN: 游标 有人道 只是解析并生成执行计划,并且记住SCN号
2 fetch :只是完成提取数据这个操作吗? 还是完成执行计划,并提取数据?
3 loop: 循环bulk时 是不是也不能太大减少SQL引撑的切换? 如果500万数据 普通游标要500万次,而这里有limit 10000; 只需要循环500次,那么是否可以说发生500次PLSQL/SQL引撑切换
3.5 loop fetch 联合操作: 如果fetch要完成执行计划是否每次都要执行一遍呢? 比如上面的语句执行计划 1 全表扫描读进内存; 2 过滤数据; 3表连接 4 分组;5排序;6输出结果
还是有人说的只要第一次fetch时候才执行执行计划; 如果这样必定需要一个地方存储结果集 那这个地方是哪里? PGA 的哪个区还是DATABUFFER 的临时表空间?
4 过滤: 是把符合记录的行过滤出来,还是把符合记录的块过滤出来? 如果是行将暂时保存在哪里? 不要说PGA
5 子查询的结果存放在哪里?
6 列的过滤是在哪个步骤? 是SELECT 还是 WHERE条件的时候?