【Oracle专栏】ORA-02069: global_names 参数

Oracle && OceanBase 相关文档,希望互相学习,共同进步

风123456789~-CSDN博客


1.背景

今天在测试过程时,往远端表中插入数据时,报错如下:

由于该报错是在dblink的情形下出现,以下实验用2个机子:本地、远端。

2. 实验

本地端:创建表 testa,

创建远端dblink: @affairs

远端: 创建表 testb

复制代码
本地  1)创建表: testa   2)创建dblink :AFFAIRS

create table testa
(kid varchar2(32),
info_id varchar2(32),
seqdate date default sysdate
)
;

insert into testa(kid,info_id)
select '1','info_1' from  dual union all
select '2','info_2' from  dual;
commit;

create public database link AFFAIRS
  connect to xxx identified by xxx
  using '192.168.3.12/orcl';

远端创建表:testb

create table testb
(kid varchar2(32),
info_id varchar2(32),
seqdate date default sysdate
);

2.2 测试正常插入

1)查看本地端数据、远端数据

复制代码
本地端查看:
select * from testa;
select * from testb@affairs;

2)将本地端数据插入远端

复制代码
--将本地端数据插入远端
insert into testb@affairs
select * from testa;
commit;

select * from testa;
select * from testb@affairs;

执行结果:插入成功

2.3 在本地端建立函数

复制代码
--本地端建立函数

CREATE OR REPLACE FUNCTION FUN_TEST(pEnum_name VARCHAR2) RETURN varchar2 IS
  vResult   varchar2(100);
  vCount    number;
BEGIN
   ---传入字符串最后出现的下划线及之后的截取,左补0
  vResult := '1'||LPAD(REGEXP_SUBSTR(pEnum_name, '\_[^_]*$'),10,'0');

  RETURN vResult;
END;

2.4 测试再次插入远端

1)查询函数

复制代码
select kid,FUN_TEST(info_id) from testa;

2)插入使用本地端函数 报错

复制代码
delete from testb@affairs;
commit;

insert into testb@affairs(kid,info_id)
select kid,FUN_TEST(info_id) from testa;
commit;

执行结果:删除成功,但是插入失败 问题复现

2.5 处理报错

1)在远端建立函数

复制代码
CREATE OR REPLACE FUNCTION FUN_TEST_b(pEnum_name VARCHAR2) RETURN varchar2 IS
  vResult   varchar2(100);
  vCount    number;
BEGIN
   ---传入字符串最后出现的下划线及之后的截取,左补0
  vResult := '1'||LPAD(REGEXP_SUBSTR(pEnum_name, '\_[^_]*$'),10,'0');

  RETURN vResult;
END;

2)插入使用远端函数 报错

复制代码
insert into testb@affairs(kid,info_id)
select kid,FUN_TEST_b(info_id) from testa;
commit;

执行结果:报错

3)插入使用本地dblink函数 报错

在远端建立本地库的dblink : out

复制代码
--远端建立本地 dblink
create public database link OUT
  connect to xxx identified by xxx
  using '192.168.3.11/orcl';

执行结果: 报错

4)插入使用远端dblink函数 ok

复制代码
insert into testb@affairs(kid,info_id)
select kid,FUN_TEST_b@Affairs(info_id) from testa;
commit;

select * from testa;
select * from testb@affairs;

执行结果: 不再报错,插入成功

此时,问题解决。

3.总结

ORACLE 报错:ORA-02069: 此操作的 global_names 参数必须设置为 TRUE。

通常发生在数据通过dblink传到另外一个的数据库中, insert into 远端表@dblink select column from 本地表 ,其中,column 中包含了序列或者函数,因为序列或者函数属于本地的,在insert执行时,是在dblink远端完成,此时需要从远端返回本地来引用序列或者函数进行处理。

此时,需要将global_names设为true,然后在远端创建一个指向本地的dblink,并且两个dblink名称要和对方数据库的global name一致。或者放在一端,本实验是放在远端 相同dblink。

实验验证:ok


项目管理--相关知识

项目管理-项目绩效域1/2-CSDN博客

项目管理-项目绩效域1/2_八大绩效域和十大管理有什么联系-CSDN博客

项目管理-项目绩效域2/2_绩效域 团不策划-CSDN博客

高项-案例分析万能答案(作业分享)-CSDN博客

项目管理-计算题公式【复习】_项目管理进度计算题公式:乐观-CSDN博客

项目管理-配置管理与变更-CSDN博客

项目管理-项目管理科学基础-CSDN博客

项目管理-高级项目管理-CSDN博客

项目管理-相关知识(组织通用治理、组织通用管理、法律法规与标准规范)-CSDN博客


Oracle其他文档,希望互相学习,共同进步

Oracle-找回误删的表数据(LogMiner 挖掘日志)_oracle日志挖掘恢复数据-CSDN博客

oracle 跟踪文件--审计日志_oracle审计日志-CSDN博客

ORA-12899报错,遇到数据表某字段长度奇怪现象:"Oracle字符型,长度50"但length查却没有50_varchar(50) oracle 超出截断-CSDN博客

EXP-00091: Exporting questionable statistics.解决方案-CSDN博客

Oracle 更换监听端口-CSDN博客

相关推荐
DBA大董1 小时前
TDengine3.0 DBA常用的运维命令和SQL2
运维·数据库·时序数据库·dba·tdengine
ManageEngineITSM2 小时前
什么是CMDB?配置管理数据库的定义、作用与建设方法一文讲清
大数据·数据库·人工智能·资产管理·变更管理
IvorySQL2 小时前
PostgreSQL 日报|PG19 外键快速路径隐患已修复(8 月 23 日)
数据库·postgresql
Elastic 中国社区官方博客2 小时前
OpenTelemetry Java 扩展:无需分叉 agent 即可自定义追踪
java·大数据·运维·开发语言·数据库·人工智能·elasticsearch
01传说3 小时前
redis开机自启脚本
数据库·redis·缓存
这个DBA有点耶3 小时前
数据库运维的“自动驾驶”:KES-Operator如何把DBA经验编码为软件
数据库·dba·自动化运维
动力 continue3 小时前
MySQL 基础篇 · SELECT 查询大
数据库·sql·mysql·select
程序员-Benothing3 小时前
MySQL 索引下推是什么?——深入理解 ICP 原理与实践
android·数据库·mysql
这个DBA有点耶4 小时前
MySQL主从延迟的“最后一公里”:如何把延迟压到极限
数据库·程序员·架构