ORA-00980同义词翻译在PLSQL中不再有效

D V*_*per 8 oracle plsql synonym

我有一个远程Oracle数据库的同义词,我可以通过数据库链接在SQL中访问,例如,

insert into my_table select * from my_synonym@my_database_link;
Run Code Online (Sandbox Code Playgroud)

如果我将上述语句放入PLSQL块,它将无法编译,给出错误消息"ORA-00980:同义词转换不再有效".标准解释是同义词指向的表已被删除等,但事实并非如此,因为该语句在SQL中有效.

D V*_*per 3

感谢所有试图提供帮助的人。事实证明这是 Oracle 的一个限制:

https://support.oracle.com/rs?type=doc&id=453754.1

适用于:

PL/SQL - 版本 9.2.0.8 及更高版本 本文档中的信息适用于任何平台。 2015 年 4 月 1 日检查相关性

症状

从远程数据库选择数据时,PL/SQL 块失败并出现错误:ORA-00980:同义词转换不再有效。下面的代码演示了这个问题:

在 DB3 上(创建表)

连接 u3/u3 删除表选项卡;创建表选项卡(c1 编号);插入选项卡值 (1);犯罪;

在 DB2 上(创建 DB3 上表的同义词)

连接 u2/u2 删除数据库链接 dblink2; 创建数据库链接 dblink2 连接到 u3 使用“EMT102U6”标识的 u3;SELECT * FROM 全局名称@dblink2; 删除同义词 syn2; 为 tab@dblink2 创建同义词 syn2;从 syn2 中选择*;

在 DB1 上(创建与 DB2 上的同义词相同的同义词)

连接 u1/u1 删除数据库链接 dblink1; 创建数据库链接 dblink1 连接到 u2 使用“EMT102W6”识别的 u2;SELECT * FROM 全局名称@dblink1; 删除同义词 syn1; 为 syn2@dblink1 创建同义词 syn1;从 syn1 中选择 c1;

这在 SQL 中有效,但从 PL/SQL 调用时失败

声明编号;开始从 syn1 中选择 c1;结尾; /

第 4 行出现错误:ORA-06550:第 4 行,第 3 列:PL/SQL:ORA-00980:同义词翻译不再有效 ORA-06550:第 4 行,第 3 列:PL/SQL:忽略 SQL 语句

原因

Bug 2829591 在 9I -> 8I-> 7.3.4 中查询 PL/SQL 过程,获取 ORA-980 中报告了此问题。由于以下原因,该错误被视为“不是错误”而被关闭

PL/SQL 无法在编译阶段指示中间数据库 (DB2) 跟踪数据库链接。因此,为了编译和运行该 PL/SQL 块,应在前端数据库 DB1 上定义数据库链接 dblink1 和 dblink2。在运行时期间,数据库链接 dblink2 将按预期在 DB2 中查找。

解决方案

要实施该解决方案,请执行以下步骤:

  1. 在DB1上创建指向DB3的数据库链接dblink2

SQL> 使用 'EMT102U6' 创建数据库链接 dblink2 连接到 u3 标识的 u3;

  1. 在 DB1 上创建并编译 PL/SQL 块。

创建数据库链接 dblink2 连接到 u3 使用“EMT102U6”标识的 u3;

SELECT * FROM 全局名称@dblink2; 声明编号;开始
从 syn1 中选择 c1;结尾; /PL/SQL 过程成功完成。

提示:另一种选择是在 PL/SQL 块中使用动态 SQL 作为解决方法。使用动态 SQL 时,数据库链接不是在编译时而是在运行时解析。