http://community.csdn.net/Expert/topic/4204/4204535.xml?temp=.9248926
我的一个关于递归统计的帖子。 bzszp(songzip) 给了我一个可以测试通过的解决方案(一个递归函数)
函数如下:
create or replace function f_demo(varea varchar2) return number
2 as
3 cursor c(v_area varchar2) is select distinct * from tt where 隶属于=v_area;
4 v_num number:=0;
5 begin
6 for cur in c(varea) loop
7 v_num:=v_num+ (f_demo(cur.地区)+cur.人数)*cur.倍数;
8 end loop;
9 return v_num;
10 end f_demo;
11 /在数据量小的情况下测试没有问题,SQL> select * from tt;地区 人数 隶属于 倍数
---------- ---------- ---------- ----------
中国 3 1
北京 4 中国 2
四川 3 中国 3
昌平 7 北京 4
顺义 12 北京 5
绵阳 20 四川 6
成都 11 四川 7
成都 11 北京 8
郫县 7 成都 9
郫县 7 成都 9已选择10行。已用时间: 00: 00: 00.80
SQL> select 地区,f_demo(地区)+人数 from tt;地区 F_DEMO(地区)+人数
---------- -----------------
中国 3294
北京 684
四川 641
昌平 7
顺义 12
绵阳 20
成都 74
成都 74
郫县 7
郫县 7已选择10行。已用时间: 00: 00: 00.01
SQL>
但是大数据量的时候根本不行,一小时根本执行不完。
然后我就不全统计,只统计一个节点:select 地区,f_demo(地区)+人数 from tt where 地区='中国'结果还是慢得不得了。我反复优化,还行了。一两分钟就执行结束,但是没有结果,而是出错:
ora-01000:maximum open cursors exceeded咋办呢?
我的一个关于递归统计的帖子。 bzszp(songzip) 给了我一个可以测试通过的解决方案(一个递归函数)
函数如下:
create or replace function f_demo(varea varchar2) return number
2 as
3 cursor c(v_area varchar2) is select distinct * from tt where 隶属于=v_area;
4 v_num number:=0;
5 begin
6 for cur in c(varea) loop
7 v_num:=v_num+ (f_demo(cur.地区)+cur.人数)*cur.倍数;
8 end loop;
9 return v_num;
10 end f_demo;
11 /在数据量小的情况下测试没有问题,SQL> select * from tt;地区 人数 隶属于 倍数
---------- ---------- ---------- ----------
中国 3 1
北京 4 中国 2
四川 3 中国 3
昌平 7 北京 4
顺义 12 北京 5
绵阳 20 四川 6
成都 11 四川 7
成都 11 北京 8
郫县 7 成都 9
郫县 7 成都 9已选择10行。已用时间: 00: 00: 00.80
SQL> select 地区,f_demo(地区)+人数 from tt;地区 F_DEMO(地区)+人数
---------- -----------------
中国 3294
北京 684
四川 641
昌平 7
顺义 12
绵阳 20
成都 74
成都 74
郫县 7
郫县 7已选择10行。已用时间: 00: 00: 00.01
SQL>
但是大数据量的时候根本不行,一小时根本执行不完。
然后我就不全统计,只统计一个节点:select 地区,f_demo(地区)+人数 from tt where 地区='中国'结果还是慢得不得了。我反复优化,还行了。一两分钟就执行结束,但是没有结果,而是出错:
ora-01000:maximum open cursors exceeded咋办呢?
查询后将临时表删除就行了
修改init.ora中的open_cursors的值为1000,重新启动数据库试试