问题描述
Oracle数据库(版本8 )充当PL/SQL API ,提供对该数据库中不同过程和表的访问。
我有另一个Oracle数据库(版本10g ) ,它通过数据库链接使用这些过程和表。
我将数据库升级到了12g版本,但显然在使用版本8和12g之间的数据库链接时存在兼容性问题。因此,想出了一个计划,用Oracle版本10g创建第三个数据库,并将其放在8g到12g之间作为“代理”。
建立了从v12g到v10g以及从v10g到v8的数据库链接。在“代理”(v10g)数据库中为v8数据库中的表和过程创建了同义词。我可以从v12g中创建一个标准SELECT子句:
但是把它变成匿名的:
给出错误: "PL/SQL : ORA-00980 :同义词翻译不再有效。“有什么方法可以通过v10g从v12g访问v8过程和表-这意味着通过2个数据库链接?
我有另一个Oracle数据库(版本10g ) ,它通过数据库链接使用这些过程和表。
我将数据库升级到了12g版本,但显然在使用版本8和12g之间的数据库链接时存在兼容性问题。因此,想出了一个计划,用Oracle版本10g创建第三个数据库,并将其放在8g到12g之间作为“代理”。
建立了从v12g到v10g以及从v10g到v8的数据库链接。在“代理”(v10g)数据库中为v8数据库中的表和过程创建了同义词。我可以从v12g中创建一个标准SELECT子句:
select column from table@dblink;
但是把它变成匿名的:
declare
sVar varchar2(200);
begin
select column into sVar from table@dblink;
dbms_output.put_line(sVar);
end;
给出错误: "PL/SQL : ORA-00980 :同义词翻译不再有效。“有什么方法可以通过v10g从v12g访问v8过程和表-这意味着通过2个数据库链接?
专家解答
这是因为PL/SQL *编译*的东西超过“1跳”(因为缺少更好的术语)。
来自MOS注释453754.1
---------------------------
症状
PL/SQL块失败并出现错误: ORA-00980 :从远程数据库中选择数据时,同义词转换不再有效。以下代码演示了此问题:
在DB3上(创建表)
连接u3/u3
“删除表”选项卡;
CREATE TABLE选项卡( c1编号) ;
插入到选项卡值(1) ;
提交;
在DB2上(在DB3上创建表的同义词)
连接u2/u2
删除数据库链接dblink2 ;
创建数据库链接dblink2连接到u3使用'EMT102U6'标识的u3 ;
SELECT *从全局名称@dblink2 ;
删除同义异名同步2 ;
创建SYNNYM Sync2 FOR选项卡@dblink2 ;
选择*从同步2中选择;
在DB1上(在DB2上创建同义词的同义词)
连接u1/u1
删除数据库链接dblink1 ;
创建数据库链接dblink1连接到u2使用'EMT102W6'标识的u2 ;
SELECT *从全局名称@dblink1 ;
删除同义异名同步1 ;
CREATE SYNONM sym1 for sym2@dblink1 ;
从Sync1中选择c1 ;
此操作在SQL中有效,但从PL/SQL调用时失败
宣布
编号;
开始
选择c1到num从sim1中;
结束;
/
第4行出错:
ORA-06550 :第4行,第3列:
PL/SQL : ORA-00980 :同义词翻译不再有效
ORA-06550 :第4行,第3列:
PL/SQL :忽略SQL语句
原因
错误2829591从PL/SQL过程中查询9I -> 8I-> 7.3.4 , GET ORA-980中报告了此问题。由于以下原因,此错误被关闭为“不是一个错误”
PL/SQL无法指示中间数据库(DB2)在编译阶段遵循数据库链接。因此,为了编译并运行这个PL/SQL块,应该在前端数据库DB1上定义数据库链接dblink1和dblink2。在运行时,数据库链接dblink2将按预期在DB2中查找。
解决方案
要实施解决方案,请执行以下步骤:
1.在DB1上创建指向DB3的数据库链接dblink2
SQL>使用'EMT102U6'创建数据库链接dblink2连接到由u3标识的u3 ;
2.在DB1上创建并编译PL/SQL块。
创建数据库链接dblink2连接到u3使用'EMT102U6'标识的u3 ;
SELECT *从全局名称@dblink2 ;
宣布
编号;
开始
选择c1到num从sim1中;
结束;
/
PL/SQL过程已成功完成。
提示:另一种方法是在PL/SQL块中使用动态SQL作为变通方法。使用动态SQL时,数据库链接在编译时而在运行时解析。
---------------------------
来自MOS注释453754.1
---------------------------
症状
PL/SQL块失败并出现错误: ORA-00980 :从远程数据库中选择数据时,同义词转换不再有效。以下代码演示了此问题:
在DB3上(创建表)
连接u3/u3
“删除表”选项卡;
CREATE TABLE选项卡( c1编号) ;
插入到选项卡值(1) ;
提交;
在DB2上(在DB3上创建表的同义词)
连接u2/u2
删除数据库链接dblink2 ;
创建数据库链接dblink2连接到u3使用'EMT102U6'标识的u3 ;
SELECT *从全局名称@dblink2 ;
删除同义异名同步2 ;
创建SYNNYM Sync2 FOR选项卡@dblink2 ;
选择*从同步2中选择;
在DB1上(在DB2上创建同义词的同义词)
连接u1/u1
删除数据库链接dblink1 ;
创建数据库链接dblink1连接到u2使用'EMT102W6'标识的u2 ;
SELECT *从全局名称@dblink1 ;
删除同义异名同步1 ;
CREATE SYNONM sym1 for sym2@dblink1 ;
从Sync1中选择c1 ;
此操作在SQL中有效,但从PL/SQL调用时失败
宣布
编号;
开始
选择c1到num从sim1中;
结束;
/
第4行出错:
ORA-06550 :第4行,第3列:
PL/SQL : ORA-00980 :同义词翻译不再有效
ORA-06550 :第4行,第3列:
PL/SQL :忽略SQL语句
原因
错误2829591从PL/SQL过程中查询9I -> 8I-> 7.3.4 , GET ORA-980中报告了此问题。由于以下原因,此错误被关闭为“不是一个错误”
PL/SQL无法指示中间数据库(DB2)在编译阶段遵循数据库链接。因此,为了编译并运行这个PL/SQL块,应该在前端数据库DB1上定义数据库链接dblink1和dblink2。在运行时,数据库链接dblink2将按预期在DB2中查找。
解决方案
要实施解决方案,请执行以下步骤:
1.在DB1上创建指向DB3的数据库链接dblink2
SQL>使用'EMT102U6'创建数据库链接dblink2连接到由u3标识的u3 ;
2.在DB1上创建并编译PL/SQL块。
创建数据库链接dblink2连接到u3使用'EMT102U6'标识的u3 ;
SELECT *从全局名称@dblink2 ;
宣布
编号;
开始
选择c1到num从sim1中;
结束;
/
PL/SQL过程已成功完成。
提示:另一种方法是在PL/SQL块中使用动态SQL作为变通方法。使用动态SQL时,数据库链接在编译时而在运行时解析。
---------------------------
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




