Oracle && OceanBase 相关文档,希望互相学习,
共同进步
1.背景
今天在测试过程时,往远端表中插入数据时,报错如下:

由于该报错是在dblink的情形下出现,以下实验用2个机子:本地、远端。
2. 实验
2.1 准备表、函数、dblink
本地端:创建表 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博客
项目管理-计算题公式【复习】_项目管理进度计算题公式:乐观-CSDN博客
项目管理-相关知识(组织通用治理、组织通用管理、法律法规与标准规范)-CSDN博客
Oracle其他文档,希望互相学习,
共同进步
Oracle-找回误删的表数据(LogMiner 挖掘日志)_oracle日志挖掘恢复数据-CSDN博客
oracle 跟踪文件--审计日志_oracle审计日志-CSDN博客
ORA-12899报错,遇到数据表某字段长度奇怪现象:"Oracle字符型,长度50"但length查却没有50_varchar(50) oracle 超出截断-CSDN博客
