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;
/
您的匿名块将看到:
Caught exception
Connection X successful: 0
PL/SQL procedure successfully completed.
如果出现任何其他错误,则不会被捕获(因为它会使用 with others
),并且调用者会看到该异常 - 并能够处理它或传递它。
您可能希望您的函数明确捕获并处理其他错误 - 例如,如果 link 存在但凭据错误 - 您可以使用适当的编译指示为这些错误定义其他异常,这样您在它们自己的 when
块中捕获它们并 return 一个适当的值。
我想要一个函数来检查由名称字符串指定的数据库 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;
/
您的匿名块将看到:
Caught exception
Connection X successful: 0
PL/SQL procedure successfully completed.
如果出现任何其他错误,则不会被捕获(因为它会使用 with others
),并且调用者会看到该异常 - 并能够处理它或传递它。
您可能希望您的函数明确捕获并处理其他错误 - 例如,如果 link 存在但凭据错误 - 您可以使用适当的编译指示为这些错误定义其他异常,这样您在它们自己的 when
块中捕获它们并 return 一个适当的值。