如何捕获游标声明中的错误?

时间:2013-06-12 05:32:13

标签: oracle plsql oracle10g

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

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块一样。

2 个答案:

答案 0 :(得分:3)

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

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

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

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

答案 1 :(得分:0)

需要考虑的一个选择:

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

然后,编写一个使用动态SQL查询DUAL@db_link的简单存储过程。在运行时调用此方法以在运行过程之前测试链接。即使链接已关闭,此过程也不会被标记为无效。

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

相关问题