建立jobs后,今天发现表已经被锁住.
没有发现哪块的循环不能跳出,望高手帮忙!
create or replace procedure user_type1
as
--可以从目标表中获取的变量
--REP_MONTH_AFTER_CUSTOMERVALUE后付费表项
V_After_Billfee REP_MONTH_AFTER_CUSTOMERVALUE.BILLFEE%type; --总话费
V_After_Yz_Fee REP_MONTH_AFTER_CUSTOMERVALUE.YZ_FEE%type; --基本月租费
V_After_Yy_Fee REP_MONTH_AFTER_CUSTOMERVALUE.YY_FEE%type; --语音通话费用
V_After_Zz_Fee REP_MONTH_AFTER_CUSTOMERVALUE.ZZ_FEE%type; --增值业务费用
V_After_Calltimes REP_MONTH_AFTER_CUSTOMERVALUE.CALLTIMES%type; --总语音通话次数
V_After_Smstimes REP_MONTH_AFTER_CUSTOMERVALUE.Smstimes%type; --总短信条数
V_After_On_Date REP_MONTH_AFTER_CUSTOMERVALUE.ON_DATE%type; --在网时长
V_After_Callnum REP_MONTH_AFTER_CUSTOMERVALUE.CallNum%type; --客户不同的主被叫号码个数
V_After_Ssum REP_MONTH_AFTER_CUSTOMERVALUE.SSUM%type; --订购增值业务个数
V_After_Stoptimes REP_MONTH_AFTER_CUSTOMERVALUE.StopTimes%type; --欠费次数
V_After_SUBSCRBID REP_MONTH_AFTER_CUSTOMERVALUE.SUBSCRBID%type; --欠费次数V_After_Type char(1);
V_Before_Type char(1);--用户类型(0预付费,1后付费)
v_value_type varchar(10);--需要计算或定义的变量CV_SUM float := 0.0;--系统异常对象
SYS_DEBUG_EXC EXCEPTION;
v_ErrorCode NUMBER; -- 出错的代码
v_ErrorMsg VARCHAR2(200); -- 错误的消息显示
v_CurrentUser VARCHAR2(8); -- 当前数据库用户
v_Information VARCHAR2(100); -- 关于错误的信息type t_target_Data IS REF CURSOR; --目标数据类型
v_AFTERCursorVar t_target_Data; --定义类型游标1
--v_BEFORECursorVar t_target_Data; --定义类型游标2
begin
--打开游标
OPEN v_AFTERCursorVar FOR
SELECT
BILLFEE,
YZ_FEE,
YY_FEE,
ZZ_FEE,
CALLTIMES,
SMSTIMES,
ON_DATE,
CALLNUM,
SSUM,
STOPTIMES,
USER_TYPE,
SUBSCRBID from REP_MONTH_AFTER_CUSTOMERVALUE
WHERE BILLFEE > 0 and (USERSTATE=000 or USERSTATE=001);
--遍历
loop
--后付费部分
FETCH v_AFTERCursorVar
into V_After_Billfee,
V_After_Yz_Fee,
V_After_Yy_Fee,
V_After_Zz_Fee,
V_After_Calltimes,
V_After_Smstimes,
V_After_On_Date,
V_After_Callnum,
V_After_Ssum,
V_After_Stoptimes,
V_After_Type,
V_After_SUBSCRBID;
--退出条件
EXIT WHEN v_AFTERCursorVar %NOTFOUND;
CV_SUM := CV_SUM + data_Treatment(V_After_Billfee,V_After_Type,'BILLFEE'); --总话费添入
CV_SUM := CV_SUM + data_Treatment(V_After_Yz_Fee,V_After_Type,'YZ_FEE'); --基本月租费
CV_SUM := CV_SUM + data_Treatment(V_After_Yy_Fee,V_After_Type,'YY_FEE'); --语音通话费用
CV_SUM := CV_SUM + data_Treatment(V_After_Zz_Fee,V_After_Type,'ZZ_FEE'); --增值业务费用
CV_SUM := CV_SUM + data_Treatment(V_After_Calltimes,V_After_Type,'CALLTIMES'); --增值业务个数
CV_SUM := CV_SUM + data_Treatment(V_After_Smstimes,V_After_Type,'SMSTIMES');--在网时长
CV_SUM := CV_SUM + data_Treatment(V_After_On_Date,V_After_Type,'ON_DATE');--短信话单条数
CV_SUM := CV_SUM + data_Treatment(V_After_Callnum,V_After_Type,'CALLNUM');--不同主被叫号码个数
CV_SUM := CV_SUM + data_Treatment(V_After_Ssum,V_After_Type,'SSUM');--被欠费停机次数
CV_SUM := CV_SUM + data_Treatment(V_After_Stoptimes,V_After_Type,'STOPTIMES');--通话次数
-- 价值分类
if 80 < CV_SUM and CV_SUM < 100 or CV_SUM = 100 then
v_value_type := 'A';
elsif 60 < CV_SUM and CV_SUM < 80 or CV_SUM = 80 then
v_value_type := 'B';
elsif 40 < CV_SUM and CV_SUM < 60 or CV_SUM = 60 then
v_value_type := 'C';
elsif 20 < CV_SUM and CV_SUM< 40 or CV_SUM = 40 then
v_value_type := 'D';
else
v_value_type := 'E';
end if;
update REP_MONTH_AFTER_CUSTOMERVALUE set SCORE = CV_SUM,value_type = v_value_type
where SUBSCRBID = V_After_SUBSCRBID;
END LOOP;
--关闭游标
dbms_output.put_line(sqlcode);
CLOSE v_AFTERCursorVar ;
--CLOSE v_BEFORECursorVar ;
--提交事务
commit;
--异常处理
--自定义异常
exception
when SYS_DEBUG_EXC then
--关闭游标
CLOSE v_AFTERCursorVar ;
--CLOSE v_BEFORECursorVar ;
dbms_output.put_line('异常调试,自动回滚');
--回滚事务
rollback;
--其他异常
when others then
--关闭游标
CLOSE v_AFTERCursorVar ;
v_ErrorCode := SQLCODE;
v_ErrorMsg := SQLERRM;
v_CurrentUser := USER;
v_Information := '遇到了错误 ' || TO_CHAR(SYSDATE) || ' 数据库用户 ' || v_CurrentUser;
dbms_output.put_line('执行错误,自动回滚');
dbms_output.put_line('详细信息:'||'错误代码:'||v_ErrorCode||',错误消息:'||v_ErrorMsg||',日志信息:'||v_Information);
--回滚事务
Rollback;end user_type1;
没有发现哪块的循环不能跳出,望高手帮忙!
create or replace procedure user_type1
as
--可以从目标表中获取的变量
--REP_MONTH_AFTER_CUSTOMERVALUE后付费表项
V_After_Billfee REP_MONTH_AFTER_CUSTOMERVALUE.BILLFEE%type; --总话费
V_After_Yz_Fee REP_MONTH_AFTER_CUSTOMERVALUE.YZ_FEE%type; --基本月租费
V_After_Yy_Fee REP_MONTH_AFTER_CUSTOMERVALUE.YY_FEE%type; --语音通话费用
V_After_Zz_Fee REP_MONTH_AFTER_CUSTOMERVALUE.ZZ_FEE%type; --增值业务费用
V_After_Calltimes REP_MONTH_AFTER_CUSTOMERVALUE.CALLTIMES%type; --总语音通话次数
V_After_Smstimes REP_MONTH_AFTER_CUSTOMERVALUE.Smstimes%type; --总短信条数
V_After_On_Date REP_MONTH_AFTER_CUSTOMERVALUE.ON_DATE%type; --在网时长
V_After_Callnum REP_MONTH_AFTER_CUSTOMERVALUE.CallNum%type; --客户不同的主被叫号码个数
V_After_Ssum REP_MONTH_AFTER_CUSTOMERVALUE.SSUM%type; --订购增值业务个数
V_After_Stoptimes REP_MONTH_AFTER_CUSTOMERVALUE.StopTimes%type; --欠费次数
V_After_SUBSCRBID REP_MONTH_AFTER_CUSTOMERVALUE.SUBSCRBID%type; --欠费次数V_After_Type char(1);
V_Before_Type char(1);--用户类型(0预付费,1后付费)
v_value_type varchar(10);--需要计算或定义的变量CV_SUM float := 0.0;--系统异常对象
SYS_DEBUG_EXC EXCEPTION;
v_ErrorCode NUMBER; -- 出错的代码
v_ErrorMsg VARCHAR2(200); -- 错误的消息显示
v_CurrentUser VARCHAR2(8); -- 当前数据库用户
v_Information VARCHAR2(100); -- 关于错误的信息type t_target_Data IS REF CURSOR; --目标数据类型
v_AFTERCursorVar t_target_Data; --定义类型游标1
--v_BEFORECursorVar t_target_Data; --定义类型游标2
begin
--打开游标
OPEN v_AFTERCursorVar FOR
SELECT
BILLFEE,
YZ_FEE,
YY_FEE,
ZZ_FEE,
CALLTIMES,
SMSTIMES,
ON_DATE,
CALLNUM,
SSUM,
STOPTIMES,
USER_TYPE,
SUBSCRBID from REP_MONTH_AFTER_CUSTOMERVALUE
WHERE BILLFEE > 0 and (USERSTATE=000 or USERSTATE=001);
--遍历
loop
--后付费部分
FETCH v_AFTERCursorVar
into V_After_Billfee,
V_After_Yz_Fee,
V_After_Yy_Fee,
V_After_Zz_Fee,
V_After_Calltimes,
V_After_Smstimes,
V_After_On_Date,
V_After_Callnum,
V_After_Ssum,
V_After_Stoptimes,
V_After_Type,
V_After_SUBSCRBID;
--退出条件
EXIT WHEN v_AFTERCursorVar %NOTFOUND;
CV_SUM := CV_SUM + data_Treatment(V_After_Billfee,V_After_Type,'BILLFEE'); --总话费添入
CV_SUM := CV_SUM + data_Treatment(V_After_Yz_Fee,V_After_Type,'YZ_FEE'); --基本月租费
CV_SUM := CV_SUM + data_Treatment(V_After_Yy_Fee,V_After_Type,'YY_FEE'); --语音通话费用
CV_SUM := CV_SUM + data_Treatment(V_After_Zz_Fee,V_After_Type,'ZZ_FEE'); --增值业务费用
CV_SUM := CV_SUM + data_Treatment(V_After_Calltimes,V_After_Type,'CALLTIMES'); --增值业务个数
CV_SUM := CV_SUM + data_Treatment(V_After_Smstimes,V_After_Type,'SMSTIMES');--在网时长
CV_SUM := CV_SUM + data_Treatment(V_After_On_Date,V_After_Type,'ON_DATE');--短信话单条数
CV_SUM := CV_SUM + data_Treatment(V_After_Callnum,V_After_Type,'CALLNUM');--不同主被叫号码个数
CV_SUM := CV_SUM + data_Treatment(V_After_Ssum,V_After_Type,'SSUM');--被欠费停机次数
CV_SUM := CV_SUM + data_Treatment(V_After_Stoptimes,V_After_Type,'STOPTIMES');--通话次数
-- 价值分类
if 80 < CV_SUM and CV_SUM < 100 or CV_SUM = 100 then
v_value_type := 'A';
elsif 60 < CV_SUM and CV_SUM < 80 or CV_SUM = 80 then
v_value_type := 'B';
elsif 40 < CV_SUM and CV_SUM < 60 or CV_SUM = 60 then
v_value_type := 'C';
elsif 20 < CV_SUM and CV_SUM< 40 or CV_SUM = 40 then
v_value_type := 'D';
else
v_value_type := 'E';
end if;
update REP_MONTH_AFTER_CUSTOMERVALUE set SCORE = CV_SUM,value_type = v_value_type
where SUBSCRBID = V_After_SUBSCRBID;
END LOOP;
--关闭游标
dbms_output.put_line(sqlcode);
CLOSE v_AFTERCursorVar ;
--CLOSE v_BEFORECursorVar ;
--提交事务
commit;
--异常处理
--自定义异常
exception
when SYS_DEBUG_EXC then
--关闭游标
CLOSE v_AFTERCursorVar ;
--CLOSE v_BEFORECursorVar ;
dbms_output.put_line('异常调试,自动回滚');
--回滚事务
rollback;
--其他异常
when others then
--关闭游标
CLOSE v_AFTERCursorVar ;
v_ErrorCode := SQLCODE;
v_ErrorMsg := SQLERRM;
v_CurrentUser := USER;
v_Information := '遇到了错误 ' || TO_CHAR(SYSDATE) || ' 数据库用户 ' || v_CurrentUser;
dbms_output.put_line('执行错误,自动回滚');
dbms_output.put_line('详细信息:'||'错误代码:'||v_ErrorCode||',错误消息:'||v_ErrorMsg||',日志信息:'||v_Information);
--回滚事务
Rollback;end user_type1;
where SUBSCRBID = V_After_SUBSCRBID;
--建议在此处加入提交操作,你可以做个计数器,每n条提交一次。
END LOOP; 另外查一下是否其他过程的问题