首页 文章

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

提问于
浏览 46
1

我能够在一个真实的数据库链接上调用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 回答

  • 2

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

    -- 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甚至不使用环回,因此解释了为什么需要授权 .

  • 0

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

    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>
    

相关问题