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咋办呢?

解决方案 »

  1.   

    select 地区,f_demo(地区)+人数 from tt  中有很多重复的计算,建议建个临时表,从最底层开始计算,将算好的数据存进去,这样可以减少计算量。
    查询后将临时表删除就行了
      

  2.   

    没想到更好的办法
    修改init.ora中的open_cursors的值为1000,重新启动数据库试试
      

  3.   

    怎么关闭游标呀,这些游标用玩了怎么关闭呀。我加了close c;  结果出错。