繁体   English   中英

Oracle PL / SQL检查数据库链接是否存在并正常工作

[英]Oracle PL/SQL Check whether DB Link exists and works

我想拥有一个检查由名称字符串指定的数据库链接是否存在并起作用的函数。 我被困在编写异常,我不知道如何捕获错误代码。

create or replace function CHECK_DB_LINK(dbLink IN VARCHAR2) RETURN int IS
  stmt VARCHAR2(99) ;
BEGIN
  stmt := 'select 1 from dual@' || dbLink;
  execute immediate stmt;
  return 1;
EXCEPTION  -- exception handlers begin

-- Only one of the WHEN blocks is executed.

   WHEN 2019 THEN  
      dbms_output.put_line('Caught exception');
      return 0;
END;
/
set serveroutput on;
DECLARE 
   c int; 
BEGIN 
   c := CHECK_DB_LINK('X');
   dbms_output.put_line('Connection '||'X'||' successful: ' || c); 
END; 

ORA-02019: connection description for remote database not found
ORA-06512: at "CONFIGURATION.CHECK_DB_LINK", line 5
ORA-06512: at line 4

您可以通过声明异常变量并将其链接到该错误代码来捕获特定错误。 例如:

create or replace function CHECK_DB_LINK(dbLink IN VARCHAR2) RETURN int IS
  stmt VARCHAR2(99) ;
  no_such_link EXCEPTION;
  pragma exception_init(no_such_link, -2019);
BEGIN
  stmt := 'select 1 from dual@' || dbLink;
  execute immediate stmt;
  return 1;
EXCEPTION 
  WHEN no_such_link THEN  
    dbms_output.put_line('Caught exception');
    return 0;
END;
/

阅读更多。

然后,您的匿名阻止将看到:

Caught exception
Connection X successful: 0


PL/SQL procedure successfully completed.

如果提出的任何其他错误,那么它不会被抓(因为它会使用with others ),并且调用者会看到该异常-并能够处理它或把它传递。

您可能希望函数显式捕获并处理其他错误(例如,如果链接存在但凭据错误),并且可以使用适当的编译指示为这些异常定义其他异常,以便when阻塞并返回when其捕获为自己的异常一个适当的值。

我找到了一种解决方法来捕获特定的异常,而我只捕获了所有其他异常:

create or replace function CHECK_DB_LINK(dbLink IN VARCHAR2) RETURN int IS
  stmt VARCHAR2(99) ;
BEGIN
  stmt := 'select 1 from dual@' || dbLink;
  execute immediate stmt;
  return 1;
EXCEPTION
  WHEN OTHERS THEN  
      -- dbms_output.put_line('Caught exception');
      return 0;
END;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM