当前位置: 首页 > 知识库问答 >
问题:

如何通过环回数据库链接调用PL/SQL过程/包?

百里俭
2023-03-14

我可以通过一个真正的数据库链接调用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:标识符测试_PROC@MATTHEW@必须声明INST1'

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

错误报告:ORA-06550:第2行第5列:PLS-00201:标识符“TEST\u PKG”。测试_PROC@MATTHEW@必须声明INST1'

select ff@MATTHEW@INST1 from dual;

ORA-00904:“FF”:标识符00904无效。00000-%s:无效标识符“*原因:
*操作:

共有2个答案

吕自怡
2023-03-14

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

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>
封永嘉
2023-03-14

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

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

当然,这在跨两个数据库的真正数据库链接上根本没有必要,那么为什么在这里有必要呢?

查看文档(向下滚动到“全局名称作为环回数据库链接”):

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

因此,甲骨文似乎甚至不使用环回,从而解释了为什么需要授权。

 类似资料:
  • 问题内容: 想要连接到通过LAN连接的另一台PC上的数据库。我可以使用带有C:\ Users …这样的字符串的sql server db,但是我无法使用(\\ Server \ c \ user …)这样的字符串进行连接,但我尝试将db文件移动到“我的文档”中我得到这个错误。 我收到以下错误消息:尝试为文件(\\ SERVER \ Users \ Jeswills \ Documents \ TB

  • 问题内容: 如何通过SQL将活动用户连接到PostgreSQL数据库?这可以是用户标识或用户数。 问题答案: (问题)你不知道那个信息吗 选择* from pg_user ; 或使用视图pg_stat_activity: 添加: 视图说: 每个服务器进程一行,显示数据库OID,数据库名称,进程ID,用户OID, 用户名 ,当前查询,查询的等待状态,当前查询开始执行的时间,进程开始的时间以及 客户端

  • 主要内容:PL/SQL子程序的部分,创建存储过程,执行独立程序,删除独立存储过程,PL/SQL子程序中的参数模式,传递参数的方法在本章中,我们将讨论PL/SQL中的存储过程。 子程序是执行特定任务的程序单元/模块。 这些子程序组合起来形成更大的程序。这种做法被称为“模块化设计”。 子程序可以被称为调用程序的另一个子程序或程序调用。 可以在以下几个地方中创建一个子程序 - 在模式(schema)级别中 一个程序包中 在PL/SQL块中 在模式(schema)级别中,子程序是一个独立的子程序。它是使

  • 我是pl/sql编程新手,我需要你的帮助。 我想做个手术。 更具体地说,我有如下表1 对于相同的COL1和COL2/COL3,请检查从COL4中选择不同的值,例如COL1=600、COL2=140/COL3=2和COL2=150/COL3=3返回20和35 并在此表TABLE1中插入行 如果P_FLG1='Y',我在表1中插入。如果P_FLG2='Y',我也在表3等中插入 我正在试着做下面的程序,

  • 用Python来编写网站,必须要能够通过python操作数据库,所谓操作数据库,就是通过python实现对数据的连接,以及对记录、字段的各种操作。上一讲提到的那种操作方式,是看官直接通过交互模式来操作数据库。 安装python-MySQLdb 要想通过python来操作数据库,还需要在已经安装了mysql的基础上安装一个称之为mysqldb的库,它是一个接口程序,python通过它对mysql数据

  • 问题内容: 我是PHP和SQL领域的一名新开发人员。到目前为止,我只完成了Objective- C编程。但是,我的一个项目要求我拥有一个在线数据库,我需要从我的应用程序访问该数据库。我打算使用该框架来远程访问数据库,如下所示: 但这是行不通的,因为我联系了我的托管服务提供商,并且他们已经对其进行了设置,因此我无法从外部主机访问我的数据库(出于安全性考虑)。因此,我将不得不寻找替代方案。我唯一想到的