Oracle 实现A表B表字段/表名不同,定时任务+存储过程,定期执行增删改查

news2024/9/24 5:30:18

说明

   假设Oracle A表B表 ,表字段不同,表名也不同, 通过存储过程 + 定时任务(Jobs), 定期去执行业务逻辑的增删改查 。

1、定时同步

  • 创建一个存储过程,用于比较两张表中的数据,并根据状态决定需要同步的数据。

CREATE OR REPLACE PROCEDURE sync_data AS  
BEGIN  
  FOR src_rec IN (SELECT column1, column2, column3 FROM source_table) LOOP  
    -- 查询目标表中状态为同步的记录  
    FOR dest_rec IN (SELECT column1, column2, column3 FROM destination_table WHERE status = 'SYNC') LOOP  
      -- 如果源表和目标表中的记录状态相同,则不需要同步  
      IF src_rec.column1 = dest_rec.column1 AND src_rec.column2 = dest_rec.column2 AND src_rec.column3 = dest_rec.column3 THEN  
        NULL;  
      -- 否则,更新目标表中的记录  
      ELSE  
        UPDATE destination_table SET column1 = src_rec.column1, column2 = src_rec.column2, column3 = src_rec.column3 WHERE column1 = dest_rec.column1 AND column2 = dest_rec.column2 AND column3 = dest_rec.column3;  
      END IF;  
    END LOOP;  
  END LOOP;  
END;
  • 创建一个定时任务,用于定期执行存储过程。

     使用Oracle提供的 "DBMS_SCHEDULER" 包来创建定时任务,可以设置定时任务的执行时间、执行间隔和执行方式等。例如,下面的代码创建了一个名为 "SYNC_DATA_TASK" 的定时任务,每隔5分钟执行一次 "SYNC_DATA" 存储过程。

BEGIN  
  DBMS_SCHEDULER.CREATE_JOB (  
    job_name => 'SYNC_DATA_TASK',  
    job_type => 'PLSQL_BLOCK',  
    job_action => 'BEGIN sync_data; END;',  
    start_date =>SYSDATE,  
    repeat_interval => 'FREQ=MINUTELY;INTERVAL=5;',  
    end_date => NULL,  
    enabled => TRUE);  
END;

        具体实现方式需要根据实际需求进行调整。同时也可以根据实际需求,添加其他定时任务参数和条件。

2、定时添加

1、首先,需要确定要在源表中提取哪些数据,以及如何根据状态筛选数据。例如,如果您希望提取状态为 "STATE"的所有记录,则可以在查询中添加 " WHERE status = 'STATE' "条件。

2、然后,需要创建一个定时任务,以便在指定的时间间隔内执行数据提取和插入操作。还是使用Oracle提供的 "DBMS_SCHEDULER" 包来创建定时任务。例如,您可以创建一个名为 "SYNC_DATA_TASK" 的定时任务,并设置其执行时间间隔为每天一次。

3、在定时任务中,可以使用PL/SQL编写一个存储过程,该存储过程将从源表中选择所需的数据,并将其插入到目标表中。

CREATE OR REPLACE PROCEDURE sync_data AS  
BEGIN  
  -- 从源表中选择状态为ACTIVE的记录  
  FOR src_rec IN (  
    SELECT column1, column2, column3  
    FROM source_table  
    WHERE status = 'ACTIVE'  
  ) LOOP  
    -- 如果目标表中不存在相同的记录,则将源表中的记录插入目标表  
    IF NOT EXISTS (  
      SELECT *  
      FROM destination_table  
      WHERE column1 = src_rec.column1  
        AND column2 = src_rec.column2  
        AND column3 = src_rec.column3  
    ) THEN  
      INSERT INTO destination_table (column1, column2, column3)  
      VALUES (src_rec.column1, src_rec.column2, src_rec.column3);  
    END IF;  
  END LOOP;  
END;

从源表中选择了状态为 "ACTIVE" 的记录。然后,检查目标表中是否已经存在与源表相同的记录,如果不存在,则将源表中的记录插入目标表。

注意: 以上存储过程会出现一个问题?  什么问题? 

 错误:PLS-00204: 函数或伪列 'EXISTS' 只能在 SQL 语句中使用 IF NOT EXISTS

思路:

     使用 COUNT 函数:如果 IF NOT EXISTS 语句是用于检查表中是否存在记录,可以使用 COUNT 函数来检查记录的数量。如果记录数量为 0,则表示它不存在。

SELECT COUNT(*) FROM 表名 WHERE 条件;  
IF COUNT = 0 THEN  
  -- 执行某些操作  
END IF;

 解决:

CREATE OR REPLACE PROCEDURE sync_data AS  
 vo_count number; --声明变量
BEGIN  
  -- 从源表中选择状态为ACTIVE的记录  
  FOR src_rec IN (  
    SELECT column1, column2, column3  
    FROM source_table  
    WHERE status = 'ACTIVE'  
  ) LOOP  

    -- 不能直接用IF NOT EXISTS,那就抽出来
   SELECT  COUNT(*) INTO vo_count
     FROM destination_table
    WHERE column1 = src_rec.column1
      AND column2 = src_rec.column2
      AND column3 = src_rec.column3

  
    -- 如果目标表中不存在相同的记录,则将源表中的记录插入目标表  
    IF vo_count = 0 THEN  
      INSERT INTO destination_table (column1, column2, column3)  
      VALUES (src_rec.column1, src_rec.column2, src_rec.column3);  
    END IF;  
  END LOOP;  
END;

4、 最后,需要使用 DBMS_SCHEDULER 包将存储过程调度为定时任务。

BEGIN  
  DBMS_SCHEDULER.CREATE_JOB (  
    job_name => 'SYNC_DATA_TASK',  
    job_type => 'PLSQL_BLOCK',  
    job_action => 'BEGIN sync_data; END;',  
    start_date => SYSDATE,  
    repeat_interval => 'FREQ=DAILY;INTERVAL=1;',  
    end_date => NULL,  
    enabled => TRUE);  
END;
  • DBMS_SCHEDULER.CREATE_JOB:这是一个Oracle数据库提供的存储过程,用于创建定时器任务。
  • job_name:指定定时器任务的名称,可以自定义。
  • job_type:指定任务类型,这里选择的是"PLSQL_BLOCK",表示要执行的的任务是一个PL/SQL存储过程。
  • job_action:指定要执行的任务操作,这里指定为存储过程名。
  • start_date:指定任务的开始日期和时间,这里使用SYSDATE表示当前时间。
  • repeat_interval:指定任务的重复执行间隔,这里使用'FREQ=DAILY;INTERVAL=1;'表示每天执行一次。
  • end_date:指定任务的结束日期和时间,这里设置为NULL表示任务将一直执行直到被取消。
  • enabled:指定任务是否启用,这里设置为TRUE表示启用任务。

3、定时删除

  • 创建一个存储过程,用于比较两张表中的数据,并根据状态决定需要删除的数据。
CREATE OR REPLACE PROCEDURE delete_data AS  
vo_count number; --声明变量
BEGIN  
  -- 查询需要删除的记录  
  FOR dest_rec IN (  
    SELECT column1, column2, column3  
    FROM destination_table  
    WHERE status != 'DELETED'  
  ) LOOP  
	-- 使用 COUNT 函数来检查记录的数量。如果记录数量为 0,则表示它不存在。
		SELECT
			COUNT(*) INTO vo_count
		FROM
			source_table 
		WHERE column1 = dest_rec.column1 
		  AND column2 = dest_rec.column2 
		  AND column3 = dest_rec.column3
	
    -- 检查源表中是否存在相同的记录,如果不存在,则删除目标表中的记录  
    IF vo_count = 0 THEN  
      DELETE FROM destination_table  
      WHERE column1 = dest_rec.column1  
        AND column2 = dest_rec.column2  
        AND column3 = dest_rec.column3;  
    END IF;  
  END LOOP;  
END;

       首先查询状态不为 "DELETED" 的记录,并使用循环逐行处理这些记录。然后,检查源表中是否存在与目标表相同的记录,如果不存在,则删除目标表中的记录。
 

  •  创建一个定时任务,用于定期执行存储过程。
BEGIN  
  DBMS_SCHEDULER.CREATE_JOB (  
    job_name => 'DELETE_DATA_TASK',  
    job_type => 'PLSQL_BLOCK',  
    job_action => 'BEGIN delete_data; END;',  
    start_date => SYSDATE,  
    repeat_interval => 'FREQ=DAILY;INTERVAL=1;',  
    end_date => NULL,  
    enabled => TRUE);  
END;

       创建了一个为 "DELETE_DATA_TASK" 的定时任务,并将其调度为每天执行一次。然后,我们指定要执行的存储过程为 "delete_data" ,并设置其执行时间为当前时间。还设置了重复间隔为1天,表示该任务将每隔一天执行一次,直到任务被取消。

4、演示

1、建表语句

create table XIAO
(
  id    VARCHAR2(32),
  name  VARCHAR2(32),
  x     VARCHAR2(32),
  time  DATE,
  state VARCHAR2(32)
)
tablespace DBLT
  pctfree 10
  initrans 1
  maxtrans 255
  storage
  (
    initial 64K
    next 8M
    minextents 1
    maxextents unlimited
  );
create table JIAN
(
  ids   VARCHAR2(32),
  names VARCHAR2(32),
  j     VARCHAR2(32),
  state VARCHAR2(32)
)
tablespace DBLT
  pctfree 10
  initrans 1
  maxtrans 255
  storage
  (
    initial 64K
    next 8M
    minextents 1
    maxextents unlimited
  );

2、添加数据

INSERT INTO XIAO ( id, NAME, state )
VALUES
	( '10001', '赵', '1' ); 
INSERT INTO XIAO ( id, NAME, state )
VALUES
	( '10002', '钱', '1' );
INSERT INTO XIAO ( id, NAME, state )
VALUES
	( '10003', '孙', '1' );
INSERT INTO XIAO ( id, NAME, state )
VALUES
	( '10004', '李', '1' );
INSERT INTO XIAO ( id, NAME, state )
VALUES
	( '10005', '周', '1' );
INSERT INTO XIAO ( id, NAME, state )
VALUES
	( '10006', '吴', '1' );
INSERT INTO XIAO ( id, NAME, state )
VALUES
	( '10007', '郑', '1' );
INSERT INTO XIAO ( id, NAME, state )
VALUES
	( '10008', '王', '1' );

3、创建存储过程

CREATE OR REPLACE PROCEDURE sync_data_xj AS

vo_count number;
BEGIN

 -- 从源表中选择状态为ACTIVE的记录  
  FOR src_rec IN (  
    SELECT id, name, state  
    FROM XIAO  
    WHERE state = '1'  
  ) LOOP  
  

   SELECT COUNT(*) INTO vo_count
    FROM JIAN
   WHERE ids = src_rec.id
     AND names = src_rec.name
     AND state = src_rec.state;
  
    -- 如果目标表中不存在相同的记录,则将源表中的记录插入目标表  
    IF vo_count = 0  THEN  
      INSERT INTO JIAN (ids, names, state)  
      VALUES (src_rec.id, src_rec.name, src_rec.state);  
    END IF;  
  END LOOP;
END;

4、创建定时器

BEGIN  
  DBMS_SCHEDULER.CREATE_JOB (  
    job_name => 'SYNC_DATA_TASK',  
    job_type => 'PLSQL_BLOCK',  
    job_action => 'BEGIN sync_data_xj; END;',  
    start_date =>SYSDATE,  
    repeat_interval => 'FREQ=MINUTELY;INTERVAL=1;',  
    end_date => NULL,  
    enabled => TRUE);  
END;

 为了演示创建一个名为 SYNC_DATA_TASK 的定时任务,每隔1分钟执行一次 SYNC_DATA_XJ 存储过程。

5、查看执行结果

 6、查看定时器

  • 查找定时器

  •  编辑定时器

 

  •  可根据业务去修改参数

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/696878.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

java开发必备技能之Spring常用注解(重点)

参考了尚硅谷注解版,注解版后面的源码没看,雷神讲的太散了 Spring注解 AnnotationConfigApplicationContext 组件添加相关注解 1、ConfigurationBean (基础) 1-1 XML文件方式实现组件添加 public class Person { private String name;private Integ…

五个漂亮的 Arch Linux 发行版

导读本文将介绍几个漂亮的 Arch Linux 发行版,这些发行版将设计的优雅之美与 Arch Linux 强大的底层框架相结合。 Arch Linux 提供滚动更新模型、强大的 pacman 软件包管理器,以及通过其软件仓库提供的成千上万的应用程序。它非常受欢迎,因为…

多线程之wait()和notify()详解

1.每个Java对象都有一个监视器(monitor),它是用来控制对该对象的访问的。一个线程要想进入某个对象的监视器区域,必须先获得该对象的锁。然后可以通过wait方法来释放该对象的锁并进入等待状态,直到其他线程调用notify或…

python读取.ann文件编码格式

encoding‘latin1.(gbk和utf-8均报错) 【还是chatpgt告诉我的呢】

oracle查看当前实例与切换实例

查看实例 select name from v$database;切换实例 sqlplus /ORCL as sysdba

【前端工程化】深入浅出vite(二)--vue3全家桶+ts构建后管系统

安装基础包 npm create vitelatest # 这里选择的是VueTypescript的组合 cd vue-admin npm install# 先安装基础包 npm install vue-router4 npm i pinia npm i axios npm install sass --save-dev npm install element-plus --save npm install element-plus/icons-vue npm in…

全志V3S嵌入式驱动开发(spi-nor image制作)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 其实,我们之前就讨论过怎么把image烧入到v3s的spi-nor当中去。当时使用的方法是借助于sunxi-fel工具,烧入的image也比计较小…

2. 计算点到平面的投影

参考 https://www.cnblogs.com/nobodyzhou/p/6145030.html 所以用各种平面提取算法后,得到的平面方程, 注意此处的平面方程abcd已经是归一化了。 a x b y c z d 0 ax by cz d 0 axbyczd0 此时的原点到该平面点的投影点为 C P ( − a d , − b d , − c …

渗透测试内网基础知识

点赞后看,养成习惯 喜欢的话 可以点个关注哟 你们的点赞支持对博主们来说很重要哦 !!! 为方便您的阅读,可点击下方蓝色字体,进行跳转↓↓↓ 01 内网概述02 工作组03 域04 活动目录05 域控制器和活动目录的…

【C/C++】使用类和对象 设计点和圆的关系案例

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; &#x1f525;c系列专栏&#xff1a;C/C零基础到精通 &#x1f525; 给大…

误删除boot目录 修复办法

误删除boot目录 修复办法 本次演示系统为kylin-v10-sp3-20230324&#xff0c;kernel&#xff1a;4.19.90-52.22.v2207.ky10.x86_64 文章目录 误删除boot目录 修复办法1.报错现象2.正常机器boot目录结构3.误删除boot目录4.故障修复挂载光盘&#xff0c;进入救援模式 5.非正常情况…

mysql8.0.26忘记密码后重置(centos8)

1、查看配置文件地址 mysql --help|grep my.cnf 2、编辑/etc/my.cnf配置文件 vim /etc/my.cnf增加跳过密码配置 [mysqld] skip-grant-tables 3、重启mysql service mysqld restart4、修改密码 use mysql; update user set authentication_string where userroot; FLUSH pr…

NoSQL之Redis配置与优化(初级)理论较多

目录 一、关系数据库与非关系型数据库 1、 关系型数据库 2、 非关系型数据库 二、关系型数据库和非关系型数据库区别 1、 数据存储方式不同 2、 扩展方式不同 3、 对事务性的支持不同 三、非关系型数据库产生背景 1、可用于应对Web2.0纯动态网站类型的三高问题&#xf…

大数据Doris(五十一):Export语法和结果

文章目录 Export语法和结果 一、语法 二、结果 Export语法和结果 一、语法 Export 需要借助 Broker 进程访问远端存储&#xff0c;不同的 Broker 需要提供不同的参数&#xff0c;这里以导出到HDFS为例介绍Export 写法&#xff0c;也可以通过"help export "命令查…

Azure CLI - Premium SSD V1磁盘迁移至Premium SSD V2

目录 1.从服务器卸载Premium SSD V1 磁盘 2.创建Premium SSD V1磁盘snapshot 3.创建Premium SSD V2磁盘 4.挂载Premium SSD V2磁盘到服务器 已经在生产使用的Premium SSD V1磁盘&#xff0c;通过制作快照后&#xff0c;购买Premium SSD V2磁盘。 1.从服务器卸载Premium SSD…

Intellij IDEA detected unusually high memory use

一、IDEA如图 二、解决 2.1 修改IDEA的内存堆 运行IntelliJ IDEA的Java虚拟机&#xff08;JVM&#xff09;分配一些预定义的内存量。默认值取决于平台。如果您遇到速度减慢&#xff0c;可能需要增加内存堆。 为运行IDE分配的堆大小与编译应用程序的堆大小不同。如果要为编译代…

服务行业的企业所得税高,这是为何,该如何解决?

服务行业的企业所得税高&#xff0c;这是为何&#xff0c;该如何解决&#xff1f; 《税筹顾问》专注于园区招商、企业税务筹划&#xff0c;合理合规助力企业节税&#xff01; 服务行业的发展历程&#xff0c;源远流长。它是为了满足我们生活中的需要应运而生&#xff0c;大家眼…

广州华锐互动:建筑施工VR虚拟仿真实训系统

VR技术在施工现场安全教育中有着广泛的应用。随着VR技术的不断发展&#xff0c;越来越多的企业开始将其应用于施工现场安全教育中&#xff0c;以提高工人的安全意识和应对能力。 传统的施工现场安全教育往往需要大量的时间和人力物力投入&#xff0c;而且效果并不理想.而VR技术…

生物数据下载

目录 1. 获取数据下载的地址 2. 生物数据常用的下载站点 1、核酸数据库 2、非编码RNA数据库 &#xff08;1&#xff09;.非编码小RNA数据库 &#xff08;2&#xff09;.长非编码RNA数据库&#xff1a; &#xff08;3&#xff09;.非编码RNA家族数据库 &#xff08;4&a…

C++ day41

1、总结类和结构体的区别 结构体中是变量和函数&#xff1b;类中是成员属性(成员变量)、成员方法(成员函数)/行为类的成员变量和成员函数的默认访问权限是私有的&#xff1b;结构体的成员变量和成员函数的默认访问权限是公开的类创建一个对象后&#xff0c;对该对象的任何修改…