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. [Z] Shell中脚本变量和函数变量的作用域

    在shell中定义函数可以使代码模块化,便于复用代码.不过脚本本身的变量和函数的变量的作用域问题可能令你费解,在这里梳理一下这个问题. (1)Shell脚本中定义的变量是global的,其作用域从被定 ...

  2. Asp.net 的工作原理

     转:http://www.cnblogs.com/linjiancun/archive/2010/09/14/1825662.html 1.1.1          Asp.net 的工作原理 ...

  3. leetcode168

    public class Solution { private string Convert(int k) { var s = ""; switch (k) { : s = &qu ...

  4. 关于Web项目出现懒加载异常的解决方案

    manytomany关系中,使用 fetch = FetchType.LAZY 来做懒加载,加快些性能.但是却一直出错,原因是session被关闭,要保持session,需要事务. Hibernate ...

  5. oracle、sqlserver、mysql常用函数对比[to_char、to_number、to_date]

    Oracle                                       -->                             MySQL to_char(sysdat ...

  6. MySQL 主从同步失败,数据表修复

    问题描述: 接到报警称一台 MySQL 从库同步失败.登录服务器查看错误日志信息如下: Last_Error: Error 'Incorrect key file for table './bfcc/ ...

  7. keepalived之vrrp_script详解

    通常情况下,利用keepalived做热备,其中一台设置为master,一台设置为backup.当master出现异常后,backup自动切换为master.当backup成为master后,mast ...

  8. 微信小程序相关二、css介绍,菜单制作,表单相关,京东注册页面

    一.第二天上午 1.1上午因为有其他的课所以没有去这个课,不过下午看复习的时候的概括,讲了DTD,语法特性,css选择器以及权重,还有一些简单的样式 1.2 DTD Docuement Type 声明 ...

  9. Solo and Mute

    [Solo and Mute ] Muting means a transition will be disabled. Soloed transtions are enabled and with ...

  10. Nginx 相关介绍(Nginx是什么?能干嘛?个人觉得写得比较好的文章,转载过来)

    Nginx的产生 没有听过Nginx?那么一定听过它的"同行"Apache吧!Nginx同Apache一样都是一种WEB服务器.基于REST架构风格,以统一资源描述符(Unifor ...