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);BEGINBEGINSELECT 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 THENSELECT 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 thenRETURN 0;    END F_SYNC_DRUG_STOCK;/*同步表数据(全量/增量)数据量上万时 建议将数据量拆分进行*/PROCEDURE PRC_SYNC_DRUG_STOCK(RUNJOB  VARCHAR2) ISpragma autonomous_transaction;BEGIN--		  SYS.DBMS_LOCK.SLEEP(10);--		  EXECUTE IMMEDIATE INBLOCK;merge into table1 vusing (SELECTi1.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_SPECFROMtable2@interface i1) don (v.HOSPITAL_AREA = d.HOSPITAL_AREA AND v.DRUG_CODE=d.DRUG_CODE AND v.STORAGE=d.STORAGE)   -- 这里通过主键判断,数据是否存在when matched thenupdate set v.QUANTITY = d.QUANTITY,v.AVAILABLE_STORAGE = d.AVAILABLE_STORAGEwhen not matched theninsert (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;


 

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

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

相关文章

Hudi基础知识讲解

Hudi概述 Hudi是一种数据湖的存储格式,在Hadoop文件系统之上提供了更新数据和删除数据的能力以及消费变化数据的能力。支持多种计算引擎,提供IUD接口,在 HDFS的数据集上提供了插入更新和增量拉取的流原语。 基础架构图 Hudi特性 ACID事务能…

用户案例 | Apache DolphinScheduler 离线调度在自如多业务场景下的应用与实践

用户案例 | 自如 随着自如业务的快速发展,不断增长的调度任务和历史逾万的存量任务对平台稳定性提出了更高的要求。同时,众多非专业开发人员也需要一种更为“亲民”的调度平台使用体验。 如何满足这些日渐凸显的需求对自如大数据平台的开发团队来说&am…

2023年最全最新的学习课程合集

WEB前端入门:从零开始做网站。 完成所有课堂练习就可以做出自己的作品,并掌握数据库和了解开源项目。 这些课程涵盖了HTML、CSS和JavaScript等前端技术,以及与之相关的设计原则和最佳实践。 前端课程的目标是培养学生在网页开发方面的技能…

冒泡排序模拟实现qsort()函数

冒泡排序模拟实现qsort函数 前言1. 分析2. 解决一,如何接受不同数据3. 解决二,如何实现不同数据的比较4. 解决三,如何实现不同数据交换5. 模拟bubble_sort()函数排序整型所有代码实现6. 结构体排序实现7. 结尾 前言 要…

应急管理大屏助力暴雨天气下的水灾防范

随着气候变化和城市化进程的加剧,暴雨天气引发的水灾风险日益凸显。在面对这种自然灾害时,如何高效、及时地应对、减轻损失成为了当务之急。水灾应急管理平台的可视化大屏为相关部门和决策者提供了实时、全面的信息展示和决策支持,大大提升了…

逻辑(css)-背景网格制作(linear-gradient)

目录 linear-gradient需求实现 linear-gradient 语法:linear-gradient([direction], color-stop1, color-stop2, ...) 第一个参数为(可选)方向参数,可以是度数也可以是方位名词,方向与读书的关系如下: 角度方位文字说明示例0degto top从下…

左神算法之中级提升(2)

目录 [案例1】 【题目描述】 【思路解析1】 【思路解析2】 【代码实现】 【案例2】 【题目描述】 【思路解析】 【代码实现】 【案例3】 【题目描述】 【思路解析】 【代码实现】 【案例4】 【题目描述】今日头条2018面试题 第四题 【输入描述】 【思路解析】 【…

零拷贝是如何实现的

零拷贝是如何实现的 零拷贝(Zero-copy)是一种优化技术,用于在数据传输过程中减少数据的拷贝次数,从而提高数据传输的效率和性能。传统的数据传输涉及多次内存拷贝操作,而零拷贝通过减少或避免这些拷贝操作来实现性能优…

​LeetCode解法汇总​979. 在二叉树中分配硬币

目录链接: 力扣编程题-解法汇总_分享记录-CSDN博客 GitHub同步刷题项目: https://github.com/September26/java-algorithms 原题链接:力扣 描述: 给定一个有 N 个结点的二叉树的根结点 root,树中的每个结点上都对应…

VMware ESXi 7.0 U3n macOS Unlocker OEM BIOS 集成网卡驱动和 NVMe 驱动 (集成驱动版)

VMware ESXi 7.0 U3n macOS Unlocker & OEM BIOS 集成网卡驱动和 NVMe 驱动 (集成驱动版) ESXi 7 U3 标准版集成 Intel 网卡、USB 网卡 和 NVMe 驱动 请访问原文链接:https://sysin.org/blog/vmware-esxi-7-u3-sysin/,查看最新版。原创作品&#x…

力扣 55. 跳跃游戏

题目来源:https://leetcode.cn/problems/jump-game/description/ C题解(来源代码随想录):不断更新可覆盖范围,能达到最后一个元素即返回true,否则返回false。 class Solution { public:bool canJump(vecto…

中国移动光猫设置桥接

网上教程五花八门,有些坑有些行,我试成功了,记录一下方法。 一、流程简述 1. 使用超级管理员账号登录中国移动光猫,设置桥接,并重启 2. 用网线连接路由器和光猫,登录路由器,设置宽带拨号&…