Oracle两张数据表之间某个指定字段的单向和双向同步

2024-04-26 01:32

本文主要是介绍Oracle两张数据表之间某个指定字段的单向和双向同步,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1、单向同步:

大致介绍:ceshione这张表中的AA字段发生改变,ceshitwo这张表中如果存关联id则CC字段改成相同的值;而ceshitwo这张表中的CC字段发生改变,就算ceshione这张表中存在关联id,AA字段也不发生改变!

用途:主要用于主表与从表之间,以主表为准的情况!

实现代码如下:

1.ceshione表:

CREATE TABLE "MZD"."CESHIONE" (
"AA" VARCHAR2(255 BYTE) NULL ,
"BB" VARCHAR2(255 BYTE) NULL ,
"ID" NUMBER NULL 
)

2.ceshitwo表:

CREATE TABLE "MZD"."CESHITWO" (
"CC" VARCHAR2(255 BYTE) NULL ,
"DD" VARCHAR2(255 BYTE) NULL ,
"ID" NUMBER NULL 
)

3.单向同步脚本:

create or replace trigger tongbuafter insert or update or deleteon CESHIONEreferencing old as old_valuenew as new_valuefor each row
beginif inserting thenupdate CESHITWO set CC = :new_value.AAwhere id = :new_value.id;elsif updating thenupdate CESHITWO set CC = :new_value.AAwhere id = :new_value.id;end if;
end;

2、双向同步:

大致介绍:ceshione这张表中的AA字段发生改变,ceshitwo这张表中如果存关联id则CC字段改成相同的值;相同,ceshitwo这张表中的CC字段发生改变,ceshione这张表中如果存关联id则AA字段改成相同的值。

用途:主要用于两张级别相同的表中,还有一种可能是,设计数据库的时候没有设计好,出现相同的字段在不同的表中出现不同的值!!!

是不是会有脑洞大开的人-再写一个触发器,让ceshitwo中的CC发生改变的时候ceshione中的AA也发生改变

然后就变成这样:

这里写图片描述

这里写图片描述

正确的实现方案:

两张表上分别建立触发器进行同步,但是这样操作会有个问题,就会导致触发器循环触发。那么就需要在触发器进行触发前,进行一个判断,如果操作是由触发器引发的,那么就不做操作,反之,执行触发器定义的操作。想要实现这个,我开始考虑过在触发器a里面暂时使触发器b失效,但是发现alter trigger disable不合法;然后看到有人提到在表里面新增一个字段,用来做标识,但是这样需要修改表结构,虽然可以达到要求,但是总觉得不是很好,所以也没有使用;后来通过学习oracle对象,了解到了包的特性,所以决定采用包的方式来实现,利用包的变量来做标识。

参考网址:

https://www.thinksaas.cn/group/topic/468345/

代码实现:

1.ceshione表:

CREATE TABLE "MZD"."CESHIONE" (
"AA" VARCHAR2(255 BYTE) NULL ,
"BB" VARCHAR2(255 BYTE) NULL ,
"ID" NUMBER NULL 
)

2.ceshitwo表:

CREATE TABLE "MZD"."CESHITWO" (
"CC" VARCHAR2(255 BYTE) NULL ,
"DD" VARCHAR2(255 BYTE) NULL ,
"ID" NUMBER NULL 
)

3.双向同步脚本:

(1)这部分不需要改—作为一只菜鸟,没看的太明白0.0

--创建包头
create or replace package pk_check_active is --标识是否为触发器引发n number :=0;--获取是否为触发器触发标识,1为触发器触发function getactive return number;--设置状态procedure setactive(n1 in number);
end pk_check_active;create or replace package body pk_check_active asfunction getactive return number isbeginreturn n;end getactive;procedure setactive(n1 in number) isbeginn := n1;end setactive;
end pk_check_active;

(2)触发表CESHIONE:

create or replace trigger tr_cs_user after insert or update
on CESHIONE for each row
beginif pk_check_active.getactive() =1 thenpk_check_active.setactive(2);  return;elsepk_check_active.setactive(1);end if;
if inserting thenupdate CESHITWO  set CESHITWO.CC=:new.AA WHERE CESHITWO.ID=:NEW.ID;
elsif updating then update CESHITWO  set CESHITWO.CC=:new.AA WHERE CESHITWO.ID=:NEW.ID;
end if;pk_check_active.setactive(0);
end;

(3)触发表CESHITWO:

create or replace trigger tr_bs_user after insert or update
on CESHITWO for each row   
beginif pk_check_active.getactive() =1 thenpk_check_active.setactive(2); return;elsepk_check_active.setactive(1);end if;
if inserting thenupdate CESHIONE  set CESHIONE.AA=:new.CC where CESHIONE.ID=:NEW.ID;
elsif updating then update CESHIONE  set CESHIONE.AA=:new.CC where CESHIONE.ID=:NEW.ID;
end if;pk_check_active.setactive(0);
end;

这篇关于Oracle两张数据表之间某个指定字段的单向和双向同步的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/936347

相关文章

Javaee多线程之进程和线程之间的区别和联系(最新整理)

《Javaee多线程之进程和线程之间的区别和联系(最新整理)》进程是资源分配单位,线程是调度执行单位,共享资源更高效,创建线程五种方式:继承Thread、Runnable接口、匿名类、lambda,r... 目录进程和线程进程线程进程和线程的区别创建线程的五种写法继承Thread,重写run实现Runnab

C# 比较两个list 之间元素差异的常用方法

《C#比较两个list之间元素差异的常用方法》:本文主要介绍C#比较两个list之间元素差异,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. 使用Except方法2. 使用Except的逆操作3. 使用LINQ的Join,GroupJoin

深度解析Java项目中包和包之间的联系

《深度解析Java项目中包和包之间的联系》文章浏览阅读850次,点赞13次,收藏8次。本文详细介绍了Java分层架构中的几个关键包:DTO、Controller、Service和Mapper。_jav... 目录前言一、各大包1.DTO1.1、DTO的核心用途1.2. DTO与实体类(Entity)的区别1

Golang如何对cron进行二次封装实现指定时间执行定时任务

《Golang如何对cron进行二次封装实现指定时间执行定时任务》:本文主要介绍Golang如何对cron进行二次封装实现指定时间执行定时任务问题,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录背景cron库下载代码示例【1】结构体定义【2】定时任务开启【3】使用示例【4】控制台输出总结背景

springboot项目打jar制作成镜像并指定配置文件位置方式

《springboot项目打jar制作成镜像并指定配置文件位置方式》:本文主要介绍springboot项目打jar制作成镜像并指定配置文件位置方式,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录一、上传jar到服务器二、编写dockerfile三、新建对应配置文件所存放的数据卷目录四、将配置文

Navicat数据表的数据添加,删除及使用sql完成数据的添加过程

《Navicat数据表的数据添加,删除及使用sql完成数据的添加过程》:本文主要介绍Navicat数据表的数据添加,删除及使用sql完成数据的添加过程,具有很好的参考价值,希望对大家有所帮助,如有... 目录Navicat数据表数据添加,删除及使用sql完成数据添加选中操作的表则出现如下界面,查看左下角从左

python3如何找到字典的下标index、获取list中指定元素的位置索引

《python3如何找到字典的下标index、获取list中指定元素的位置索引》:本文主要介绍python3如何找到字典的下标index、获取list中指定元素的位置索引问题,具有很好的参考价值,... 目录enumerate()找到字典的下标 index获取list中指定元素的位置索引总结enumerat

Oracle 数据库数据操作如何精通 INSERT, UPDATE, DELETE

《Oracle数据库数据操作如何精通INSERT,UPDATE,DELETE》在Oracle数据库中,对表内数据进行增加、修改和删除操作是通过数据操作语言来完成的,下面给大家介绍Oracle数... 目录思维导图一、插入数据 (INSERT)1.1 插入单行数据,指定所有列的值语法:1.2 插入单行数据,指

Java实现删除文件中的指定内容

《Java实现删除文件中的指定内容》在日常开发中,经常需要对文本文件进行批量处理,其中,删除文件中指定内容是最常见的需求之一,下面我们就来看看如何使用java实现删除文件中的指定内容吧... 目录1. 项目背景详细介绍2. 项目需求详细介绍2.1 功能需求2.2 非功能需求3. 相关技术详细介绍3.1 Ja

Python pip下载包及所有依赖到指定文件夹的步骤说明

《Pythonpip下载包及所有依赖到指定文件夹的步骤说明》为了方便开发和部署,我们常常需要将Python项目所依赖的第三方包导出到本地文件夹中,:本文主要介绍Pythonpip下载包及所有依... 目录步骤说明命令格式示例参数说明离线安装方法注意事项总结要使用pip下载包及其所有依赖到指定文件夹,请按照以