视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
Oracle中通过Job实现定时同步两个数据表之间的数据
2020-11-09 07:56:23 责编:小采
文档


摘要:之前项目中用的触发器来实现数据解析,但是最近客户反应,会报错,所以我们从新设计了一下,通过Oracle里面的Job来解决这一问题,这样就不会对原来的数据表做操作,只对临时表操作,就不会对客户那边的上级服务器产生影响了,详细请看下面: 一:首先

摘要:之前项目中用的触发器来实现数据解析,但是最近客户反应,会报错,所以我们从新设计了一下,通过Oracle里面的Job来解决这一问题,这样就不会对原来的数据表做操作,只对临时表操作,就不会对客户那边的上级服务器产生影响了,详细请看下面:

一:首先建个主表:MBINMSGS(这里的用户是MIP)

CREATE TABLE MIP.MBINMSGS
(
 ID NUMBER(30) NOT NULL,
 MBINMSGS_CLOB_MSG CLOB,
 MBINMSGS_DATE_RECEIVED DATE,
 MBINMSGS_DATE_PROCESSED DATE,
 MBINMSGS_SUBSYSTEM_NAME VARCHAR2(100 BYTE),
 MBINMSGS_SUBSYSTEM_DATE_SENT DATE,
 SERVICENAME VARCHAR2(30 BYTE) NOT NULL
)

二:其次建个临时表用来存储主表过来的数据:MBINMSGS_TEMP

CREATE TABLE MIP.MBINMSGS_TEMP
(
 ID NUMBER(30) NOT NULL,
 MBINMSGS_CLOB_MSG CLOB,
 MBINMSGS_DATE_RECEIVED DATE,
 MBINMSGS_DATE_PROCESSED DATE,
 MBINMSGS_SUBSYSTEM_NAME VARCHAR2(100 BYTE),
 MBINMSGS_SUBSYSTEM_DATE_SENT DATE,
 SERVICENAME VARCHAR2(30 BYTE) NOT NULL
)
三:建立同步数据的存储过程:JOB_PRO_TEMP

CREATE OR REPLACE PROCEDURE MIP.JOB_PRO_TEMP
AS
 TEMP_ID NUMBER;
BEGIN
 SELECT NVL (MAX (ID), 0) INTO TEMP_ID FROM MBINMSGS_TEMP;

 INSERT INTO MBINMSGS_TEMP
 SELECT *
 FROM MBINMSGS
 WHERE MBINMSGS.ID > TEMP_ID;

 --insert into MBINMSGS_TEST select * from MBINMSGS;

 COMMIT;
EXCEPTION
 WHEN OTHERS
 THEN
 DBMS_OUTPUT.PUT_LINE ('Exception happened,data was rollback');
 ROLLBACK;
END;
/
四:建立定时执行存储过程的Job:

var job_num number;
begin
	dbms_job.submit(:job_num,'JOB_PRO_TEMP;',SYSDATE,'sysdate+1/24/60');
end;
commit;
五:查看新建的Job是否正确运行:

SELECT * FROM USER_JOBS;
六:可能有的人会说我建了Job但是不能运行,那说明你的Job没有运行,我在这个过程中就遇到了这个的问题,最后经过查找,解决了,办法如下:

检查Oracle的JOB运行环境:如果为0表示不运行JOB,Oracle一般默认安装完为10,但是我安装oracle以后就不知道为什么是0。
	查看进程数(这里是用system管理员账号登录)
	show parameter job_queue_processes;
	修改进程数(如果你的是0,才需要按照以下语句修改):
	我这里改为10模拟以下这个操作;
	在PL/SQL的command窗口中输入以下语句:
	alter system set job_queue_processes=10 scope=both;
	修改完以后我们查看一下,如果为10那就说明好了,然后你把刚才建的Job删除了,在重新建立一个Job:
	show parameter job_queue_processes;
七:删除Job的方法:

exec dbms_job.remove(81);

说明:这里的数字81是对应DBA_JOBS表中当前要删除的JOB记录所在行的JOB字段的值;


更加详细的关于Oracle的Job请看:http://www.cnblogs.com/java-pan/archive/2012/09/16/oracle_job.html

下载本文
显示全文
专题