oracle通过job执行procedure
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的更多相关文章
- oracle job 定时执行 存储过程
oracle job 定时执行 存储过程 一:简单测试job的创建过程案例: 1,先创建一张JOB_TEST表,字段为a 日期格式 SQL> create table JOB_TEST(a ...
- 【转】oracle定制定时执行任务
本节摘要:本节介绍使用oracle自带的job来实现oracle定制定时执行任务. 1.引言 定制定时执行的任务有两种形式,系统级别和数据库级别, 从操作系统级别来讲, windows系统我们可以使用 ...
- Oracle查看SQL执行计划的方式
Oracle查看SQL执行计划的方式 获取Oracle sql执行计划并查看执行计划,是掌握和判断数据库性能的基本技巧.下面案例介绍了多种查看sql执行计划的方式: 基本有以下几种方式: ...
- 基于Oracle的SQL优化(崔华著)-整理笔记-第2章“Oracle里的执行计划”
详细介绍了Oracle数据里与执行计划有关的各个方面的内容,包括执行计划的含义,加何查看执行计划,如何得到目标SQL真实的执行计划,如何查看执行计划的执行顺序,Oracle数据库里各种常见的执行计划的 ...
- Oracle中的执行计划
使用autotrace sqlplus系统参数:SQL> set autotrace trace onSQL> select * from dual;DUM---XExecution Pl ...
- ORACLE数据库查看执行计划的方法
一.什么是执行计划(explain plan) 执行计划:一条查询语句在ORACLE中的执行过程或访问路径的描述. 二.如何查看执行计划 1: 在PL/SQL下按F5查看执行计划.第三方工具toad等 ...
- oracle定制定时执行任务
1.引言 定制定时执行的任务有两种形式,系统级别和数据库级别, 从操作系统级别来讲, windows系统我们可以使用任务计划来实现, 对于winXP系统,设置步骤如下,开始---设置---控制面板-- ...
- [转载]T-SQL(Oracle)语句查询执行顺序
原文链接:http://blog.sina.com.cn/s/blog_61c006ea0100mlgq.html sql语法的分析是从右到左,where子句中的条件书写顺序,基本上对sql性能没有影 ...
- Oracle sql语句执行顺序
sql语法的分析是从右到左 一.sql语句的执行步骤: 1)词法分析,词法分析阶段是编译过程的第一个阶段.这个阶段的任务是从左到右一个字符一个字符地读入源程序,即对构成源程序的字符流进行扫描然后根据构 ...
随机推荐
- linux下mysql的root密码忘记----解决方案
1.首先确认服务器出于安全的状态,也就是没有人能够任意地连接MySQL数据库. 因为在重新设置MySQL的root密码的期间,MySQL数据库完全出于没有密码保护的 状态下 ...
- 在线程中调用其它主界面的模块,因为中间有休息1000ms,所以调用前要检查DateTimeRun变量;在From_load 启动线程;在From_closing From_closed 设置DateTimeRun=false
//系统启动后,自动启动时钟 void jishi_kernel() { try { while (DateTimeRun) { Thread.Sleep(); if (myRunning) Runn ...
- 「小程序JAVA实战」小程序的flex布局(22)
转自:https://idig8.com/2018/08/09/xiaochengxu-chuji-22/ 之前已经把小程序的框架说完了,接下来说说小程序的组件,在说组件之前,先说说布局吧.源码:ht ...
- Django xadmin的使用 (二)
上一篇中我们基本完成了xadmin的配置,但是要进行正式使用还需要更多细致的配置. 1.页面显示中文 settings.py中配置(这个和django自带的admin配置一样) # LANGUAGE_ ...
- 跟着太白老师学python 09day 初识函数
函数的最主要的目的:封装一个功能 函数的优点: 减少代码的复用率, 增加代码的阅读性 def my_len(arvg): # arvg 形参 my_len函数名,应该具有代表性,让你一看就明白 # 函 ...
- WebSocket实践——Java实现WebSocket的两种方式
什么是 WebSocket? 随着互联网的发展,传统的HTTP协议已经很难满足Web应用日益复杂的需求了.近年来,随着HTML5的诞生,WebSocket协议被提出,它实现了浏览器与服务器的全双工通信 ...
- Console2支援中文顯示的正式設定法
1.用regedit找到HKEY_CURRENT_USER\Console,把底下的Console2 command window機碼給砍了.2.Console2的View功能表中,有個Console ...
- An Intuitive Explanation of Fourier Theory
Reprinted from: http://cns-alumni.bu.edu/~slehar/fourier/fourier.html An Intuitive Explanation of Fo ...
- KVM镜像image 转换 调整
qemu-img create -f raw test.raw 8G 创建一个raw格式,大小为8G的镜像. qemu-img info disk1.qcow2 #查看镜像大小及实际占用多少空 ...
- 2018-2019第一学期Java助教心得
随着期末考试落下了帷幕,本学习也结束了回顾本学期的历程,对我影响最深的还是这学期很幸运的成为代老师的助教,这也是我第一次接触助教工作.刚开始的时候我心里也有很多的担心,怕自己胜任不了这份工作,但随着时 ...