如何通过Loopback Database Link调用PL / SQL过程/包?

我能够在一个真实的数据库链接上调用PL / SQL过程和包,但是在环回数据库链接(引用同一数据库中的模式的数据库链接,用于测试目的)上似乎无法这样做,在两个不同的数据库中

是否有通过环回数据库链接执行远程plsql包/过程/函数所需的技巧?

本地数据库(foo):

CREATE DATABASE LINK MATTHEW@INST1 CONNECT TO bar IDENTIFIED BY password USING 'MATTHEW';
-- this works fine, as well as selecting from other tables
SELECT * FROM dual@MATTHEW@INST1;

远程数据库(条形图):

create package test_pkg
is
    PROCEDURE test_proc;
end;
/
create package body test_pkg
is
    procedure test_proc
    is
    begin
        dbms_output.put_line('hello');
    end;
end;
/

create procedure test_proc
is
begin
    dbms_output.put_line('hello');
end;
/


create or replace function ff return number
is
begin
    return 55;
end;
/

本地数据库(foo)

BEGIN
    test_proc@MATTHEW@INST1;
END;
/

错误报告:ORA-06550:第2行,第5列:PLS-00201:必须声明标识符'TEST_PROC @ MATTHEW @ INST1'

BEGIN
    test_pkg.test_proc@MATTHEW@INST1;
END;
/

错误报告:ORA-06550:第2行,第5列:PLS-00201:必须声明标识符'TEST_PKG.TEST_PROC @ MATTHEW @ INST1'

select ff@MATTHEW@INST1 from dual;

ORA-00904:"FF":无效标识符00904. 00000 - "%s: invalid identifier" *原因:
*行动:

回答(2)

3 years ago

显然,需要将通过环回数据库链接创建的包/过程/函数授予调用者 .

-- As the Bar schema
GRANT EXECUTE on test_proc TO foo;
GRANT EXECUTE on test_pkg TO foo;
GRANT EXECUTE on ff to foo;

当然,对于跨两个数据库的真正数据库链接,这根本不是必需的,那么为什么这里有必要呢?

查看documenation(向下滚动到"Global Name as a Loopback Database Link"):

您可以使用数据库的全局名称作为环回数据库链接,而无需显式创建数据库链接 . 当SQL语句中的数据库链接与当前数据库的全局名称匹配时,实际上会忽略数据库链接 . 例如,假设数据库的全局名称是db1.example.com . 您可以在此数据库上运行以下SQL语句:SELECT * FROM hr.employees@db1.example.com;在这种情况下,SQL语句的@ db1.example.com部分实际上被忽略 .

因此,似乎Oracle甚至不使用环回,因此解释了为什么需要授权 .

3 years ago

我们能看到一个完整的自上而下的脚本吗?我无法在我的数据库上重现该错误

SQL> create user foo identified by foo;

User created.

SQL> create user bar identified by bar;

User created.

SQL> grant create session, create procedure, create database link to foo;

Grant succeeded.

SQL> grant create session, create procedure, create database link to bar;

Grant succeeded.

SQL>
SQL> conn foo/foo
Connected.
SQL> create database link matthew@inst1 connect to bar identified by bar using 'db122';

Database link created.

SQL> select * from dual@matthew@inst1;

D
-
X

1 row selected.

SQL>
SQL> conn bar/bar
Connected.
SQL> create or replace
  2  procedure my_proc is
  3  begin
  4    null;
  5  end;
  6  /

Procedure created.

SQL> conn foo/foo
Connected.
SQL> BEGIN
  2      my_proc@MATTHEW@INST1;
  3  END;
  4  /

PL/SQL procedure successfully completed.

SQL>