|
原帖由 newkid 于 2010-1-23 12:05 发表 ![]()
怎么又冒出个pkg_mgacct.P_MAIN?你先从最底层的互斥功能测起,像我这样:
SQL> EXEC pkg_base.P_REGISTER(1401,'pkg_mgacct',416,'test');
BEGIN pkg_base.P_REGISTER(1401,'pkg_mgacct',416,'test'); END;
*
ERROR at line 1:
ORA-20004: 当前进程已在处理中。。。。。
ORA-06512: at "JSU.PKG_BASE", line 86
ORA-06512: at line 1
呵呵,NEWKID兄,这个之前我实验过了,这个是没问题的,其实表示底层的写法是没问题,只是在你某个过程想应用到我这个注册包的时候,出问题了
SQL> EXEC pkg_base.P_REGISTER(1401,'pkg_mgacct',416,'test');
begin pkg_base.P_REGISTER(1401,'pkg_mgacct',416,'test'); end;
ORA-20004: 当前进程已在处理中。。。。。
ORA-06512: 在 "VAJS.PKG_BASE", line 126
ORA-06512: 在 line 1
但是我是要在PKG_MGACCT中调用它,这个的P_MAIN函数是这样写的,从执行这个来引用就不成功了。
Procedure P_main(V_RULE_REC_SEQ IN NUMBER DEFAULT NULL, V_CYCLE_ID IN NUMBER DEFAULT NULL,v_point_type IN VARCHAR2 DEFAULT null) as
/*
说明:
主程序
1、p_mgacct主程序调用P_JUDGE_BRAK_POINT 来做配置表判断及自动校验
2、p_mgacct主程序根据入参类型v_point_type的取值来调用p_do程序
其中: p_do程序调用P_GENMERGESQL过程,从P_GENMERGESQL中获取生产的MERGE的SQL文本
p_do程序根据一定的业务逻辑获取断点(三种类型)
接着p_do程序利用断点和SQL文本,拼成正确的SQL语句,并EXECUTE IMMEDATE 执行
*/
Begin
/*
以下模块调用的目的是能够保证p_main可以不带参数,从tpva_mgacct_rule从提取
rec_seq,即调用所有业务。也可以根据输入参数决定
*/
IF V_RULE_REC_SEQ IS NULL THEN
FOR J IN (SELECT * FROM TPVA_MGACCT_RULE WHERE STATE='00A' AND point_class='5PC' AND module_id=1401 ORDER BY rec_seq) LOOP
/* 这里写进point_class='5PC'主要是为了保证当前特殊业务一定要能支持!就是说,当要不输入
参数,默认全部执行的时候,只能执行生产线业务!*/
p_judge_break_point(J.REC_SEQ);
pkg_base.P_REGISTER(1401,'pkg_mgacct',J.REC_SEQ,null);
FOR I IN (SELECT * FROM BREAK_POINT_MGACCT
WHERE point_id=J.REC_SEQ ----这里非常重要!如果写v_rule_rec_seq就不对了,变成NULL了
AND ( point_Type=v_point_Type OR v_point_Type IS NULL)
ORDER BY point_type,module_id,billing_line_id) --排序的目的是为了明确程序出错后,可判断已经执行到哪里
LOOP
p_do( V_RULE_REC_SEQ =>J.REC_SEQ, V_CYCLE_ID=>V_CYCLE_ID,v_billing_line_id=>i.billing_line_id,v_point_type =>i.point_type);
END LOOP;
pkg_base.P_UNREGISTER(1401,'pkg_mgacct',J.REC_SEQ);
END LOOP;
ELSE
p_judge_break_point(V_RULE_REC_SEQ);
pkg_base.P_REGISTER(1401,'pkg_mgacct',V_RULE_REC_SEQ,NULL);
FOR I IN (SELECT * FROM BREAK_POINT_MGACCT
WHERE point_id=V_RULE_REC_SEQ ----这里写 V_RULE_REC_SEQ没错,因为值不为空了
AND ( point_Type=v_point_Type OR v_point_Type IS NULL)
ORDER BY point_id,module_id,billing_line_id) --排序的目的是为了明确程序出错后,可判断已经执行到哪里
LOOP
p_do( V_RULE_REC_SEQ =>V_RULE_REC_SEQ, V_CYCLE_ID=>V_CYCLE_ID,v_billing_line_id=>i.billing_line_id,v_point_type =>i.point_type);
END LOOP;
--dbms_lock.sleep(2000);
pkg_base.P_UNREGISTER(1401,'pkg_mgacct',V_RULE_REC_SEQ);
END IF;
END P_MAIN;
end pkg_MgAcct;
[ 本帖最后由 wabjtam123 于 2010-1-23 12:22 编辑 ] |
|