记录。

是这么个事,要实现一个需求,当人员表里的数据有更新后需要告知其他系统更新他们自己的人员数据。

我想了一下,表里是有时间戳字段的,那我只要监听这个时间就行,拿到数据后用存储过程把数据插入到中间表,然后其他系统从中间表更新到他自己的系统库里面

1.先创建一张所需数据的中间表
create table t_rygx (
ryid varchar(64) primary key not null ,
bm varchar(64),
jh varchar(64),
gh varchar(64),
xm varchar(64),
sfzh varchar(64),
zzjgid varchar(64),
zzjgbm varchar(64),
zzjgmc varchar(200),
zt number ,
gxsj date DEFAULT CURRENT_TIMESTAMP,
cjsj date DEFAULT CURRENT_TIMESTAMP
)
2.创建存储过程
create or replace procedure insert_ry is
--让游标变量指向一个动态select查询的结果集
cursor v_rys is
select
ry.ryid,
ry.bm,
ry.xm,
ry.jh,
ry.gh,
ry.sfzh,
zzjg.zzjgid,
zzjg.bm as zzjgbm,
zzjg.mc as zzjgmc
from t_ry ry
left join t_zzjgcy cy on ry.ryid = cy.ryid
left join t_zzjg zzjg on cy.zzjgid = zzjg.zzjgid
where ry.sfyx = 1 and ry.gxsj > sysdate + ( 10 /24 /60); --当前时间减十分钟
extis integer;--声明变量值
begin
--循环开始
for e in v_rys loop
select count(1) into extis from t_rygx where ryid = e.ryid;
if extis < 1 then
INSERT INTO t_tyqx_rygx ( ryid, xm, bm, jh, gh, sfzh, zzjgid, zzjgbm, zzjgmc, zt, cjsj, gxsj )
VALUES
(
e.ryid,
e.xm,
e.bm,
e.jh,
e.gh,
e.sfzh,
e.zzjgid,
e.zzjgbm,
e.zzjgmc,
                 0,
CURRENT_TIMESTAMP,
CURRENT_TIMESTAMP
);
else
update t_rygx set xm = e.xm,
bm = e.bm,
jh = e.jh,
gh = e.gh,
sfzh = e.sfzh,
zzjgid = e.zzjgid,
zzjgbm = e.zzjgbm,
zzjgmc = e.zzjgmc
                 zt = 0 ,
where ryid = e.ryid ;
end if; --if结束
end loop; --循环结束
end;
3.创建job定时任务
declare job number ;
begin
dbms_job.submit(
job, --返回的定时器id,不用管
'insert_ry;', -- 要执行的存储过程
sysdate, --立即生效
'TRUNC(sysdate,''mi'') + 10/ (24 * 60)' --定时时效 每十分钟执行一次,其他时间自行搜索
);
commit;
end;

  

4.上面三步完成就弄完了 ,然后就可以去看下数据了
select * from t_rygx
5.补充一些定时任务相关的内容
四个参数说明:
    job:输出变量,是此任务在任务队列中的编号;
    what:执行的任务的名称及其输入参数;
    next_date:任务执行的时间;
    interval:任务执行的时间间隔。

-- 查看调度任务
select * from user_jobs;
-- 查看正在执行的调度任务
select * from dba_jobs_running;
-- 查看执行完的调度任务
select * from dba_jobs;

-- 执行定时任务
  BEGIN
    DBMS_JOB.RUN(jobid);
    COMMIT;
  END;
-- 停止已启动的定时任务
BEGIN
DBMS_JOB.BROKEN(25, TRUE, SYSDATE);
COMMIT;
END;
-- 删除指定job
BEGIN
DBMS_JOB.REMOVE(25);
commit;
END;
5.常用INTERVAL 参数值 
描述                        INTERVAL参数值
每天午夜12点 TRUNC(SYSDATE + 1)
每天早上8点30分 TRUNC(SYSDATE + 1) + (8*60+30)/(24*60)
每星期二中午12点 NEXT_DAY(TRUNC(SYSDATE ), ''TUESDAY'' ) + 12/24
每个月第一天的午夜12点 TRUNC(LAST_DAY(SYSDATE ) + 1)
每个季度最后一天的晚上11点 TRUNC(ADD_MONTHS(SYSDATE + 2/24, 3 ), 'Q' ) -1/24
每星期六和日早上6点10分 TRUNC(LEAST(NEXT_DAY(SYSDATE, ''SATURDAY"), NEXT_DAY(SYSDATE, "SUNDAY"))) + (6×60+10)/(24×60)
每秒钟执行次 Interval => sysdate + 1/(24 * 60 * 60) 如果改成sysdate + 10/(24 * 60 * 60)就是10秒钟执行次 每分钟执行
Interval => TRUNC(sysdate,'mi') + 1/ (24*60) 如果改成TRUNC(sysdate,'mi') + 10/ (24*60) 就是每10分钟执行次 每天定时执行
例如:每天的凌晨1点执行
Interval => TRUNC(sysdate) + 1 +1/ (24) 每周定时执行
例如:每周一凌晨1点执行
Interval => TRUNC(next_day(sysdate,'星期一'))+1/24 每月定时执行
例如:每月1日凌晨1点执行
Interval =>TRUNC(LAST_DAY(SYSDATE))+1+1/24 每季度定时执行
例如每季度的第一天凌晨1点执行
Interval => TRUNC(ADD_MONTHS(SYSDATE,3),'Q') + 1/24 每半年定时执行
例如:每年7月1日和1月1日凌晨1点
Interval => ADD_MONTHS(trunc(sysdate,'yyyy'),6)+1/24 每年定时执行
例如:每年1月1日凌晨1点执行
Interval =>ADD_MONTHS(trunc(sysdate,'yyyy'),12)+1/24

oracle 存储过程 for loop 定时任务的更多相关文章

  1. oracle 存储过程

    来自:http://www.jb51.net/article/31805.htm Oracle存储过程基本语法 存储过程 1 CREATE OR REPLACE PROCEDURE 存储过程名 2 I ...

  2. Oracle存储过程语法

    原文链接:http://www.jb51.net/article/31805.htm Oracle存储过程基本语法 存储过程  1 CREATE OR REPLACE PROCEDURE 存储过程名  ...

  3. Oracle存储过程基本语法介绍

    Oracle存储过程基本语法 存储过程 1 CREATE OR REPLACE PROCEDURE 存储过程名 2 IS 3 BEGIN 4 NULL; 5 END; 行1: CREATE OR RE ...

  4. Oracle存储过程(转)

    Oracle存储过程基本语法 存储过程 1 CREATE OR REPLACE PROCEDURE 存储过程名 2 IS 3 BEGIN 4 NULL; 5 END; 行1: CREATE OR RE ...

  5. ORACLE存储过程学习

    存储过程 1 CREATE OR REPLACE PROCEDURE 存储过程名 2 IS 3 BEGIN 4 NULL; 5 END; 行1: CREATE OR REPLACE PROCEDURE ...

  6. Oracle 存储过程学习

    转自:http://blog.chinaunix.net/uid-20495387-id-174394.html http://www.cnblogs.com/rootq/articles/11000 ...

  7. 【PL/SQL系列】Oracle存储过程使用动态SQL

    Oracle存储过程相信大家都比较了解,下面就为您介绍Oracle存储过程使用动态SQL的方法,希望对您能够有所帮助. CREATE OR REPLACE PROCEDURE P_STAT_SCORE ...

  8. Oracle存储过程-自定义数据类型,集合,遍历取值

    摘要 Oracle存储过程,自定义数据类型,集合,遍历取值 目录[-] 0.前言 1.Packages 2.Packages bodies 3.输出结果 0.前言 在Oracle的存储过程中,可能会遇 ...

  9. (转)oracle 存储过程 带游标作为OUT参数输出

    (转)oracle 存储过程 带游标作为OUT参数输出 存储过程返回OUT参数的游标 例子. 包中带过程 要自己定义一个type [cur_name] is ref cursor游标,返回的时候就直接 ...

  10. Oracle存储过程,以逗号分隔字符串传参的处理

    Oracle存储过程,经常会遇见传入的参数是逗号分隔. 处理需要3步: 第一步,创建Type类型 第二部,创建函数 第三部,创建存储过程 代码如下: 第一步: create or replace ty ...

随机推荐

  1. 【Linux】5.5 Shell运算符

    Shell运算符 Shell 和其他编程语言一样,支持多种运算符,包括: 算数运算符 关系运算符 布尔运算符 字符串运算符 文件测试运算符 原生bash不支持简单的数学运算,但是可以通过其他命令来实现 ...

  2. 【软件】Ubuntu下QT的安装和使用

    [软件]Ubuntu下QT的安装和使用 零.前言 QT是应用得比较广泛的程序框架,是因为其跨平台特性比较好,且用C/C++作为开发语言,性能也比较好,故本文介绍如何安装和使用QT,用的版本是QT 6. ...

  3. 【Guava】BiMap&Multimap&Multiset

    BiMap Map 可以实现 key -> value 的映射,如果想要 value -> key 的映射,就需要定义两个 Map,并且同步更新,很不优雅.Guava 提供了 BiMap ...

  4. Linux C线程读写锁深度解读 | 从原理到实战(附实测数据)

    Linux C线程读写锁深度解读 | 从原理到实战(附实测数据) 读写锁练习:主线程不断写数据,另外两个线程不断读,通过读写锁保证数据读取有效性. 代码实现如下: #include <stdio ...

  5. Clion搭建C++开发环境

    1.下载和安装MinGW 1)下载链接:http://www.mingw.org/ 2)选择安装目录,目录尽可能简单(如:D:\MinGW)且不要包含中文和空格 3)添加相关的包 所需的包如下:min ...

  6. stackbd:在一个块设备上堆叠另一个块设备

    stackbd 是一个虚拟的块设备,它作为另一个块设备的前端,如 USB 闪存盘或循环设备.它将I/O请求传递给底层设备,同时它打印请求信息用于调试.它还有可能修改请求. 堆叠块设备(stackbd) ...

  7. excel 类模块的使用

    类模块代码如下: '类模块Cmds的代码 Option Explicit Public WithEvents testx As msforms.CommandButton '增加点击事件 Privat ...

  8. ESP32教程:通过WIFI控制LED灯的开关

    LED闪烁 在通过WIFI控制LED灯的开关之前,我们先实现一下LED闪烁. 接线图: 来源:https://esp32io.com/tutorials/esp32-led-blink 我的接线图: ...

  9. SpringBoot内容协商(Content Negotiation)二 —— 自定义消息转换器(MessageConverter)

    SpringBoot内置的消息转换器 SpringBoot没有处理返回yaml格式的数据,这里需要手动添加处理这种返回格式的支持. 导入依赖 <dependency> <groupI ...

  10. 【翻译】 Processing系列|(三)安卓项目构建

    上上篇:[翻译]Processing系列|(一)简介及使用方法 上一篇:[翻译]Processing系列|(二)安卓模式的安装使用及打包发布 我顺藤摸瓜找到了Github仓库,然后发现人家主要还是用A ...