Вы можете поймать конкретную ошибку, объявив переменную исключения и связав ее с этим кодом ошибки;Например:
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
блоках и возвращали соответствующее значение.