【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博客

相关推荐
李兆龙的博客4 小时前
问津集 #26:Lakebase——Postgres 的版本化页面存储、数据库分支与计算弹性
数据库
倔强的石头_6 小时前
聊聊金仓KFS:一款把数据同步软件做扎实的产品
数据库
闲云野鹤在人间6 小时前
MySQL|从理论、安装、备份到主从复制、MHA高可用详解
linux·运维·数据库·mysql·云计算
禾小西7 小时前
Redis:从两大维度和三大主线建立知识体系
数据库·redis·缓存
禾小西7 小时前
Redis 数据结构:快速的 Redis 有哪些慢操作?
数据结构·数据库·redis
数据库小学妹8 小时前
数据共享交换平台选型:交换方式对比与避坑指南
数据库·信创·数据同步·数据交换平台·政务数据共享·数据共享交换平台·数据库底座
loong_XL9 小时前
决策模型做内容安全检测:从踩坑到上线
数据库·安全·jev·决策模型
这个DBA有点耶9 小时前
数据库双轨并行实战:全量并行策略、增量延迟控制、双向回切与一致性校验
数据库·架构·dba
adinnet202610 小时前
保单、赔付与渠道问数:保险经营数据如何实现按需查询
大数据·数据库·人工智能
云贝贝贝10 小时前
PostgreSQL 分区表:从设计到运维,大表不再卡
运维·数据库·postgresql