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

说明

   假设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_countFROM destination_tableWHERE column1 = src_rec.column1AND column2 = src_rec.column2AND 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,则表示它不存在。SELECTCOUNT(*) INTO vo_countFROMsource_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 DBLTpctfree 10initrans 1maxtrans 255storage(initial 64Knext 8Mminextents 1maxextents unlimited);
create table JIAN
(ids   VARCHAR2(32),names VARCHAR2(32),j     VARCHAR2(32),state VARCHAR2(32)
)
tablespace DBLTpctfree 10initrans 1maxtrans 255storage(initial 64Knext 8Mminextents 1maxextents 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 ASvo_count number;
BEGIN-- 从源表中选择状态为ACTIVE的记录  FOR src_rec IN (  SELECT id, name, state  FROM XIAO  WHERE state = '1'  ) LOOP  SELECT COUNT(*) INTO vo_countFROM JIANWHERE ids = src_rec.idAND names = src_rec.nameAND 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.hqwc.cn/news/4188.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ChatGPT微调系列一:微调 流程

文章目录 前言一、啥叫微调二、为啥要微调三、不是所有模型都可以微调的四、总述微调的基本流程,以及涉及的主要函数,参数1. 安装2. 准备训练数据3. openai.api_key os.getenv() 进行一个说明4. 通过API 调用模型 常用函数5. 微调模型 常用函数6. OpenA…

什么是kafka,如何学习kafka,整合SpringBoot

目录 一、什么是Kafka,如何学习 二、如何整合SpringBoot 三、Kafka的优势 一、什么是Kafka,如何学习 Kafka是一种分布式的消息队列系统,它可以用于处理大量实时数据流。学习Kafka需要掌握如何安装、配置和运行Kafka集群,以及如…

SpringBoot3【② Web开发】

SpringBoot3-Web开发 SpringBoot的Web开发能力,由SpringMVC提供。 0. WebMvcAutoConfiguration原理 1. 生效条件 AutoConfiguration(after { DispatcherServletAutoConfiguration.class, TaskExecutionAutoConfiguration.class,ValidationAutoConfiguration.clas…

Gitlab保护分支与合并请求

目录 引言 1、成员角色指定 1、保护分支设置 2、合并请求 引言 熟悉了Git工作流之后,有几个重要的分支,如Master(改名为Main)、Develop、Release分支等,是禁止开发成员随意合并和提交的,在此分支上的提交和推送权限仅限项目负责…

使用nodejs操作postgresql

环境准备 1 navicat premium 2 postgresql 14 装完上述软件后,远程连接上之后如下: 自己建立一个用户表users,然后随机生成一些数据即可 步骤 这里我将项目放到了gticode里,可以下载下来使用 https://gitcode.net/wangbiao9292/nodejs-p…

分布式配置 Config

一、Config 简介 1、Config的组成 Server:分布式配置中心,是独立运行的微服务应用,连接配置仓库(Git、SVN、本地化文件等)并为客户端提供获取配置信息、加密信息和解密信息的访问接口。Client:各个微服务,通过 Serve…

【论文阅读】Level-S2fM:神经隐式表面水平集上的SfM

【论文阅读】Level-S2fM:神经隐式表面水平集上的SfM Abstract1. Introduction2. Related Works2.1. Structure from Motion2.2. Neural Implicit Representation for 3D Scene 3. Preliminaries3.1. Neural Implicit Surface Rendering3.2. Ray Sampling and Sphere…

9 HAL库驱动框架简述(STM32HAL库)

目录 HAL库驱动框架简述 HAL库外设设计思想 HAL库和Cube MX相结合 一、对外设的封装——句柄结构体 二、外设初始化 初始化结构体 初始化的逻辑 三、外设使用逻辑 通用接口函数 初始化函数 I/O操作函数 控制函数 状态参数 扩展接口函数 总结 补充:H…

新手快速搭建springboot项目

一、创建项目 1.1、创建项目 1.2、配置编码 1.3、取消无用提示 1.4、取消无用参数提示 二、添加POM父依赖 <!-- 两种方式添加父依赖或者import方式 --> <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-p…

linux-2.6.22.6内核i2c驱动框架源码分析

i2c是常见的通信协议&#xff0c;协议比较简单&#xff0c;只有数据和时钟两条线&#xff08;SDA和SCL&#xff09;&#xff0c;i2c的通信分为主机和从机&#xff0c;主机一般占主导地位&#xff0c;从机可以有多个。 i2c通信的数据格式为(SDA上的数据)&#xff1a;开始的7位里…

【单片机】STM32单片机的矩阵键盘驱动,标准库,无阻塞方式的矩阵键盘读取

原理图&#xff1a; 从左到右、从上到下&#xff0c;按键是1到16&#xff0c;没有按键返回0&#xff1a; key.c #include "key.h"/* 按键初始化函数 */ void KEY_Init(void) {GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, …

Eclipse中的实用工具之JUnit

&#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 接下来看看由辉辉所写的关于JUnit的相关操作吧 目录 &#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 是什么 为什么要用 怎么用 是什么 JUnit…