Oracle PL/SQL 检查 DB Link 是否存在和工作

Oracle PL/SQL Check whether DB Link exists and works

我想要一个函数来检查由名称字符串指定的数据库 link 是否存在和工作。我卡在写异常了,不知道怎么捕捉错误码

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) ;
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;

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

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;
/

Read more.

您的匿名块将看到:

Caught exception
Connection X successful: 0


PL/SQL procedure successfully completed.

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

您可能希望您的函数明确捕获并处理其他错误 - 例如,如果 link 存在但凭据错误 - 您可以使用适当的编译指示为这些错误定义其他异常,这样您在它们自己的 when 块中捕获它们并 return 一个适当的值。