Oracle存储过程报错ORA-02069: global_names parameter must be set to TRUE for this operation

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

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

GLOBAL_NAMES specifies whether a database link is required to have the same name as the database to which it connects.
If the value of GLOBAL_NAMES is false, then no check is performed. If you use or plan to use distributed processing, then Oracle recommends that you set this parameter to true to ensure the use of consistent naming conventions for databases and links in a networked environment.

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

[email protected]>col name for a30
[email protected]>select name,ISSES_MODIFIABLE,ISSYS_MODIFIABLE from v$parameter where name=‘global_names‘;

NAME			       ISSES_MODIFIABL ISSYS_MODIFIABLE
------------------------------ --------------- ---------------------------
global_names		       TRUE	       IMMEDIATE

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

创建一个dblink

[email protected]>create database link link_orcl connect to zx identified by "zx" using ‘orcl‘;

Database link created.

[email protected]>select * from [email protected]_orcl;

DUM
---
X

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

[email protected]>create or replace procedure pro_a as
  2  begin
  3  insert into [email protected]_orcl (c1) values(‘a‘);
  4  commit;
  5  end;
  6  /

Procedure created.

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

[email protected]>select * from [email protected]_orcl;

no rows selected

[email protected]>exec pro_a;

PL/SQL procedure successfully completed.

[email protected]>select c1 from [email protected]_orcl;

C1
---
a

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

[email protected]>create sequence seq_a;

Sequence created.

[email protected]>create or replace procedure pro_a as
  2  begin
  3  insert into [email protected]_orcl (c1,n1) values(‘a‘,seq_a.nextval);
  4  commit;
  5  end;
  6  /
  
Procedure created.

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

[email protected]>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参数,再次执行存储过程,又出现了新的错误:说两端的数据库名不一致。

[email protected]>alter session set global_names = true;

Session altered.

[email protected]>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

[email protected]>!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

时间: 2024-10-27 12:31:03

Oracle存储过程报错ORA-02069: global_names parameter must be set to TRUE for this operation的相关文章

ORA-02069: global_names parameter must be set to TRUE for this operation

原因:在对远程表增删改操作的时候,调用了本地函数.  比如:insert into trans_load_rate@DC values(rate_s(1)); trans_load_rate是DC库的表,rate_s函数是本地库的函数,执行上面这条sql的时候,就会报ora-02069 解决方法: 将函数也放在远程数据库.insert into trans_load_rate@DC values(rate_s@DC(1)); ORA-02069: global_names parameter m

expdp报错ora 39126

11.2.0.2,expdp报错: ORA-39126: Worker unexpected fatal error in KUPW$WORKER.GET_TABLE_DATA_OBJECTS []ORA-31642: the following SQL statement fails:BEGIN "SYS"."DBMS_CUBE_EXP".SCHEMA_CALLOUT(:1,0,1,'11.02.00.00.00'); END;ORA-06512: at &quo

oracle连接数据库报错:ORA-01034: ORACLE not available(Oracle 不存在),ORA-27101: shared memory realm does not exist

花一天半的时间解决客户端连接服务端的oracle数据库,无法连接问题.ORA-01034: ORACLE not available(Oracle 不存在),ORA-27101: shared memory realm does not   exist 分析:前几天还可以连接数据库,但是昨天开始,本地无缘无故的不能连接服务端数据库.网上很多人说造成这个问题的原因是异常关机 ,数据库没有在关机之前关闭.我公司人说在前几天确实有人重启过电脑,就当是这个原因吧,有时间一定要把真正原因找出来. 下面主要

oracle启动报错ORA-00845: MEMORY_TARGET not supported on this system解决办法

oracle启动报错ORA-00845: MEMORY_TARGET not supported on this system 原因可能:ORACLE MEMORY_TARGET参数设置超过了oracle服务器本身内存.或超过了现在服务器空闲内存(就是oracle启动时无法获取设置的内存) eg: oracle version:11gR2 OS version:RedHat 6.4企业版 服务器:虚拟机 分析步骤: 1.查看当前 MEMORY_TARGET参数的值为*.memory_target

【翻译自mos文章】使用Windows操作系统的Dell Pcserver,Oracle db报错:ORA-8103

翻译自mos文章:使用Windows操作系统的Dell Pcserver,Oracle db报错:ORA-8103 ORA-8103 using Windows platform and DELL servers (Doc ID 1921533.1) Applies to: Oracle Database - Personal Edition - Version 11.1.0.6 to 12.1.0.2 [Release 11.1 to 12.1] Oracle Database - Stand

PHP多次调用Mysql存储过程报错解决办法

PHP多次调用Mysql数据库的存储过程会出现问题,主要问题为存储过程中执行多次SQL语句不能一一释放导致的,网上找了一些解决办法,比如使用 multi_query 然后一个一个释放,但是发现根本不适合我们的项目,我们使用CI框架写的,更多的是使用CI的数据库处理方法.所以只能另辟蹊径. 一次偶然,把Mysql链接方式改成了mysqli,两种不同的PHP连接mysql的扩展,官方在高版本中推荐使用mysqli,结果却奇迹般好了,使用Mysql长连接也行,天意么? PHP多次调用Mysql存储过程

oracle之报错:ORA-00054: 资源正忙,要求指定 NOWAIT

SQL> conn scott/[email protected]_databaseConnected to Oracle Database 11g Enterprise Edition Release 11.1.0.6.0Connected as scott ...... SQL> drop table student2;drop table student2ORA-00054: 资源正忙, 但指定以 NOWAIT 方式获取资源, 或者超时失效========================

Oracle 安装报错 [INS-06101] IP address of localhost could not be determined 解决方法

出现这种错误是因为主机名和/etc/hosts 文件不一致,只需要把主机名和其IP 写入/etc/hosts 文件,就ok了. 注意名字不能有下划线 修改network 文件之外,再使用hostname 命令指定一下主机名,就不用重启OS了. 1.     修改/etc/sysconfig/network 文件 [[email protected]~]# cat /etc/sysconfig/network NETWORKING=yes NETWORKING_IPV6=no HOSTNAME=s

oracle 12c 报错 ora-03137 来自客户机的格式错误的TTC包被拒绝

昨天下午,实施报了一个oracle的报错ora-03137 说是数据库在11g时没有问题,升级到12c 时,就报错了. 本地调试,看到执行完sql后,报异常,如下: 把SqL在12c的数据库执行一下,没有问题. 就怀疑是asp.net 连接oralce12c时出了问题,就一顿查,但是发现现在用12c是不是太少了,网上相关的信息太少.只能自己上了, 由于我们连接 oralce12c 用的是odp.net. 首先想到的就是升级,数据库升级,我们也升级. 升级完成后,发现问题就这么愉快地解决了. 特意