Oracle通过函数调用dblink同步表数据方案(全量/增量)

创建对应的包,以方便触发调用

/*包声明*/
CREATE OR REPLACE PACKAGE yjb.pkg_scene_job AS 
	/*创建同步任务*/
	FUNCTION F_SYNC_DRUG_STOCK RETURN NUMBER;
	/*同步*/
	PROCEDURE PRC_SYNC_DRUG_STOCK(RUNJOB  VARCHAR2) ;	
END pkg_scene_job;
/*包体*/
CREATE OR REPLACE PACKAGE body yjb.pkg_scene_job AS 
	/*创建任务*/
	FUNCTION F_SYNC_DRUG_STOCK RETURN NUMBER AS
		/*同步*/
		pragma autonomous_transaction;
	    sync_stock_sql varchar2(3000);
	    V_JOB_NAME varchar2(50):='SYNC_DRUG_STOCK_JOB';--JOB任务名称
	    SYNC_DRUG_STOCK_JOBCNT NUMBER:=0;
	    JOBEXETIME NUMBER:=0 ;--任务执行时间(分钟)
	    plsqlblk varchar2(800);
	BEGIN
		BEGIN
			SELECT count(1) INTO SYNC_DRUG_STOCK_JOBCNT FROM user_scheduler_jobs a WHERE a.JOB_NAME=V_JOB_NAME;
			IF SYNC_DRUG_STOCK_JOBCNT =1 THEN
				SELECT to_number((SYSDATE - a.START_DATE)*24*60)  INTO JOBEXETIME FROM user_scheduler_jobs a WHERE a.JOB_NAME=V_JOB_NAME;
				/*如果任务执行时间超过20分钟 则将任务删除*/
				IF JOBEXETIME >=20 THEN
		--			sys.dbms_scheduler.drop_job();
					-- 特别说明: force => false  
					-- false:job 执行完成后再删除  
					-- true :立即删除(job 未必执行完成哦)
					sys.dbms_scheduler.drop_job(
					  job_name => V_JOB_NAME,
					  force    => true);
			    ELSE 
			    	RETURN 1;
				END IF;
			END IF;
		    plsqlblk:='begin pkg_scene_job.PRC_SYNC_DRUG_STOCK(' ||chr(39)|| V_JOB_NAME ||chr(39)|| '); end;';
		    sys.dbms_scheduler.create_job(job_name => V_JOB_NAME,
		                                job_type => 'PLSQL_Block',
		                                job_action => plsqlblk,
		                                number_of_arguments =>0,
		                                start_date => SYSDATE,
		                                repeat_interval => NULL,
		                                end_date => NULL,
		                                job_class => 'DEFAULT_JOB_CLASS',
		                                enabled => TRUE,
		                                auto_drop => TRUE,
		                                comments => '同步数据',
		                                credential_name => null,
		                                destination_name => NULL);
		END;
		COMMIT;
	    RETURN 1;
	EXCEPTION 
	 	WHEN OTHERS then
		RETURN 0;    
	END F_SYNC_DRUG_STOCK;

	/*同步表数据(全量/增量)数据量上万时 建议将数据量拆分进行*/
	PROCEDURE PRC_SYNC_DRUG_STOCK(RUNJOB  VARCHAR2) 
	    IS
	    pragma autonomous_transaction;
		BEGIN
	--		  SYS.DBMS_LOCK.SLEEP(10);
	--		  EXECUTE IMMEDIATE INBLOCK;
			  merge into table1 v
		      using (SELECT
							i1.HOSPITAL_AREA,
							i1.DRUG_CODE,
							i1.AMOUNT_PER_PACKAGE,
							i1.PACKAGE_UNITS_CODE,
							i1.FIRM_ID,
							i1.STORAGE,
							i1.ITEM_PRICE,
							i1.QUANTITY,
							i1.AVAILABLE_STORAGE,
							i1.SUPPLY_INDICATOR,
							i1.DRUG_SPEC
						FROM
							table2@interface i1) d
				on (v.HOSPITAL_AREA = d.HOSPITAL_AREA AND v.DRUG_CODE=d.DRUG_CODE AND v.STORAGE=d.STORAGE)   -- 这里通过主键判断,数据是否存在
				 when matched then
				       update set 
				            v.QUANTITY = d.QUANTITY,
				            v.AVAILABLE_STORAGE = d.AVAILABLE_STORAGE
				when not matched then
				        insert (
				            v.HOSPITAL_AREA,
							v.DRUG_CODE,
							v.AMOUNT_PER_PACKAGE,
							v.PACKAGE_UNITS_CODE,
							v.FIRM_ID,
							v.STORAGE,
							v.ITEM_PRICE,
							v.QUANTITY,
							v.AVAILABLE_STORAGE,
							v.SUPPLY_INDICATOR,
							v.DRUG_SPEC)
				        values (
				            d.HOSPITAL_AREA,
							d.DRUG_CODE,
							d.AMOUNT_PER_PACKAGE,
							d.PACKAGE_UNITS_CODE,
							d.FIRM_ID,
							d.STORAGE,
							d.ITEM_PRICE,
							d.QUANTITY,
							d.AVAILABLE_STORAGE,
							d.SUPPLY_INDICATOR,
							d.DRUG_SPEC
				        ) ;
	--		  DBMS_OUTPUT.PUT_LINE('===========执行' || INBLOCK || '成功=============');
			  SYS.DBMS_SCHEDULER.SET_ATTRIBUTE(NAME      => RUNJOB,
			                                   ATTRIBUTE => 'auto_drop',
			                                   VALUE     => TRUE);
		  	--SYS.DBMS_SCHEDULER.DISABLE(NAME => RUNJOB);
	    COMMIT;
	    EXECUTE immediate 'ALTER SESSION CLOSE DATABASE link hisinterface' ;
		END PRC_SYNC_DRUG_STOCK;
END pkg_scene_job;

触发同步任务:

SELECT yjb.pkg_scene_job.F_SYNC_DRUG_STOCK() AS a FROM dual WHERE 1=0;

没有结果行时是不会触发的,以下方式可触发:

SELECT yjb.pkg_scene_job.F_SYNC_DRUG_STOCK() AS a FROM dual;

PS:一定是使用(调用)到 触发函数yjb.pkg_scene_job.F_SYNC_DRUG_STOCK(),才可完成触发。如:

/*无法触发情况*/
with t1 as (select 1 as a,unicorn.pkg_scene_job.F_SYNC_DRUG_STOCK() as f from dual)
select a from t1
; 

/*可触发情况*/

with t1 as (select 1 as a,unicorn.pkg_scene_job.F_SYNC_DRUG_STOCK() as f from dual)
select f from t1
; 
或
with t1 as (select 1 as a,unicorn.pkg_scene_job.F_SYNC_DRUG_STOCK() as f from dual)
select a from t1 where f=1
; 

查看后台任务:

SELECT * FROM user_scheduler_jobs;

查看后台任务日志:

SELECT * FROM user_scheduler_job_run_details a WHERE instr(a.job_name,'SYNC_DRUG_STOCK_JOB')>=1 ORDER BY a.log_date DESC;


 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

深入理解netfilter和iptables

目录 Netfilter的设计与实现 内核数据包处理流 netfilter钩子 钩子触发点 NF_HOOK宏与Netfilter裁定 回调函数与优先级 iptables 内核空间模块 xt_table的初始化 ipt_do_table() 复杂度与更新延时 用户态的表,链与规则 conntrack Netfilter(结合iptable…

100种思维模型之安全边际思维模型-92

安全边际, 简而言之即距离某一件糟糕的事件发生,还有多大的空间,安全边际越高,我们就越安全! 安全边际思维模型一个 让生活变得更从容 的 思维模型。 01、何谓安全边际思维模型 一、安全边际思维 安全边际 源于…

ACL 2023 | 持续进化中的语言基础模型

尽管如今的 AI 模型已经具备了理解自然语言的能力,但科研人员并没有停止对模型的不断改善和理论探索。自然语言处理(NLP)领域的技术始终在快速变化和发展当中,酝酿着新的潮流和突破。 NLP 领域的顶级学术会议国际计算语言学年会 …

声网 Agora音视频uniapp插件跑通详解

一、前言 在使用声网SDK做音视频会议开发时, 通过声网官方论坛 了解到,声网是提供uniapp插件的,只是在官方文档中不是很容易找到。 插件地址如下: Agora音视频插件 Agora音视频插件(JS) 本文讲解如何跑通演示示例 二、跑通Demo 2.1 环境安装: 参考: 2. 通过vue-…

vue3+element+sortablejs实现table表格 行列动态拖拽

vue3elementsortablejs实现table动态拖拽 1.第一步我们要安装sortablejs依赖2.在我们需要的组件中引入3.完整代码4.效果 1.第一步我们要安装sortablejs依赖 去博客设置页面,选择一款你喜欢的代码片高亮样式,下面展示同样高亮的 代码片. npm install so…

巩固一下NodeJs

1、初始化(确保当前电脑有node环境) npm init 2、安装express npm i expressnpm i ws文件结构 3、编写相关代码启动node服务(server.js) //导入下列模块,express搭建服务器,fs用来操作文件、ws用来实现webscoket const express require("expr…

Android 使用webView打开网页可以实现自动播放音频

使用webview 自动播放音视频,场景如,流媒体自动部分,音视频通话等。会出现如下问题: 解决方案如下: 配置webview 如下,这样可以自动播放音频。 webView.getSettings().setMediaPlaybackRequiresUserGestur…

原生JS实现图片裁剪功能

功能介绍:图片通过原生input上传,使用canvas进行图片裁剪。 裁剪框限制不允许超出图片范围,图片限制了最大宽高(自行修改要的尺寸),点击确认获取新的base64图片数据 注:fixed布局不适用该方案&…

在vue中点击弹框给弹框中的表格绑值

场景描述&#xff1a;如下图所示&#xff0c;我们需要点击 ‘账单生成’ 按钮&#xff0c;然后里边要展示一个下图这样的表格。 最主要的是如何展示表格中的内容&#xff0c;一起看看吧&#xff01; <template><!-- 水费 欠费--><el-dialog title"水费欠费…

短视频seo矩阵源码开发与实践分享

在短视频矩阵系统源码开发中&#xff0c;需要注意以下几个细节&#xff1a; 1. 确定系统的功能需求&#xff1a;在开发短视频矩阵系统源码时&#xff0c;必须先明确系统的功能需求&#xff0c;包括用户的基本操作、系统数据的生成和处理等。 2. 定义数据库结构&#xff1a;短…

零售数字化转型如何破局?这篇文章全说清了!

“数字化转型”&#xff0c;一个老生常谈的话题。自19世纪互联网崭露头角&#xff0c;亚马逊和eBay等电商平台崛起&#xff0c;引领电子商务的发展。传统零售业开始意识到在线渠道的重要性&#xff0c;并纷纷推出自己的电子商务网站&#xff0c;从自此进入数字化转型的赛道当中…

利用电价运行策略研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

STM32单片机语音识别台灯控制系统人检测亮度调节

实践制作DIY- GC00156-语音识别台灯控制系统 一、功能说明&#xff1a; 基于STM32单片机设计-语音识别台灯控制系统 二、功能说明&#xff1a; 电路&#xff1a;STM32F103C系列最小系统串口语音识别模块LED灯板1个红外传感器 1.任何时候没有人则关闭灯。有人可以自动打开灯。…

激斗云计算:互联网大厂打响新一轮排位战

大模型如同一辆时代列车&#xff0c;所有科技大厂都想上车。 自去年底ChatGPT一炮而红&#xff0c;国内外数十家科技大厂、创业公司、机构相继下场&#xff0c;一时间掀起大模型的热浪。 《中国人工智能大模型地图研究报告》显示&#xff0c;截至今年5月28日&#xff0c;中国…

contentEditable属性

我们最常用的输入文本内容便是input与textarea&#xff0c;但是有一个属性&#xff0c;可以让我们在很多标签中&#xff0c;如div,table,p,span,body等&#xff0c;可以像input输入框一样&#xff0c;实现文本编辑&#xff0c;这便是contentEditable属性 之前有用到这个属性是在…

快速搭建一个美观且易用的 Django 管理后台 —— django-xadmin

Django-xadmin&#xff08;也称为Xadmin&#xff09;是一个第三方的 Django 应用程序&#xff0c;它提供了一系列工具和模板来快速开发基于 Django 的后台管理界面。使用 Django-xadmin 可以用很少的代码就创建出一个强大的、具备实时查看数据、增、删、改等基本操作的 Django …

LiveNVR监控流媒体Onvif/RTSP功能-安全控制HTTP接口鉴权开启禁止游客访问开启后401 Unauthorized如何播放调用接口

LiveNVR安全控制HTTP接口鉴权开启禁止游客访问开启后401 Unauthorized如何播放调用接口&#xff1f; 1、安全控制1.1、接口鉴权1.2、禁止游客访问 2、401 Unauthorized2.1、携带token调用接口2.1.1、获取鉴权token2.1.2、调用其它接口2.1.2.1、携带 CookieToken2.1.2.2、携带 U…

C人脸识别

1、原始图片&#xff1a; 2、灰度化下&#xff1a; 3、均值滤波&#xff1a; 4、 二值图加边缘检测 5、生成积分图 6、把待检测的人脸区域划分为25个&#xff0c;因为是一个数组&#xff0c;这样分别统计每个区域的像素个数&#xff1a; x0: 60, y0: 100, x1: 157, y1: 200 …

介绍AI绘画课,让智能工具助力创作 释放无限想象力 助你成为绘画大师

演示地址&#xff1a; www.runruncode.com/portal/article/index/id/19458/cid/81.html 画画是一项有趣的活动&#xff0c;它让人充满无限可能。对许多人来说&#xff0c;画画既是一种放松的方式&#xff0c;也是一种与创意、文化和艺术联系的途径。如果你是一个初学者&#x…

云原生——Docker容器化实战

❄️作者介绍&#xff1a;奇妙的大歪❄️ &#x1f380;个人名言&#xff1a;但行前路&#xff0c;不负韶华&#xff01;&#x1f380; &#x1f43d;个人简介&#xff1a;云计算网络运维专业人员&#x1f43d; 前言 "Docker"一词指代了多个概念&#xff0c;包括开源…