我需要编写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块一样。
答案 0 :(得分:3)
您获得的错误是编译错误。您无法捕获编译错误(在任何语言中都是如此,而不仅仅是PL / SQL)。
如果您确实如此,可以更改代码以使用动态SQL,以便将错误从编译错误转移到运行时错误。这意味着您可以在异常处理程序中捕获错误。但这样做似乎是一个非常糟糕的主意。
首先,无论是在运行时还是在编译时抛出错误,该错误似乎都是致命的。如果数据库链接不存在或密码无效,您似乎不太可能在异常处理程序中执行某些有用的操作。鉴于你应该只捕获你期望的异常,并且你可以做一些有用的事情,看起来抓这些错误的可能性很小。
其次,从静态SQL迁移到动态SQL通常会使您的代码更难编写并且难以维护。此外,它经常使代码效率降低,安全性降低。
答案 1 :(得分:0)
需要考虑的一个选择:
选择数据库链接运行正常的时间,然后编译存储过程(最好在包中)。这样,您就知道该过程处于有效的编译状态。
然后,编写一个使用动态SQL查询DUAL@db_link
的简单存储过程。在运行时调用此方法以在运行过程之前测试链接。即使链接已关闭,此过程也不会被标记为无效。
如果链接暂时中断,除非您尝试编译,否则主存储过程将不会被标记为无效。