第一种:
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;
转载于:https://blog.51cto.com/agilitygod/1419915