适用于:
PL/SQL - 版本 9.2.0.8 及更高版本 本文档中的信息
适用于任何平台。
已于 2015 年 4 月 1 日检查相关性
症状
PL/SQL 块失败并出现错误:ORA-00980: synonym translation is no
从远程数据库中选择数据时,有效期更长。这
下面的代码演示了这个问题:
在 DB3 上(创建表)
连接 u3/u3 DROP TABLE 选项卡;创建表选项卡(c1 编号);插入
进入标签值(1);提交;
在 DB2 上(在 DB3 上创建表的同义词)
连接 u2/u2 删除数据库链接 dblink2;创建数据库链接
dblink2 连接到由 u3 使用“EMT102U6”识别的 u3;选择 *
FROM global_name@dblink2;删除同义词 syn2;创建同义词 syn2
FOR tab@dblink2;从 syn2 中选择 *;
在 DB1 上(为 DB2 上的同义词创建同义词)
连接 u1/u1 删除数据库链接 dblink1;创建数据库链接
dblink1 连接到由 u2 使用“EMT102W6”标识的 u2;选择 *
FROM global_name@dblink1;删除同义词 syn1;创建同义词 syn1
对于 syn2@dblink1;从 syn1 中选择 c1;
这在 SQL 中有效,但在从 PL/SQL 调用时失败
声明数字 NUMBER; BEGIN SELECT c1 INTO num FROM syn1;结尾;
/
第 4 行出现错误:ORA-06550:第 4 行,第 3 列:PL/SQL:ORA-00980:
同义词翻译不再有效 ORA-06550:第 4 行,第 3 列:
PL/SQL:忽略 SQL 语句
原因
此问题已在错误 2829591 QUERING FROM A PL/SQL 中报告
9I -> 8I-> 7.3.4 中的过程,获取 ORA-980。此错误已关闭
出于以下原因,作为“不是 BUG”
PL/SQL 不能指示中间数据库(DB2)跟随数据库
在编译阶段链接。因此,为了这个 PL/SQL
块编译和运行,数据库链接 dblink1 和 dblink2
应该在前端数据库 - DB1 上定义。在运行时
数据库链接 dblink2 将按预期在 DB2 中查找。
解决方案
要实施该解决方案,请执行以下步骤:
- 在 DB1 上创建指向 DB3 的数据库链接 dblink2
SQL> 创建数据库链接 dblink2 连接到由 u3 识别的 u3 使用
'EMT102U6';
- 在 DB1 上创建和编译 PL/SQL 块。
创建数据库链接 dblink2 连接到由 u3 识别的 u3 使用
'EMT102U6';
SELECT * FROM global_name@dblink2;声明数字 NUMBER;开始
从 syn1 中选择 c1 到 num;结尾; /PL/SQL 程序成功
完全的。
提示:另一种选择是在 PL/SQL 块中使用动态 SQL 作为
解决问题。使用动态 SQL 时,无法解析数据库链接
在编译时但在运行时。