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

相关文章

Mysql删除几亿条数据表中的部分数据的方法实现

《Mysql删除几亿条数据表中的部分数据的方法实现》在MySQL中删除一个大表中的数据时,需要特别注意操作的性能和对系统的影响,本文主要介绍了Mysql删除几亿条数据表中的部分数据的方法实现,具有一定... 目录1、需求2、方案1. 使用 DELETE 语句分批删除2. 使用 INPLACE ALTER T

Python 中的异步与同步深度解析(实践记录)

《Python中的异步与同步深度解析(实践记录)》在Python编程世界里,异步和同步的概念是理解程序执行流程和性能优化的关键,这篇文章将带你深入了解它们的差异,以及阻塞和非阻塞的特性,同时通过实际... 目录python中的异步与同步:深度解析与实践异步与同步的定义异步同步阻塞与非阻塞的概念阻塞非阻塞同步

MySQL新增字段后Java实体未更新的潜在问题与解决方案

《MySQL新增字段后Java实体未更新的潜在问题与解决方案》在Java+MySQL的开发中,我们通常使用ORM框架来映射数据库表与Java对象,但有时候,数据库表结构变更(如新增字段)后,开发人员可... 目录引言1. 问题背景:数据库与 Java 实体不同步1.1 常见场景1.2 示例代码2. 不同操作

使用Python实现获取网页指定内容

《使用Python实现获取网页指定内容》在当今互联网时代,网页数据抓取是一项非常重要的技能,本文将带你从零开始学习如何使用Python获取网页中的指定内容,希望对大家有所帮助... 目录引言1. 网页抓取的基本概念2. python中的网页抓取库3. 安装必要的库4. 发送HTTP请求并获取网页内容5. 解

Vue中组件之间传值的六种方式(完整版)

《Vue中组件之间传值的六种方式(完整版)》组件是vue.js最强大的功能之一,而组件实例的作用域是相互独立的,这就意味着不同组件之间的数据无法相互引用,针对不同的使用场景,如何选择行之有效的通信方式... 目录前言方法一、props/$emit1.父组件向子组件传值2.子组件向父组件传值(通过事件形式)方

Oracle存储过程里操作BLOB的字节数据的办法

《Oracle存储过程里操作BLOB的字节数据的办法》该篇文章介绍了如何在Oracle存储过程中操作BLOB的字节数据,作者研究了如何获取BLOB的字节长度、如何使用DBMS_LOB包进行BLOB操作... 目录一、缘由二、办法2.1 基本操作2.2 DBMS_LOB包2.3 字节级操作与RAW数据类型2.

查看Oracle数据库中UNDO表空间的使用情况(最新推荐)

《查看Oracle数据库中UNDO表空间的使用情况(最新推荐)》Oracle数据库中查看UNDO表空间使用情况的4种方法:DBA_TABLESPACES和DBA_DATA_FILES提供基本信息,V$... 目录1. 通过 DBjavascriptA_TABLESPACES 和 DBA_DATA_FILES

Python实现合并与拆分多个PDF文档中的指定页

《Python实现合并与拆分多个PDF文档中的指定页》这篇文章主要为大家详细介绍了如何使用Python实现将多个PDF文档中的指定页合并生成新的PDF以及拆分PDF,感兴趣的小伙伴可以参考一下... 安装所需要的库pip install PyPDF2 -i https://pypi.tuna.tsingh

Python实现PDF与多种图片格式之间互转(PNG, JPG, BMP, EMF, SVG)

《Python实现PDF与多种图片格式之间互转(PNG,JPG,BMP,EMF,SVG)》PDF和图片是我们日常生活和工作中常用的文件格式,有时候,我们可能需要将PDF和图片进行格式互转来满足... 目录一、介绍二、安装python库三、Python实现多种图片格式转PDF1、单张图片转换为PDF2、多张图

Flask解决指定端口无法生效问题

《Flask解决指定端口无法生效问题》文章讲述了在使用PyCharm开发Flask应用时,启动地址与手动指定的IP端口不一致的问题,通过修改PyCharm的运行配置,将Flask项目的运行模式从Fla... 目录android问题重现解决方案问题重现手动指定的IP端口是app.run(host='0.0.