【问题标题】:How to call a PL/SQL Procedure/Package over a Loopback Database Link?如何通过环回数据库链接调用 PL/SQL 过程/包?
【发布时间】:2018-11-27 20:52:30
【问题描述】:

我可以调用 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;

远程数据库(条形模式):

创建包 test_pkg 是 程序 test_proc; 结尾; / 创建包体 test_pkg 是 程序 test_proc 是 开始 dbms_output.put_line('你好'); 结尾; 结尾; / 创建过程 test_proc 是 开始 dbms_output.put_line('你好'); 结尾; / 创建或替换函数 ff 返回编号 是 开始 返回 55; 结尾; /

本地数据库(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:无效标识符” *原因:
*行动:

【问题讨论】:

    标签: oracle plsql oracle12c


    【解决方案1】:

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

    -- 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(向下滚动到“作为环回数据库链接的全局名称”):

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

    所以看来,Oracle 甚至没有使用环回,从而解释了为什么需要授权。

    【讨论】:

      【解决方案2】:

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

      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>
      

      【讨论】:

        猜你喜欢
        • 2021-02-28
        • 1970-01-01
        • 1970-01-01
        • 2012-05-29
        • 2018-04-05
        • 2011-05-03
        • 2010-09-19
        • 2018-10-28
        • 1970-01-01
        相关资源
        最近更新 更多