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. Swift 修改UITextField.Placeholder颜色

    StoreNameEditTextField.attributedPlaceholder = NSAttributedString(string:"点此处输入门店名称",attri ...

  2. C# StopWatch的BUG????

    //BUG?????? //使用StopWatch测试运行时间 //两段测试A和B //测试结果受测试顺序影响,后测要比先测耗时长了许多 static void TestKeyIntStr() { v ...

  3. PHP - 脚本退出(包括异常退出),执行指定代码

    之前做聊天室的时候有那么个需求就是当用户异常断线的时候就应该清除她的在线状态.因为当时对于flush不够了解,尝试了各种办法,好像都没办法在我们开发机上面执行相应的代码.后来知道是flush的原因.我 ...

  4. 服务器意外重启导致storm报错的问题处理

    解决方法 cat /opt/storm-0.8.2/conf/storm.yaml中找到storm.local.dir设定的目录,备份supervisor和workers两个文件夹,#nohup su ...

  5. ModleAndView类是干什么的???

    /** * 启用账号 */ @SuppressWarnings("finally") @RequestMapping(value = "/accountStart&quo ...

  6. 封装baseservice

    package com.huawei.base; import java.io.Serializable;import java.util.List; public abstract class Ba ...

  7. Python OrderedDict使用

    一.最近最少使用实现: import collections class LRUDict(object): ''' 最近最少使用队列实现,最近使用的键值放后面 ''' def __init__(sel ...

  8. c# vs c++

    [c# vs c++] 1.在 C++ 中,类和结构实际上是相同的,而在 C# 中,它们很不一样.C# 类可以实现任意数量的接口,但只能从一个基类继承.而且,C# Struct不支持继承,也不支持显式 ...

  9. IIS7日志中时间与系统时间不一致的原因

    最近在分析web日志,发现IIS7日志中时间与系统时间不一致,即本该上班时间才产生的产并发访问日志,全部发生在凌晨至上班前. 本以为是系统时间设置错误,检查后一切正常.后查询资料,原来是这个原因: 日 ...

  10. java的web配置文件的“<load-on-startup>的说明[转]

    <servlet> <servlet-name>log4jInitServlet</servlet-name> <servlet-class>org.s ...