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

时间:2015-08-03 14:08:00

标签: oracle plsql synonym

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

insert into my_table select * from my_synonym@my_database_link;

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

5 个答案:

答案 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中查找。

     

     

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

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

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

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

      创建数据库链接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;