如何通过dblink引用Oracle PLSQL包中的公共EXCEPTION?
通过DBLink引用远程PL/SQL包中的异常问题
我们在Oracle 11g的db_main数据库owner模式下,编译了一个名为pkg_exception的PL/SQL包,里面定义了一批代码中通用的标准异常。包规范中的异常定义示例如下:
E_SOME_EXCEPTION EXCEPTION; PRAGMA EXCEPTION_INIT(E_SOME_EXCEPTION, -20002);
在db_main本地代码中,引用这些异常非常简单:
RAISE pkg_exception.E_SOME_EXCEPTION;
但当尝试从db_aux数据库通过dblink(db_main_reader,连接到db_main中可访问owner.pkg_exception的模式)抛出该异常时,编译始终报错,以下是尝试的几种语法及对应的错误:
-- 1. 直接引用(无效) RAISE pkg_exception.E_SOME_EXCEPTION; -- PLS-00201: 标识符 'PKG_EXCEPTION.E_SOME_EXCEPTION' 必须声明 -- 2. 常规DBLink引用语法(无效) RAISE pkg_exception.E_SOME_EXCEPTION@db_main_reader; -- PLS-00103: 遇到符号 "@",需要以下之一: . ; -- 3. 调整DBLink位置(仍无效) RAISE pkg_exception@db_main_reader.E_SOME_EXCEPTION; -- PLS-00103: 遇到符号 "@",需要以下之一: . ;
需要说明的是,通过dblink可以正常引用包规范中的其他公共对象:
-- 变量 v_foo pkg_exception.FOO@db_main_reader; -- 函数 pkg_exception.get_foo@db_main_reader(...); -- 存储过程 pkg_exception.foo@db_main_reader(...);
唯独异常无法通过dblink直接引用,请问在Oracle PL/SQL中如何通过dblink引用EXCEPTION?还是必须在db_aux中本地定义EXCEPTION?
解决方案
通过在db_aux中创建指向远程包的公共同义词,可解决该问题,具体操作如下:
-- 在db_aux中执行: CREATE OR REPLACE PUBLIC SYNONYM pkg_exception FOR owner.pkg_exception@db_main_reader; BEGIN RAISE pkg_exception.E_SOMETHING; EXCEPTION WHEN pkg_exception.E_SOMETHING THEN DBMS_OUTPUT.PUT_LINE(pkg_exception.get_error_message(sqlcode)); END; /
执行后的输出结果:
Elapsed: 00:00:00.057 You raised the "E_SOMETHING" exception. PL/SQL procedure successfully completed.
内容的提问来源于stack exchange,提问作者lycosis
相关产品推荐
相关产品推荐

