我搜索了几个解决方案.其中之一是以下内容:
@H_404_1@原因
需要远程映射语句,但无法实现,因为global_names应设置为TRUE才能实现 @H_404_1@行动
如果可能,发出alter session set global_names = true @H_404_1@但我不明白为什么我需要设置global_names参数…为什么远程映射使用global_names参数?拜托,你能解释一下吗? @H_404_1@P.S我知道设置global_names参数将产生全局命名规则,数据库链接名称必须与远程数据库名称相同.并且它还将域名附加到数据库名称,如< DB_NAME>.< DB_DOMAIN>还有什么?
需要远程映射语句,但无法实现,因为global_names应设置为TRUE才能实现 @H_404_1@行动
如果可能,发出alter session set global_names = true @H_404_1@但我不明白为什么我需要设置global_names参数…为什么远程映射使用global_names参数?拜托,你能解释一下吗? @H_404_1@P.S我知道设置global_names参数将产生全局命名规则,数据库链接名称必须与远程数据库名称相同.并且它还将域名附加到数据库名称,如< DB_NAME>.< DB_DOMAIN>还有什么?
答案在这里讨论:
http://dba010.wordpress.com/2011/01/05/oracle-errorsora/#ORA-02069
@H_404_1@如果链接不起作用:
@H_404_1@错误:
@H_404_1@ORA-02069:此操作必须将global_names参数设置为TRUE
@H_404_1@原因:
@H_404_1@您正尝试使用本地函数在远程数据库上进行DML操作.
@H_404_1@这是“Oracle Bug”,它应该可以工作,但事实并非如此.
@H_404_1@示例(为了更好地理解):
@H_404_1@ – 假设我们有两个数据库DB1和DB2
@H_404_1@ – 在DB1上我们有函数fun1
通过数据库链接与某些用户连接到DB1 …如果对您没有关系,则使用它J). @H_404_1@解决方案二: @H_404_1@>在本地数据库上创建临时表.>将行插入临时表.>将临时表从临时表插入远程数据库.>删除临时行.请注意,此解决方案比第一个解决方案慢.但它也解决了这个问题并且更加安全.
create function fun1 return number is begin return 1; end;@H_404_1@ – 在DB1上,我们有一个引用DB2的数据库链接,为简单起见,称为DB2. @H_404_1@ – 检查它是否有效.
select * from dual@DB2@H_404_1@ – 如果输出如下,那么它可以工作.
DUMMY ----- X@H_404_1@-Let在DB2中创建测试表(连接到DB2数据库)
create table tesTable( id number,testColumn number );@H_404_1@ – 让我们做一些DML操作,这会导致ORA-02069错误.
insert into testable@DB2(id,testColumn) values(1,fun1); “ORA-02069: global_names parameter must be set to TRUE for this operation”@H_404_1@现在,当您已经知道在什么情况下发生此错误时,让我们编写解决方案.它有两个解决方案: @H_404_1@解决方案一: @H_404_1@>将global_names参数设置为true,可以在系统级别或会话级别上进行(请考虑有时会话级别不可用) @H_404_1@ – 在DB1上
alter session set global_names=true;@H_404_1@>在远程数据库上创建数据库链接,在我们的例子中是DB2,它将引用数据库DB1(使链接名称与数据库全局名称相同,因为将global_names参数设置为true需要它). @H_404_1@ – 在DB2上
Create database link DB1 connect to <username> identified by <password> using ‘DB1’;@H_404_1@现在它应该工作,但我应该提到创建数据库链接可能不是更好, @H_404_1@因为它不安全(你应该猜到为什么,因为如果你这样做,你将能够
通过数据库链接与某些用户连接到DB1 …如果对您没有关系,则使用它J). @H_404_1@解决方案二: @H_404_1@>在本地数据库上创建临时表.>将行插入临时表.>将临时表从临时表插入远程数据库.>删除临时行.请注意,此解决方案比第一个解决方案慢.但它也解决了这个问题并且更加安全.