首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >ORA-00980同义词翻译在PLSQL中不再有效

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

Stack Overflow用户
提问于 2015-08-03 14:08:00
回答 5查看 45.7K关注 0票数 14

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

代码语言:javascript
运行
复制
insert into my_table select * from my_synonym@my_database_link;

如果我将上述语句放入PLSQL块中,它将不会编译,从而产生错误消息"ORA-00980:同义词翻译不再有效“。标准的解释是同义词所指向的表已被删除,等等,但事实并非如此,因为语句在SQL中工作。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2015-08-04 10:13:11

感谢所有想帮忙的人。这实际上是Oracle的一个限制:

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

适用于: PL/SQL -版本9.2.0.8及更高版本本文档中的信息适用于任何平台。在01-2015年4月-2015年检查了相关性 病征 当从远程数据库中选择数据时,PL/SQL块失败: ORA-00980:同义词转换不再有效。以下代码演示了此问题: 在DB3上(创建表) 连接u3/u3删除表选项卡;创建表选项卡(c1编号);插入选项卡值(1);提交; 关于DB2 (在DB3上创建表的同义词) 连接u2/u2删除数据库链接dblink2;使用“EMT102U6”创建数据库链接dblink2连接到u3标识的u3;从global_name@dblink2选择*;删除同义词syn2;为tab@ DB1 2创建同义词syn2;从syn2选择*;在DB1上创建同义词(在DB2上创建同义词) 连接u1/u1删除数据库链接dblink1;创建数据库链接dblink1连接到u2使用‘EMT102W6’标识的u2;从global_name@dblink1选择*;删除同义词syn1;为syn2@dblink1 1创建同义词syn1;从syn1选择c1;这在SQL中有效,但当从PL/SQL调用时失败 声明num编号;开始从syn1中选择syn1中的num; 错误出现在第4行: ORA-06550:第4行,第3列: PL/ SQL : ORA-00980:同义词翻译不再有效ORA-06550:第4行,第3列: PL/SQL:忽略SQL语句 原因 这一问题在9I -> 8I-> 7.3.4的PL/SQL过程中的Bug 2829591中有报道,得到了ORA-980。此bug被关闭为“NOT”,原因如下 PL/SQL不能指示中间数据库(DB2)在编译阶段遵循数据库链接。因此,为了使这个PL/SQL块能够编译和运行,应该在前端数据库-- dblink1上定义数据库链接DB1和dblink2。在运行时,dblink2将按预期在DB2中查找。 解决方案 要实现该解决方案,请执行以下步骤:

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

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

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

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

从global_name@dblink2中选择*;声明数字;开始

从c1;END;/ PL/SQL过程中成功地将syn1选择为num。

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

票数 3
EN

Stack Overflow用户

发布于 2015-08-03 14:11:53

如果某些内容在SQL中有效,但在PL/SQL中不起作用,那么在大多数情况下,这是特权的问题。

当您输入PL/SQL块时,用户通过角色接收的任何特权都不是活动的。因此,基础表上的SELECT特权很可能是通过角色授予的,因此在PL/SQL块中并不是“活动的”。

通常的解决方法是直接将特权授予用户,而不是通过角色。

票数 3
EN

Stack Overflow用户

发布于 2019-05-09 10:04:03

解决方案是使用Oracle视图。

代码语言:javascript
运行
复制
CREATE VIEW v_my_synomym as (select * from my_synonym@my_database_link);

然后在您的包或过程中引用视图,即:

代码语言:javascript
运行
复制
insert into my_table select * from v_my_synonym;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31789485

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档