oracle 对于此操作,ORA-02069 global_names参数必须设置为TRUE

osh3o9ms  于 2023-02-15  发布在  Oracle
关注(0)|答案(5)|浏览(130)

我找到了几个解决方案,其中之一如下:

原因需要语句的远程Map,但无法实现,因为global_names应设置为TRUE才能实现远程Map
操作如果可能,发出更改会话集global_names = true

但是我不明白为什么要设置global_names参数......为什么远程Map要使用global_names参数?请你解释一下好吗?
我知道设置global_names参数会产生全局命名规则,即数据库链接名必须与远程数据库名相同。此外,它还会将域名附加到数据库名,如<DB_NAME>。<DB_DOMAIN>还有什么?

axkjgtzd

axkjgtzd1#

答案在这里讨论:www.example.comhttp://dba010.wordpress.com/2011/01/05/oracle-errorsora/#ORA-02069
如果链接不起作用:

    • 错误:**

ORA-02069:对于此操作,global_names参数必须设置为TRUE

    • 原因:**

您正在尝试使用本地函数对远程数据库执行DML操作。
这是"甲骨文错误",它应该工作,但它没有。

    • 示例(为了更好地理解):**
  • 假设我们有两个数据库DB1和DB2
  • 在DB1上,我们有函数fun1
create function fun1 return number is
begin
return 1;
end;
  • 在DB1上,我们有一个指向DB2的数据库链接,为简单起见,称为DB2。
  • 检查它的工作。
select *
from dual@DB2
  • 如果输出如下所示,那么它工作。
DUMMY
-----
X
  • 在DB2中创建测试表(连接到DB2数据库)
create table tesTable(
id         number,
testColumn number
);
  • 让我们执行一些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”

现在,当你已经知道这个错误发生在什么情况下,让我们写解决方案。它有两个解决方案:

    • 解决方案一:**

1.将global_names参数设置为true,可以在系统级或会话级完成(考虑到会话级有时不可用)

  • -在DB1上
alter session set global_names=true;

1.在远程数据库上创建数据库链接,在我们的例子中是在DB2上,它将引用数据库DB1(使链接名称与数据库全局名称相同,因为将global_names参数设置为true需要它)。

  • 在DB2上
Create database link DB1 connect to <username> identified by <password>
using ‘DB1’;

现在它应该可以工作了,但是我应该提到创建数据库链接可能不是更好,
因为它不安全(您应该猜到原因,因为如果这样做,您将能够通过数据库链接与某个用户连接到DB1 ......如果这对您来说无关紧要,那么就使用它J)。

    • 解决方案二:**

1.在本地数据库上创建临时表。
1.在临时表中插入行。
1.将临时行从临时表插入远程数据库。
1.删除临时行。请注意,此解决方案比第一个解决方案慢。但它也解决了问题,而且安全得多。

ttcibm8c

ttcibm8c2#

kupa的回答提供了一个很好的解释和很好的解决方案,但是如果你不想或不能遵循解决方案一或二,我建议在这里查看解决方案二:http://dbtricks.com/?p=263.
这对我很有效,创建一个变量并将本地函数的值赋给它,然后在引用远程表的SQL语句中使用该变量。
希望这能像帮助我一样帮助别人!

huwehgph

huwehgph3#

引用this thread

...in the past Oracle used .world as a default domain if domain 
part was not specified in global db name, they changed it (I 
believe in 10g R1, but I'm not sure)
mbyulnm0

mbyulnm04#

如果您在远程SELECT语句上使用本地函数,请尝试在WHERE子句中添加**“rownum〈〉0”**。

nzkunb0c

nzkunb0c5#

尝试通过数据库链接访问远程表时出现相同错误。我的用例是本地数据库位于Docker中,它尝试使用其元数据构建原始链接数据库的子集。尝试获取远程表的列

select *
from all_tab_cols@remotedb r
where r.table_name = 'SOME_TABLE'

生成ORA-02069。由于尝试使用create table as select * ...创建本地表,我被告知LONG类型的某些列无法传输。实际上,我不需要*,并且具有简单类型的具体列

select r.table_name, r.column_name, r.column_id
from all_tab_cols@remotedb r
where r.table_name = 'SOME_TABLE'

错误消失。

相关问题