1. 先创建一个FUNCTION

CREATE OR REPLACE FUNCTION GET_TIMEOUT_PROGRAM(i_customerNo IN TK_CUST_PROG_D.CUSTOM_NO%TYPE,
i_programId IN TK_CUST_PROG_D.Prog_Id%TYPE,
i_timeout IN TK_CUST_PROG_D.PROG_TIMEOUT%TYPE)
RETURN number AS
PRAGMA AUTONOMOUS_TRANSACTION;
v_doresult NUMBER := 1;
v_station SMALL_PROGRAM_STATUS.Station%TYPE;
v_programId SMALL_PROGRAM_STATUS.Program_Id%TYPE;
v_lastActiveTime date;
v_spanMinutes NUMBER;
BEGIN
BEGIN
SELECT Station,
PROGRAM_ID,
Last_Active_Time,
floor(to_number(sysdate - LAST_ACTIVE_TIME) * 24 * 60)
INTO v_station, v_programId, v_lastActiveTime, v_spanMinutes
from SMALL_PROGRAM_STATUS
WHERE STATION = i_customerNo
AND PROGRAM_ID = i_programId
AND floor(to_number(sysdate - LAST_ACTIVE_TIME) * 24 * 60) >
i_timeout;
EXCEPTION
WHEN NO_DATA_FOUND THEN
return 0;
when TOO_MANY_ROWS then
DBMS_OUTPUT.PUT_LINE('More than one record.');
END; merge into SMALL_PROGRAM_TASK t1
using (select i_customerNo as station,
i_programId as program_id,
'N' send_flag
from dual) t2
on (t1.station = t2.station and t1.program_id = t2.program_id and t1.send_flag = t2.send_flag)
when matched then
update
set t1.last_active_time = v_lastActiveTime,
t1.program_timeout = i_timeout,
t1.expired_time = v_spanMinutes,
t1.modify_date = sysdate()
when not matched then
insert
(job_no,
station,
program_id,
last_active_time,
send_flag,
program_timeout,
create_date,
expired_time)
values
(sys_guid(),
v_station,
v_programId,
v_lastActiveTime,
'N',
i_timeout,
sysdate(),
v_spanMinutes);
commit;
DBMS_OUTPUT.PUT_LINE('v_doresult=' || v_doresult);
DBMS_OUTPUT.PUT_LINE('v_station=' || v_station);
DBMS_OUTPUT.PUT_LINE('v_spanMinutes=' || v_spanMinutes);
RETURN v_doresult;
END;

2. 创建procedure

CREATE OR REPLACE PROCEDURE get_expired_program AS
v_timeout TK_CUST_PROG_D.PROG_TIMEOUT%TYPE;
v_customerNo TK_CUST_PROG_D.CUSTOM_NO%TYPE;
v_programId TK_CUST_PROG_D.Prog_Id%TYPE;
v_doresult number;
v_records_sum number := 0;
CURSOR c_cursor IS SELECT CUSTOM_NO,Prog_Id,PROG_TIMEOUT FROM TK_CUST_PROG_D WHERE MONITOR_PROGRAM='Y';
BEGIN
OPEN c_cursor;
LOOP
FETCH c_cursor INTO v_customerNo,v_programId,v_timeout;
EXIT WHEN c_cursor%NOTFOUND;
begin
select GET_TIMEOUT_PROGRAM(v_customerNo,v_programId,v_timeout) into v_doresult from dual;
v_records_sum := v_doresult;
end;
END LOOP;
dbms_output.put_line('records_num: "' || v_records_sum || '"');
CLOSE c_cursor;
END;

3.创建调用定时排程调用这个Procedure,每五分钟调用一次procedure

begin
sys.dbms_scheduler.create_job(job_name => 'PLOEC.GET_EXPIRED_PROGRAM_TASK',
job_type => 'STORED_PROCEDURE',
job_action => 'get_expired_program',
start_date => to_date('06-03-2017 00:00:00', 'dd-mm-yyyy hh24:mi:ss'),
repeat_interval => 'Freq=Minutely;Interval=5',
end_date => to_date('07-03-2049 00:00:00', 'dd-mm-yyyy hh24:mi:ss'),
job_class => 'DBMS_JOB$',
enabled => true,
auto_drop => false,
comments => '每五分鐘掃呼叫get_expired_program一次');
end;
/

Function或者Procedure在compile时候出错,可以通过以下SQL查看errors detail

show errors function GET_TIMEOUT_PROGRAM;
show errors procedure get_expired_program;

Call Procedure

exec get_expired_program;

Test Function

declare
outNumber number;
begin
select GET_TIMEOUT_PROGRAM('TPE','P0001',90) into outNumber from dual;
dbms_output.put_line('outNumber: "' || outNumber || '"');
end;

View schedule log

SELECT * FROM dba_scheduler_jobs WHERE job_name = 'GET_EXPIRED_PROGRAM_TASK';
FROM

oracle通过job执行procedure的更多相关文章

  1. oracle job 定时执行 存储过程

    oracle job 定时执行 存储过程   一:简单测试job的创建过程案例: 1,先创建一张JOB_TEST表,字段为a 日期格式 SQL> create table JOB_TEST(a ...

  2. 【转】oracle定制定时执行任务

    本节摘要:本节介绍使用oracle自带的job来实现oracle定制定时执行任务. 1.引言 定制定时执行的任务有两种形式,系统级别和数据库级别, 从操作系统级别来讲, windows系统我们可以使用 ...

  3. Oracle查看SQL执行计划的方式

    Oracle查看SQL执行计划的方式     获取Oracle sql执行计划并查看执行计划,是掌握和判断数据库性能的基本技巧.下面案例介绍了多种查看sql执行计划的方式:   基本有以下几种方式: ...

  4. 基于Oracle的SQL优化(崔华著)-整理笔记-第2章“Oracle里的执行计划”

    详细介绍了Oracle数据里与执行计划有关的各个方面的内容,包括执行计划的含义,加何查看执行计划,如何得到目标SQL真实的执行计划,如何查看执行计划的执行顺序,Oracle数据库里各种常见的执行计划的 ...

  5. Oracle中的执行计划

    使用autotrace sqlplus系统参数:SQL> set autotrace trace onSQL> select * from dual;DUM---XExecution Pl ...

  6. ORACLE数据库查看执行计划的方法

    一.什么是执行计划(explain plan) 执行计划:一条查询语句在ORACLE中的执行过程或访问路径的描述. 二.如何查看执行计划 1: 在PL/SQL下按F5查看执行计划.第三方工具toad等 ...

  7. oracle定制定时执行任务

    1.引言 定制定时执行的任务有两种形式,系统级别和数据库级别, 从操作系统级别来讲, windows系统我们可以使用任务计划来实现, 对于winXP系统,设置步骤如下,开始---设置---控制面板-- ...

  8. [转载]T-SQL(Oracle)语句查询执行顺序

    原文链接:http://blog.sina.com.cn/s/blog_61c006ea0100mlgq.html sql语法的分析是从右到左,where子句中的条件书写顺序,基本上对sql性能没有影 ...

  9. Oracle sql语句执行顺序

    sql语法的分析是从右到左 一.sql语句的执行步骤: 1)词法分析,词法分析阶段是编译过程的第一个阶段.这个阶段的任务是从左到右一个字符一个字符地读入源程序,即对构成源程序的字符流进行扫描然后根据构 ...

随机推荐

  1. Spring高级话题-@Enable***注解的工作原理

    出自:http://blog.csdn.net/qq_26525215 @EnableAspectJAutoProxy @EnableAspectJAutoProxy注解 激活Aspect自动代理 & ...

  2. 利用FFmpeg玩转Android视频录制与压缩(二)<转>

    转载出处:http://blog.csdn.net/mabeijianxi/article/details/72983362 预热 时光荏苒,光阴如梭,离上一次吹牛逼已经过去了两三个月,身边很多人的女 ...

  3. sqlite在终端中输入命令不显示

    问题: 今天通过命令想访问我设备里面的db文件,但是进入到 sqlite> 后,输入命令都是不显示的,但是回车是可以执行的.如图 经过一番排查后,发现,因为我前面使用了su命令,不要使用su命令 ...

  4. 用Eclipse进行远程Debug代码

    在新的公司,由于项目很大,在本机运行会很慢,所以都是在本地开发,在远程虚拟机上运行.这样就让我痛苦了,我怎么在本地Eclipse上进行debug调试呢,但是在公司前辈的指导下让我知道了本地Eclips ...

  5. java 整数存储为2进制补码形式

    今天早上看java的源代码,发现: 用计算器转成十进制后是下面这个值: 然后我就纳闷了,Integer的最小值,不可能怎么大吧? 于是果断写代码验证: 谜底揭开: 0x80000000 是Intege ...

  6. 浅谈scheduler

  7. (转)libvirt 部分API 介绍

    感谢朋友支持本博客,欢迎共同探讨交流,由于能力和时间有限,错误之处在所难免,欢迎指正! 如果转载,请保留作者信息. 博客地址:http://blog.csdn.net/qq_21398167 原博文地 ...

  8. Eclipse快捷键大全(补充)

    Ctrl+1 快速修复(最经典的快捷键,就不用多说了) Ctrl+Shift+O 自动导入所需要的包(这个用的次数也相当多)Ctrl+D: 删除当前行 Ctrl+Alt+↓ 复制当前行到下一行(复制增 ...

  9. rocketmq消费负载均衡--push消费为例

    本文介绍了DefaultMQPushConsumerImpl消费者,客户端负载均衡相关知识点.本文从DefaultMQPushConsumerImpl启动过程到实现负载均衡,从源代码一步一步分析,共分 ...

  10. 第一个MFC实例:计算圆周长和圆面积

    一.基于Microsoft MFC的编程方法 MFC是微软基础类库(Microsoft Foundation Class)的缩写.与API不同,MFC不是Windows操作系统的组成部分,而是微软公司 ...