Oracle PL / SQL Проверьте, существует ли и работает ли DB Link - PullRequest
0 голосов
/ 25 октября 2018

Я хочу иметь функцию, которая проверяет, существует ли и работает ли ссылка на базу данных, указанная в строке имени.Я застрял в написании исключения, я не знаю, как поймать коды ошибок.

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

Ответы [ 2 ]

0 голосов
/ 25 октября 2018

Вы можете поймать конкретную ошибку, объявив переменную исключения и связав ее с этим кодом ошибки;Например:

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 блоках и возвращали соответствующее значение.

0 голосов
/ 25 октября 2018

Я нашел способ обойти определенные исключения, я просто перехватил все остальные исключения:

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