别人写出的东西不一定好用,而且以后再遇到问题你还是解决不了,因此,我建议你先看看有关这方面的书籍,比如:《ORACLE8 PL/SQL程序设计》

解决方案 »

  1.   

    M_RESULT, M_MSG起什么作用?
      

  2.   

    对于楼主所表达意思不太明白,重复以下语句:1、根据Area和BH 在表BB中找出相应的记录(两个表中的AREA和BH对应相等),把这些记录按Vdate 时间逆序排序,把对应的Score字段相加,如果和等于这个人的Toatal_score 时,则不再查找记录。
    2、把这些找出来的记录按照不同部门Department进行累加Score,然后去表AA中进行读下一个人的area和BH,重新进行。完成后把结果插到表CC中去。另:表结构设计不合理,重新设计如下:
    AA(地区号,地区名称)
    BB(人员编号,姓名,出生日期,地区编号,每个人的总分)  
    CC(部门编号,部门名称,日期,部门的总分)
    DD(人员编号,部门编号)    --此处设计主要是多对多关系
      

  3.   

    M_Result,M_Msg想做为程序调用这个过程的返回信息,M_Result成功时返回1,不成功时返回-1,M_Msg想作为过程返回的SQL错误信息!
      

  4.   

    beckhambobo(beckham) 你好:
    首先非常感谢你给我回复
    我这个表 你说重新设计一下,是不可以的。因为这里面你说的DD表里面的人员编号和部门编号没有必然的联系。
    因为人员都是外部的,我这系统已经用上了。我要得出的是在一个时间段内再表AA进行过其他操作的人,各部门对他们分别处罚了多少分。
      

  5.   

    建议贴主还是自己写一下,对自己的成长很有好处。
    看你自己叙述的逻辑很清楚了,完全可以自己开发。
    这个用CURSOR就可以很快的实现。
      

  6.   

    时间太仓促,有问题再讨论吧
    create procedure get( M_RESULT out VARCHAR2 default 1,M_MSG OUT VARCHAR2,M_START_DATE IN VARCHAR2,M_END_DATE IN VARCHAR2)
    as
    type t is ref curosr;
    v t;
    str varchar2(1000);
    v_score number:=0;
    v_Department varchar2(20);
    v_sum number;
    cursor t1_sor is
    select * from aa where Cdate between M_START_DATE and M_END_DATE;
    cursor t2_sor(p_Area varchar2,p_bh varchar2) is
    select * from bb where area=p_area and bh=p_bh order by Vdate desc;
    begin
    for v1_sor in t1_sor loop
    str:='';
    for v2_sor in t2_sor(v1_sor.area,v1_sor.bh) loop
    str:=str||'select * from bb where bb_id='||v2_sor.bb_id||' union ';
    v_score:=v_score+v2_sor.score;
    exit when v_score=v1_sor.total_score;
    end loop;
    str:='select Department,sum(score) from ('||substr(str,1,lengbh(str)-7)||') group by Department';
    open v for str;
    loop
    fetch v into v_Department,v_sum;
    exit when v%notfound;
    insert into CC values(v_Department,v_sum);
    end loop;
    close v;
    end loop;
    exception
    when others then
    M_RESULT:=-1;
    end;
    /