oracle 包中的常量(包括全局和私有)与 ORA-04068 错误 (二)
2012-02-29 15:45
633 查看
ORACLE 包中的常量 与 ORA-04068 错误
oracle 包中的常量(包括全局和私有)与 ORA-04068 错误 (一)中展示了包中常量带来的问题,这里我们
改变常量定义位置,来解决这类问题。我们新增一个常量包:PG_CONSTANT。将所有包中的常量都定义在此包
中,PG_CONSTANT 只有包头,不需要包头。定义如下:
CREATE OR REPLACE PACKAGE PG_CONSTANT AS
-- 常量包
-- PG_COMMON 常量
C_CODE_ERROR CONSTANT VARCHAR2(10) := 'ERROR';
C_CODE_SUCCESS CONSTANT VARCHAR2(10) := 'SUCCESS';
-- PG_TO 常量
C_TO_STATUS_OPEN CONSTANT VARCHAR2(10) := 'OPEN';
C_TO_STATUS_CLOSE CONSTANT VARCHAR2(10) := 'CLOSE';
C_TO_STATUS_CANCEL CONSTANT VARCHAR2(10) := 'CANCEL';
END PG_CONSTANT;
然后去掉其它包中的所有常量,并改用常量包中的常量,PG_COMMON包头接口不变,包体如下:
CREATE OR REPLACE PACKAGE BODY PG_COMMON AS FUNCTION SP_IS_EXIST_TO(I_TO NUMBER) RETURN BOOLEAN IS V_FLAG BOOLEAN := FALSE; V_COUNT NUMBER := 0; BEGIN -- 不为空 返回 TRUE IF I_TO IS NOT NULL THEN SELECT COUNT(1) INTO V_COUNT FROM t_* WHERE t_*.TO = I_TO; END IF; IF V_COUNT > 0 THEN V_FLAG := TRUE; END IF; RETURN V_FLAG; END SP_IS_EXIST_TO; END PG_COMMON;
PG_TO包也是如此,包头不变,包体如下(所有常量,都用常量包的数据):
CREATE OR REPLACE PACKAGE BODY PG_TO AS PROCEDURE SP_GET_TO_STATUS(I_TO IN NUMBER, O_TO_STATUS OUT VARCHAR2, O_CODE OUT VARCHAR2) IS V_FLAG BOOLEAN := FALSE; BEGIN -- 默认为失败 O_CODE := PG_CONSTANT.C_CODE_ERROR; V_FLAG := PG_COMMON.SP_IS_EXIST_TO(I_TO => I_TO); IF V_FLAG = TRUE THEN -- 去掉默认,更为具体实现 SELECT t_*.status INTO O_TO_STATUS FROM t_* WHERE t_*.TO = I_TO; ELSE -- TO 号不存在 O_CODE := PG_CONSTANT.C_CODE_ERROR; RETURN; END IF; -- 成功 O_CODE := PG_CONSTANT.C_CODE_SUCCESS; EXCEPTION WHEN OTHERS THEN RAISE; END SP_GET_TO_STATUS; END PG_TO;
先对所有包重新编译。测试如下,
SQL> set serveroutput on ; SQL> SQL> DECLARE 2 V_TO_NO VARCHAR2(10); 3 V_CODE VARCHAR2(10); 4 V_TO_STATUS VARCHAR2(10); 5 BEGIN 6 V_TO_NO := 7369; 7 PG_TO.SP_GET_TO_STATUS(I_TO => V_TO_NO, 8 O_TO_STATUS => V_TO_STATUS, 9 O_CODE => V_CODE); 10 11 IF V_CODE = Pg_Constant.C_CODE_ERROR THEN -- 常量包 12 DBMS_OUTPUT.PUT_LINE(V_CODE); 13 ELSE 14 DBMS_OUTPUT.PUT_LINE('TO STATUS:'||V_TO_STATUS); 15 END IF; 16 END ; 17 / TO STATUS:OPEN
这时,你可以放心的改PG_COMMON,PG_TO包中的所有内容,即在 jboss运行时也可以调整你的过程,而不会出现:
ORA-04068: 已丢弃程序包 的当前状态 ORA-04061: package "SCOTT.PG_TO" 的当前状态失效
这种方式也有一个小小的不足,就是不能随意改动 PG_CONSTANT 包,但比起我们不能改动其它业务包,这种解决是非常满意的了。
参考资料:
/article/9082225.html
/article/11357603.html
相关文章推荐
- oracle 包中的常量(包括全局和私有)与 ORA-04068 错误 (一)
- oracle 包中的全局全量与ORA-04068错误
- Oracle中ORA-06508错误解决,触发器调用存储过程
- ORA-01251错误oracle服务启动无法连接误删非法删除数据文件导致数据库不能打开ORA-01122 ORA-01251
- ORA-28547: 连接服务器失败, 可能是 Oracle Net 管理错误(一种情况,去掉 (PROGRAM = extproc) )
- ORA-28547:connection to server failed, probable Oracle Net admin error错误,解决方法
- ORA-12514: ORACLE 监听错误
- oracle奇怪的ora-00955错误的解决方法
- oracle 10g错误(ORA-00000~ORA-00830 )
- Oracle: ORA-错误
- [oracle][免安装Oracle客户端] ORA-12705: Cannot access NLS data files or invalid environment specified 错误
- oracle服务重建与ora-01034错误
- myeclipse连接oracle出现ora-12705错误的解决办法
- Oracle安装错误ora-00922(zhuan)
- Oracle提示错误消息ORA-28001: the password has expired
- oracle ORA-14452错误处理例程
- 案例学习Oracle错误:ORA-00600
- 连接Oracle 10g时ORA-12514: TNS: 监听进程不能解析在连接描述符中给出的 SERVICE_NAME 错误的解决
- Oracle 错误总结及问题解决 ORA
- Windows平台下登陆Oracle出现ORA-01031错误解决办法