第一种:

createorreplacefunction cost_nogetsumamount_test(i_id    innumber ,

                                       o_err_msg   OutVarchar2)

    ReturnNumberIs

    Result       number;

    m_sql       varchar2(2000);  

    type cursor_t isrefcursor; --定义游标类型

    emp_cur              cursor_t; --定义游标变量

    --以下定义要取出的变量定义

    m_id number;

    m_ppt_id number;

    m_pay_year number;

    m_pay_month number;

    --end

  Begin

    Begin

      Result := 0;

      m_sql := ' select id,ppt_id,pay_year,pay_month from ppt_test ';

      open emp_cur for m_sql;

      loop

        FETCHemp_cur

          INTO m_id,m_ppt_id, m_pay_year, m_pay_month;

        exitwhenemp_cur%notfound;        

        m_sql := ' update ppt_test set noget_sumamount=noget_sumamount+1  where id=' || m_id;

        executeimmediatem_sql;

      endloop;

      close emp_cur;

    Exception

      WhenOthersThen

        Result    := -1;

        o_err_msg := 'cost_nogetsumamount_regulate:' || sqlerrm;

        rollback;

    End;

    ReturnResult;

  End;

第二种:

createorreplacefunction f_get_nogetsumamount_all(i_table_name invarchar2,

                                               i_pay_type   invarchar2) returnnumberis

  Resultnumber;

  m_sql varchar2(2000);--SQL语句

  m_paytype varchar2(300):='';--费用类型 0:电费 1:水费 (只有cost_monthpower才有)

  v_noget_sumamount number;--当前累计未入收

  v_noget_amount number;--当前未入收

  v_pre_noget_sumamount number;--上一个累计未入收

  v_pre_code varchar2(100);--上一个物业编号

  v_currentid number;--当前标识

 

begin

   v_pre_noget_sumamount := 0;

   v_pre_code := '';

  if i_table_name = 'cost_monthother'or i_table_name = 'cost_monthpower'then

     if i_pay_type isnotnullthen

        m_paytype:=' and pay_type='''||i_pay_type||'''';

     endif;

  endif;

  m_sql := 'select t.id,t.ppt_code,t.pay_year,t.pay_month,t.amount,t.get_amount,t.noget_sumamountfrom '||i_table_name||' t';

  m_sql := m_sql ||  'where 1=1 ' || m_paytype;

  m_sql := m_sql || ' order by t.ppt_code, t.pay_year, t.pay_month'

  --声明游标

  declare

        type code_mtypeisrecord(id number,ppt_code varchar2(100),pay_year number,pay_month number,amount number,get_amount number,noget_sumamount number);

        typecur_type isrefcursor;

        c_cursor code_mtype;--定义code_mtype类型的游标

        main_cur cur_type;

  begin

       open main_cur for m_sql;

        loop

             fetchmain_cur into c_cursor;

                exitwhenmain_cur%notfound;                

                   v_noget_amount :=  c_cursor.amount-c_cursor.get_amount;--前月的未入账

                   v_currentid := c_cursor.id;                   

                   ifv_pre_code isnullor v_pre_code != c_cursor.ppt_code then--当前月的物业编号与之前的不同时

                      v_pre_noget_sumamount:=0;--从最新0开始 

                      v_pre_code :=  c_cursor.ppt_code;

                   endif;

                  

                   v_noget_sumamount :=v_pre_noget_sumamount+v_noget_amount;--上月累计未入账+前月未入账 = 累计未入账

                   v_pre_noget_sumamount :=v_noget_sumamount;

                   m_sql := 'update '||i_table_name ||' set noget_amount ='|| round(v_noget_amount,2) ||',noget_sumamount = '|| round(v_noget_sumamount,2) ||' where id = ' ||v_currentid;

                   executeimmediate m_sql;

                   commit;

        endloop;

        closemain_cur;

  end;

 

  Result:=v_pre_noget_sumamount;

  return(Result);

end f_get_nogetsumamount_all;