设为首页 加入收藏

TOP

Oracle存储过程报错ORA-02069: global_names parameter must be set to TRUE for this operation
2017-03-30 14:17:31 】 浏览:285
Tags:Oracle 存储 过程 ORA-02069: global_names parameter must set TRUE for this operation

今天开发给发邮件过来说一个存储过程想通过dblink往目标库insert数据,但报错ORA-02069: global_names parameter must be set to TRUE for this operation,想让我根据错误提示在数据库上修改global_names参数修改为True。


先来看看官方文档是如何介绍这个参数的:


从下面的查询可以看出global_names参数可以在线进行修改的


zx@TEST>col name for a30
zx@TEST>select name,ISSES_MODIFIABLE,ISSYS_MODIFIABLE from v$parameter where name='global_names';
 
NAME                  ISSES_MODIFIABL ISSYS_MODIFIABLE
------------------------------ --------------- ---------------------------
global_names              TRUE        IMMEDIATE


看完了这个参数,再来看看开发的存储过程代码,其中insert语句中是用到了一个序列,所以导致了这个报错。先在测试数据库上创建了一个简单的存储过程来模拟现再这个问题


创建一个dblink


zx@TEST>create database link link_orcl connect to zx identified by "zx" using 'orcl';
 
Database link created.
 
zx@TEST>select * from dual@link_orcl;
 
DUM
---
X


先创建一个不带序列的远程insert的存储过程


zx@TEST>create or replace procedure pro_a as
  2  begin
  3  insert into t2@link_orcl (c1) values('a');
  4  commit;
  5  end;
  6  /
 
Procedure created.


执行这个存储过程,观察结果,数据可以正常插入


zx@TEST>select * from t2@link_orcl;
 
no rows selected
 
zx@TEST>exec pro_a;
 
PL/SQL procedure successfully completed.
 
zx@TEST>select c1 from t2@link_orcl;
 
C1
---
a


创建一个序列,并修改上面的存储过程


zx@TEST>create sequence seq_a;
 
Sequence created.
 
zx@TEST>create or replace procedure pro_a as
  2  begin
  3  insert into t2@link_orcl (c1,n1) values('a',seq_a.nextval);
  4  commit;
  5  end;
  6  /
 
Procedure created.


执行修改后的存储过程,重现上面的错误ORA-02069


zx@TEST>exec pro_a;
BEGIN pro_a; END;
 
*
ERROR at line 1:
ORA-02069: global_names parameter must be set to TRUE for this operation
ORA-06512: at "ZX.PRO_A", line 3
ORA-06512: at line 1


先在session层面修改global_names参数,再次执行存储过程,又出现了新的错误:说两端的数据库名不一致。


zx@TEST>alter session set global_names = true;
 
Session altered.
 
zx@TEST>exec pro_a;
BEGIN pro_a; END;
 
*
ERROR at line 1:
ORA-02085: database link LINK_ORCL connects to ORCL
ORA-06512: at "ZX.PRO_A", line 3
ORA-06512: at line 1
 
zx@TEST>!oerr ora 2085
02085, 00000, "database link %s connects to %s"
// *Cause: a database link connected to a database with a different name.
//  The connection is rejected.
// *Action: create a database link with the same name as the database it
//  connects to, or set global_names=false.


那现在问题来了,实际生产中源端和目标端的数据库名肯定是不一致的,所以修改这个参数并不能解决这个问题。


只能想其他的办法来绕过这个错误,这里给开发提了两个建议:


1、把存储过程部署到目标端来避免远程insert中调用sequence


2、在源端存储过程中引入临时表,先把数据插入临时表,再从临时表插入到远端表。


在MOS上搜到了一个相关文档(ORA-02069 DURING REMOTE INSERT OF A LOCAL SEQUENCE (文档 ID 1047673.6))跟我们的问题描述一致。


官方文档:http://docs.oracle.com/cd/E11882_01/server.112/e40402/initparams098.htm#REFRN10065


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇DBCA静默方式创建数据库实例 下一篇Redis3.2.8集群安装

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目