我搜索了几个解决方案。其中之一如下:
原因 需要远程映射语句,但无法实现,因为global_names应设置为TRUE才能实现
动作 如果可能,发出alter session set global_names = true
但我不明白为什么我需要设置global_names参数...为什么远程映射使用global_names参数?拜托,你能解释一下吗?
PS我知道设置global_names参数会产生全局命名规则,数据库链接名称必须与远程数据库名称相同。它还会将域名附加到数据库名称,如< DB_NAME>。< DB_DOMAIN>还有什么?
答案 0 :(得分:9)
这里讨论答案:http://dba010.wordpress.com/2011/01/05/oracle-errorsora/#ORA-02069
如果链接不起作用:
错误:强>
ORA-02069:此操作的global_names参数必须设置为TRUE
<强>原因:强>
您正尝试使用本地功能在远程数据库上进行DML操作。
这是“Oracle Bug”,它应该可以工作,但事实并非如此。
示例(为了更好地理解):
- 假设我们有两个数据库DB1和DB2
-On DB1我们有函数fun1
create function fun1 return number is
begin
return 1;
end;
-On DB1我们有一个引用DB2的数据库链接,为简单起见,称为DB2。
- 检查它是否有效。
select *
from dual@DB2
- 如果输出如下,则可以正常工作。
DUMMY
-----
X
-Let在DB2中创建测试表(连接到DB2数据库)
create table tesTable(
id number,
testColumn number
);
-Let进行一些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”
现在,当您已经知道在什么情况下发生此错误时,让我们编写解决方案。它有两个解决方案:
解决方案一:
- 在DB1上
alter session set global_names=true;
- 在DB2上
Create database link DB1 connect to <username> identified by <password>
using ‘DB1’;
现在它应该可行,但我应该提一下,创建数据库链接可能不是更可取的,
因为它不安全(你应该猜到为什么,因为如果你这样做,你将能够 通过数据库链接与某些用户连接到DB1 ...如果对您没有关系,则使用它.J)。
解决方案二:
答案 1 :(得分:2)
kupa的回答也提供了很好的解释和良好的解决方案,但是如果你不想或不能在那里关注一两个解决方案,我建议在这里查看解决方案2:http://dbtricks.com/?p=263。
这对我有用,创建一个变量并为其分配本地函数的值,然后使用引用远程表的sql语句中的变量。
希望这有助于帮助我的人!
答案 2 :(得分:0)
引用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)
答案 3 :(得分:0)
如果您在远程 SELECT 语句上使用本地函数,请尝试在您的 WHERE 子句中添加 “rownum <> 0”。这样就可以了