我在远程Oracle数据库上有一个同义词,我可以通过数据库链接访问SQL,例如,
insert into my_table select * from my_synonym@my_database_link;
如果我将上述语句放入PLSQL块,它将无法编译,给出错误消息“ORA-00980:同义词转换不再有效”。标准解释是同义词指向的表已被删除等,但事实并非如此,因为该语句在SQL中有效。
答案 0 :(得分:2)
如果在SQL中有效但在PL / SQL中没有,那么在大多数情况下,这是特权问题。
当您输入PL / SQL块时,用户通过角色收到的任何权限都不活动。因此,很可能基础表的SELECT
权限是通过角色授予的,因此在PL / SQL块中不是“活动的”。
通常的解决方法是直接向用户授予权限,而不是通过角色。
答案 1 :(得分:2)
感谢所有试图提供帮助的人。结果证明这是Oracle的限制:
https://support.oracle.com/rs?type=doc&id=453754.1
适用于:
PL / SQL - 版本9.2.0.8及更高版本本文档中的信息 适用于任何平台。 2015年4月1日检查相关性
症状
PL / SQL块失败并显示错误:ORA-00980:同义词转换为no 从远程数据库中选择数据时,有效期更长。该 以下代码演示了此问题:
在DB3上(创建表格)
CONNECT u3 / u3 DROP TABLE选项卡; CREATE TABLE选项卡(c1编号);插入 INTO标签VALUES(1); COMMIT;
在DB2上(在DB3上创建表的同义词)
CONNECT u2 / u2 DROP DATABASE LINK dblink2;创建数据库链接 dblink2通过u3使用' EMT102U6'连接到u3;选择 * FROM global_name @ dblink2; DROP SYNONYM syn2;创建SYNONYM syn2 FOR tab @ dblink2; SELECT * FROM syn2;
在DB1上(创建DB2上同义词的同义词)
CONNECT u1 / u1 DROP DATABASE LINK dblink1;创建数据库链接 dblink1通过u2使用' EMT102W6'连接到u2;选择 * FROM global_name @ dblink1; DROP SYNONYM syn1;创建SYNONYM syn1 FOR syn2 @ dblink1;从syn1中选择c1;
这在SQL中有效,但在从PL / SQL
调用时失败DECLARE num 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 PL / SQL中报告了此问题 9I中的程序 - > 8I-> 7.3.4,获得ORA-980。这个bug已经关闭 作为'不是一个BUG'由于以下原因
PL / SQL无法指示中间数据库(DB2)跟随数据库 编译阶段的链接。因此为了这个PL / SQL 阻止编译和运行,数据库链接dblink1和dblink2 应该在前端数据库 - DB1上定义。在运行时 数据库链接dblink2将按预期在DB2中查找。
解
要实施此解决方案,请执行以下步骤:
- 在DB1上创建指向DB3的数据库链接dblink2
醇>SQL>创建数据库链接dblink2连接到u3使用的u3标识 ' EMT102U6&#39 ;;
- 在DB1上创建并编译PL / SQL块。
醇>创建数据库链接dblink2连接到u3使用u3识别 ' EMT102U6&#39 ;;
SELECT * FROM global_name @ dblink2; DECLARE num NUMBER; BEGIN
SELECT c1 INTO num FROM syn1;结束; / PL / SQL过程成功 完成。提示:另一个选择是在PL / SQL块中使用dyanmic SQL作为 解决。使用动态SQL时,不会解析数据库链接 在编译时但在运行时。
答案 2 :(得分:0)
检查" my_synonym"的远程数据库授权。必须几乎"选择"对于您在连接字符串中使用的用户,还要检查此同义词指向的对象(可能有人删除了该表)。
答案 3 :(得分:0)
当表/视图/过程的所有者与SYNONYM中提到的所有者不匹配时,我发现了这个问题。
示例:如果表TABLE_BRACH的所有者是ownerA,并且在同义词中提到表所有者是其他东西(非所有者A)。
解决方案: 1.删除SYNONYM 2.使用正确的所有者创建具有相同名称的。
CREATE PUBLIC SYNONYM BRANCH FOR ownerA.TABLE_BRACH ;
答案 4 :(得分:0)
解决方法是改为使用Oracle视图。
CREATE VIEW v_my_synomym as (select * from my_synonym@my_database_link);
然后引用您的程序包或过程中的视图,即:
insert into my_table select * from v_my_synonym;