0

我需要编写 PL SQL,通过 DB 链接从另一个数据库获取数据并对其执行一些操作。

DECLARE
   CURSOR cur_progs
   IS
      SELECT *
        FROM allen.table_dummy@db_link;

BEGIN
    ... 
    ...
END;
/

在上面的例子中,我遇到了两个问题。

未创建链接时,将引发以下错误消息

ORA-04054: database link db_link does not exist

当链接存在但创建链接的用户的密码现已过期时,将抛出以下错误消息

ORA-04052: error occurred when looking up remote object allen.table_dummy@db_link ORA-00604: error occurred at recursive SQL level 1 ORA-01017: invalid username/password; logon denied ORA-02063: preceding line from db_link

有没有办法捕捉这两个错误?类似于在 PLSQL 块中编写 PLSQL 块。

4

2 回答 2

3

您得到的错误是编译错误。您无法捕获编译错误(这在任何语言中都是如此,而不仅仅是 PL/SQL)。

如果您真的确定,您可以更改代码以使用动态 SQL,以便将错误从编译错误变为运行时错误。这意味着您可以在异常处理程序中捕获错误。但这样做似乎是一个非常糟糕的主意。

首先,无论是在运行时还是在编译时抛出错误,错误似乎都是致命的。如果数据库链接不存在或密码无效,您似乎不太可能在异常处理程序中做一些有用的事情。鉴于您应该只捕获您期望的异常并且您可以做一些有用的事情,因此捕获这些错误似乎不太可能有用。

其次,从静态 SQL 迁移到动态 SQL 通常会使您的代码更难编写和维护。此外,它经常使代码效率降低,安全性降低。

于 2013-06-12T07:20:45.777 回答
0

要考虑的一种选择:

选择数据库链接正常运行的时间,然后编译存储过程(最好在包中)。这样,您就知道该过程处于有效的编译状态。

然后,编写一个使用动态 SQL 进行查询的简单存储过程DUAL@db_link。在运行过程之前调用它来测试链接。即使链接断开,此过程也不会被标记为无效。

如果链接暂时断开,您的主存储过程不会被标记为无效,除非您尝试编译它。

于 2013-06-12T07:33:50.720 回答