【问题标题】:How to catch error in cursor declaration?如何在游标声明中捕获错误?
【发布时间】:2013-06-12 15:33:50
【问题描述】:

我需要编写 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 块。

【问题讨论】:

标签: oracle plsql oracle10g


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

    要考虑的一个选项:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-02-06
      • 1970-01-01
      • 2016-01-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-17
      相关资源
      最近更新 更多