oracle定时执行存储过程的方法
oracle数据库定时任务dbms_job的用法详解
oracle数据库定时任务dbms_job的⽤法详解⼀、dbms_job涉及到的知识点1、创建job:variable jobno number;dbms_job.submit(:jobno, —-job号'your_procedure;',—-执⾏的存储过程, ';'不能省略next_date, —-下次执⾏时间'interval' —-每次间隔时间,interval以天为单位);–系统会⾃动分配⼀个任务号jobno。
2、删除job: dbms_job.remove(jobno);3、修改要执⾏的操作: job:dbms_job.what(jobno, what);4、修改下次执⾏时间:dbms_job.next_date(jobno, next_date);5、修改间隔时间:dbms_job.interval(jobno, interval);6、启动job: dbms_job.run(jobno);7、停⽌job: dbms.broken(jobno, broken, nextdate); –broken为boolean值⼆、初始化相关参数job_queue_processes1、job_queue_process表⽰oracle能够并发的job的数量,当job_queue_process值为0时表⽰全部停⽌oracle的job。
2、查看job_queue_processes参数⽅法⼀:show parameter job_queue_process;⽅法⼆:select * from v$parameter where name='job_queue_processes';3、修改job_queue_processes参数alter system set job_queue_processes = 10;三、user_jobs表结构字段(列)类型描述job number 任务的唯⼀标⽰号log_user varchar2(30) 提交任务的⽤户priv_user varchar2(30) 赋予任务权限的⽤户schema_user varchar2(30) 对任务作语法分析的⽤户模式last_date date 最后⼀次成功运⾏任务的时间last_sec varchar2(8) 如hh24:mm:ss格式的last_date⽇期的⼩时,分钟和秒this_date date 正在运⾏任务的开始时间,如果没有运⾏任务则为nullthis_sec varchar2(8) 如hh24:mm:ss格式的this_date⽇期的⼩时,分钟和秒next_date date 下⼀次定时运⾏任务的时间以下使⽤⼀个案例来演⽰dbms_job的使⽤⼀、在plsql中创建表:create table t(id varchar2(30),name varchar2(30));⼆、在plsql中创建存储过程:create or replace procedure proce_t isbegininsert into t(id, name) values('1', to_char(sysdate, 'yyyy-mm-dd hh24:mi:ss'));commit;end proce_t;/三、创建job任务(1分钟执⾏⼀次):在sql>后执⾏:variable jobno number;begindbms_job.submit(:jobno,'proce_t;', sysdate, 'sysdate+1/24/60');commit;end;/提交后提⽰:pl/sql procedure successfully completedjobno---------25四、跟踪任务的情况(查看任务队列):sql> select job, next_date, next_sec, failures, broken from user_jobs;job next_date next_sec failures broken---------- ----------- ---------------- ---------- ------25 2012/9/14 1 10:59:46 0 n说明任务已创建成功。
Oralce定时执行存储过程任务的设置步骤
创建variable job_feeid_create NUMBER;beginsys.dbms_job.submit(:job_feeid_create,'wlk_check_fee;',sysdate,'TRUNC(SYSDATE+1)');commit;end;在命令控制台中这样就可以建产一个作业了。
sysdate表示当前作业将来执行的时间,sysdate+1表示调用频率。
描述 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)'运行begindbms_job.run(:job_feeid_create);end;查询作业记录select*from user_jobs具体讲解:1.确保Oracle的工作模式允许启动任务队列管理器Oracle定时执行“Job Queue”的后台程序是SNP进程,而要启动SNP进程,首先要确保整个系统的模式是可以启动SNP进程的,这需要以DBA的身份去执行如下命令:svrmgrl>; alter system enable restricted session;或sql>; alter system disenable restricted session;利用如上命令更改系统的会话方式为disenable restricted,为SNP的启动创造条件。
oracle时间循环的存储过程范例
oracle时间循环的存储过程范例Oracle是一款广泛使用的关系型数据库管理系统,它支持使用存储过程来实现复杂的业务逻辑。
本文将以一个时间循环的存储过程为例,介绍如何在Oracle中编写和使用存储过程。
在实际开发中,经常会遇到需要根据时间进行循环操作的场景,比如每天定时执行某个任务,或者按照特定的时间间隔重复执行某个操作。
使用存储过程可以将这些循环逻辑封装起来,提高代码的复用性和可维护性。
下面我们以一个简单的例子来说明如何使用Oracle存储过程实现时间循环。
假设我们需要每天定时向用户发送一封电子邮件,提醒他们当天的待办事项。
我们可以通过存储过程来实现这个功能。
我们需要创建一个存储过程来发送邮件。
在存储过程中,我们可以使用Oracle提供的时间函数来获取当前日期,并根据日期来查询当天的待办事项。
然后,我们可以使用邮件服务的API来发送邮件给用户。
下面是一个简化的示例代码:```sqlCREATE OR REPLACE PROCEDURE send_email ASv_today DATE;v_subject VARCHAR2(100);v_body VARCHAR2(1000);BEGIN-- 获取当前日期v_today := SYSDATE;-- 构造邮件主题和内容v_subject := '今日待办事项提醒';v_body := '尊敬的用户,以下是您今天的待办事项:';-- 查询当天的待办事项-- SELECT * FROM todo_list WHERE due_date = v_today;-- 发送邮件给用户-- email_service.send_email('****************',v_subject, v_body);-- 打印日志DBMS_OUTPUT.PUT_LINE('邮件发送成功!');END;/```在上面的代码中,我们首先声明了一些变量来存储当前日期、邮件主题和内容。
OracleJob的使用(定时执行)
OracleJob的使⽤(定时执⾏)oracle中的job能为你做的就是在你规定的时间格式⾥执⾏存储过程,定时执⾏⼀个任务。
下⾯是⼀个⼩案例,定时每15分钟向⼀张表插⼊⼀条数据⼀1.创建⼀张测试表-- Create tablecreate table A8(a1 VARCHAR2(500))tablespace DSP_DATApctfree 10initrans 1maxtrans 255storage(initial 64Knext 1Mminextents 1maxextents unlimited);2.创建存储过程实现向测试表插⼊数据create or replace procedure proc_add_test asbegininsert into a8 values (to_char(sysdate, 'yyyy-mm-dd hh:mi'));/*向测试表插⼊数据*/commit;end;3.创建job定时任务实现⾃动调⽤存储过程(当前时间 17:03)declarejob number;BEGINDBMS_JOB.SUBMIT(JOB => job, /*⾃动⽣成JOB_ID*/WHAT =>'proc_add_test;', /*需要执⾏的存储过程名称或SQL语句*/NEXT_DATE => sysdate+3/(24*60), /*初次执⾏时间-下⼀个3分钟*/INTERVAL =>'trunc(sysdate,''mi'')+1/(24*60)'/*每隔1分钟执⾏⼀次*/);commit;end;4.也就是应该从17:06开始每隔1分钟执⾏⼀次存储过程下⾯是截⽌17:12分的测试表的数据⼆1.可以通过查询系统表查看该job信息select*from user_jobs;2.⼿动sql调⽤job (直接调⽤job可以忽略开始时间)beginDBMS_JOB.RUN(40); /*40 job的id*/end;3.删除任务begin/*删除⾃动执⾏的job*/dbms_job.remove(40);end;4.停⽌jobdbms.broken(job,broken,nextdate);dbms_job.broken(v_job,true,next_date); /*停⽌⼀个job,⾥⾯参数true也可是false,next_date(某⼀时刻停⽌)也可是sysdate(⽴刻停⽌)。
Oracle定时任务(执行某一SQL语句)
Oracle定时任务(执⾏某⼀SQL语句)Oracle定时任务,是定时调⽤存储过程,执⾏存储过程中的SQl语句SQl实例-- 建⽴存储过程CREATE or replace PROCEDURE UPDATE_AGENCYisBEGINUPDATE AGENCY SET AGENCY.STATUS ='Y'WHERE ='@太和县先明商贸'OR ='凤阳县府城润鑫伟业酒业经营部'OR ='永城市东城区锋伟名酒⾏'; -- 需要执⾏的SQl语句end;-- 根据存储过程昵称查看存储任务Select text from user_source where name='UPDATE_AGENCY'order by line;-- 删除存储过程DROP PROCEDURE UPDATE_AGENCY;-- 创建任务declare tm_jobb number; --tm_joba定时任务名称beginsys.dbms_job.submit(tm_jobb, --任务名称'UPDATE_AGENCY;',--执⾏的过程sysdate,--执⾏时间'TRUNC(SYSDATE + 1) + (11*60+55)/(24*60)');--下次执⾏时间 11:55COMMIT;end;-- 查看定时任务SELECT*FROM user_jobs;-- ⼿动启动BEGINdbms_job.run(25);END;-- 停⽌任务BEGINdbms_job.broken(25,true);END;-- 删除任务begindbms_job.remove(25);--ALL_JOBS.job的值end;存job信息的表user_jobs主要字段说明: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)''每3秒钟执⾏⼀次 'sysdate+3/(24*60*60)'每2分钟执⾏⼀次 'sysdate+2/(24*60)'每分钟执⾏Interval => TRUNC(sysdate,'mi') + 1/ (24*60) --每分钟执⾏interval => 'sysdate+1/(24*60)' --每分钟执⾏interval => 'sysdate+1' --每天interval => 'sysdate+1/24' --每⼩时interval => 'sysdate+2/24*60' --每2分钟interval => 'sysdate+30/24*60*60' --每30秒每天定时执⾏Interval => TRUNC(sysdate+1) --每天凌晨0点执⾏Interval => TRUNC(sysdate+1)+1/24 --每天凌晨1点执⾏Interval => TRUNC(SYSDATE+1)+(8*60+30)/(24*60) --每天早上8点30分执⾏每周定时执⾏Interval => TRUNC(next_day(sysdate,'星期⼀'))+1/24 --每周⼀凌晨1点执⾏Interval => TRUNC(next_day(sysdate,1))+2/24 --每周⼀凌晨2点执⾏每⽉定时执⾏Interval =>TTRUNC(LAST_DAY(SYSDATE)+1) --每⽉1⽇凌晨0点执⾏Interval =>TRUNC(LAST_DAY(SYSDATE))+1+1/24 --每⽉1⽇凌晨1点执⾏每季度定时执⾏Interval => TRUNC(ADD_MONTHS(SYSDATE,3),'q') --每季度的第⼀天凌晨0点执⾏Interval => TRUNC(ADD_MONTHS(SYSDATE,3),'q') + 1/24 --每季度的第⼀天凌晨1点执⾏Interval => TRUNC(ADD_MONTHS(SYSDATE+ 2/24,3),'q')-1/24 --每季度的最后⼀天的晚上11点执⾏每半年定时执⾏Interval => ADD_MONTHS(trunc(sysdate,'yyyy'),6)+1/24 --每年7⽉1⽇和1⽉1⽇凌晨1点每年定时执⾏Interval =>ADD_MONTHS(trunc(sysdate,'yyyy'),12)+1/24 --每年1⽉1⽇凌晨1点执⾏注意:存储过程中执⾏的SQL语句⼀定要以;结尾。
Oracle存储过程定时任务
DBMS_JOB系统包是Oracle“任务队列”子系统的API编程接口。
DBMS_JOB包对于任务队列提供了下面这些功能:提交并且执行一个任务、改变任务的执行参数以及删除或者临时挂起任务等。
DBMS_JOB包是由ORACLE_HOME目录下的rdbms/admin子目录下的DBMSJOB.SQL和PRVTJOB.PLB 这两个脚本文件创建的。
这两个文件被CATPROC.SQL脚本文件调用,而CATPROC.SQL 这个文件一般是在数据库创建后立即执行的。
脚本为DBMS_JOB包创建了一个公共同义词,并给该包授予了公共的可执行权限,所以所有的Oracle用户均可以使用这个包。
下面几个数据字典视图是关于任务队列信息的,主要有DBA_JOBS, USER_JOBS和DBA_JOBS_RUNNING。
这些字典视图是由名为CATJOBQ.SQL的脚本文件创建的。
该脚本文件和创建DBMS_JOB包的脚本文件一样在ORACLE_HOME目录的rdbms/admin子目录中,同样也是由脚本文件CATPROC.SQL调用。
最后,要使任务队列能正常运行,还必须启动它自己专有的后台过程。
启动后台过程是通过在初始化文件init*.ora(实例不同,初始化文件名也略有不同)中设置初始化参数来进行的。
下面就是该参数:JOB_QUEUE_PROCESSES = n其中,n可以是0到36之间的任何一个数。
除了该参数以外,还有几个关于任务队列的初始化参数,本文后面将会对其进行详细讨论。
DBMS_JOB包中包含有许多过程,见表1所示。
表1 DBMS_JOB包三、DBMS_JOB包参数DBMS_JOB包中所有的过程都有一组相同的公共参数,用于定义任务,任务的运行时间以及任务定时运行的时间间隔。
这些公共任务定义参数见表2所示。
表2 DBMS_JOB过程的公共参数下面我们来详细讨论这些参数的意义及用法。
1、job参数job是一个整数,用来唯一地标示一个任务。
oracle通过job定时执行任务
oracle通过job定时执行任务2010年12月11日星期六 17:29在项目中,经常会遇到需要定时完成的任务,比如定时更新数据,定义统计数据生成报表等等,其实这些事情都可以使用Oracle的Job来完成。
下面考试大就结合我们实验室项目实际,简单介绍一下在Oracle数据库中通过Job完成自动创建表的方法。
整个过程总共分为两步。
虽然整个过程都非常简单,但是对于初学Oracle的生手还是有很多地方需要注意的。
首先介绍一下,创建该JOB的背景,因为每天更新的直播和点播节目信息比较多,为了方便处理,需要每天创建一张表来记录更新的节目信息,当前数据库中已经有一张tbl_programme的表,每天创建的表的字段需要同tbl_programme保持一致,每天新创建的表的名称格式为tbl_programme_日期(例如:tbl_programme_20090214)规定每天晚上1点钟生成该天的新表。
第一步:创建一个执行创建操作的存储过程在这一步首先要解决的问题就是构造表名。
在Oracle中格式话输出时间可以用to_char函数来处理,例如:SQL> select to_char(sysdate, ‟yyyy/mm/dd hh24:mi:ss‟) from dual;TO_CHAR(SYSDATE,‟YYYY/MM/DDHH2------------------------------2009/02/14 17:22:41以上SQL格式化输出了时间,要得到我们所需要的格式直接修改一下SQL即可SQL> select to_char(sysdate, ‟yyyymmdd‟) from dual;TO_CHAR(SYSDATE,‟YYYYMMDD‟)---------------------------20090214得到时间格式字符串后我们就可以将表名的前缀和时间连接在一起形成完整的表名。
这里需要注意,在Oracle中链接两个字符串需要使用…||‟符号,而在Sql Server中直接使用…+‟号就可以了,因为我以前一直在Sql Server下编程,好久都没编写Oracle的SQL所以费了很大的功夫才发现这个问题。
oracle定时运行存储过程
直接运行以下命令则可以实现定时:variable job1 number;begindbms_job.submit(:job1,'ac_detail_data_create;',trunc(sysdate,'mm')+6+1/24,'trunc(add_months(sysdate,1),''mm'')+6+1/24');commit;end;dbms_job.submit(:job1,'ac_detail_data_create;',trunc(sysdate,'mm')+6+1/24,'trunc(add_months(sysdate,1),''mm'')+6+1/24');第二个参数是存储过程名第三个参数第一次执行时间第四个参数定时时间定时时间的计算方法:每天:trunc(sysdate+1)每周:trunc(sysdate+7)每月:trunc(sysdate+30)每个星期日:next_day(trunc(sysdate),'SUNDAY')每天6点:trunc(sysdate+1)+6/24半个小时:sysdate+30/1440如果是存储要带运行参数,则采用以下方法:V ARIABLE job number;beginsys.dbms_job.submit(job => :job,what => 'declarep_cycle_id varchar2(8);result number;resulttext varchar2(1024);beginselect to_char(add_months(trunc(sysdate),-1),''yyyymm'')||''01'' into p_cycle_id from dual; insert into rpt_error_info(err_code,err_msg) values(seq_rpt_log_id.nextval,to_char(sysdate,''yyyymmddhh24miss'')||''-''||p_cycle_id||''-rpt_balance_balance_prc_1-'');rpt_summary_1290(p_cycle_id,result,resulttext);insert into rpt_error_info(err_code,err_msg) values(seq_rpt_log_id.nextval,to_char(sysdate,''yyyymmddhh24miss'')||''-''||p_cycle_id||''-rpt_balance_balance_prc_1-'');commit;end;',next_date => to_date('04-03-2012 02:00:00', 'dd-mm-yyyy hh24:mi:ss'),interval => 'trunc(add_months(sysdate,1),''MM'')+2+3/24'); commit;end;自己使用实例:定时运行一个存储(带参数的):V ARIABLE job number;beginsys.dbms_job.submit(job => :job,what => 'declareoutput varchar2(1000);beginp_audit_receipt_freeze(output);end;',next_date => trunc(sysdate+1)+3/24,interval => 'trunc(add_months(sysdate,1)-10)');commit;end;设置时日期是10月15号,运行后,其中next_date是第二天凌晨3点,而interval通过计算后则为月份加一个月减去10天,为11月5号(有疑问)定时运行一个存储(不带参数的):variable job1 number;variable output varchar2(1000);begindbms_job.submit(:job1,'p_audit_receipt_freeze;',trunc(sysdate+1)+3/24,'trunc(add_months(sysdate,1)-10)');commit;end;设置时日期是10月15号,运行后,其中next_date是第二天凌晨3点,而interval通过计算后则为月份加一个月减去10天,为11月5号(有疑问)以上定时应该改为以下内容:(有待验证)V ARIABLE job number;beginsys.dbms_job.submit(job => :job,what => 'declareoutput varchar2(1000);beginp_audit_receipt_freeze(output);end;',next_date => to_date('05-12-2012 03:00:00', 'dd-mm-yyyyhh24:mi:ss'),interval => 'trunc(add_months(sysdate,1),''MM'')+4+3/24'); commit;end;/定义为每个月5号跑数也可以定义不用自动跑的,只跑一次的:V ARIABLE job number;beginsys.dbms_job.submit(job => :job,what => 'declareoutput varchar2(1000);beginp_audit_receipt_freeze(output);end;',next_date => to_date('26-11-2012 03:00:00', 'dd-mm-yyyy hh24:mi:ss'));commit;end;/定义为2012-11-26日凌晨3点跑数。
oracle定制定时执行任务
oracle定制定时执行任务1.引言定制定时执行的任务有两种形式,系统级别和数据库级别,从操作系统级别来讲,windows系统我们可以使用任务计划来实现,对于winXP系统,设置步骤如下,开始---设置---控制面板---任务计划,然后添加任务计划,按向导完成配置即可;对于win7系统,设置步骤如下,点击开始,然后在搜索程序和文件框中输入 [任务计划],然后点击出来的任务计划程序,创建一个基本任务即可;linux系统我们可以使用crontab命令来是实现,从数据库级别来讲,我们可以采用数据库的job来实现;本节主要介绍通过oracle数据库的job来定制一个简单的定时执行任务。
本节会采用oracle定制一个定时向一个表中插入语句。
这里聊一下我做这个oracle定时任务的缘由:项目中要在固定的时间,把一个数据库中某些表的数据同步到另外一个数据库,显然这些工作我不能每次都自己去做,那么,我要怎么来做呢?这个时候oracle的定时执行任务JOB无疑是我的最佳选择。
我把同步的脚本放在一个存储过程中,然后在固定的时间去执行这个存储过程就OK了。
注意:以下所有的操作都是在sytem用户下执行。
采用PL/SQL做的客户端登陆。
2.项目环境安装oracle10g,然后再安装PL/SQL,然后用管理员用户system登陆,打开SQL Window输入图中的SQL语句,操作环境详细的信息如下:3.环境准备(1)新建一个表,命令为test,建表语句如下:test09161 create table system.test09162 (3 seq NUMBER(2) PRIMARY KEY,4 seqtime DATE5 )在SQL窗口执行以上语句;(2)新建一个存储过程,命名为test_proc,存储过程的语句如下:test_proc1 CREATE OR REPLACE PROCEDURE test_proc IS2 BEGIN3 INSERT INTO SYSTEM.TEST0916(SEQ, SEQTIME) VALUES(NVL((SELECT MAX(SEQ) FROM SYSTEM.TEST0916) + 1, 0), SYSDATE);4 COMMIT;5 EXCEPTION6 WHEN OTHERS THEN7 DBMS_OUTPUT.PUT_LINE('Exception happened,data was rollback');8 ROLLBACK;9 END;在SQL Window窗口中执行以上存储过程,执行完成以后,查看Objects下的Procedures菜单,可以看到新建的存储过程如图:TEST_PROC前面的图标没有红色的标记,表示存储过程正常;(3)检查oracle的JOB运行环境我这里遇到的只是要检查一下oracle的JOB队列的进程数,如果为0表示不运行JOB,虽然网上说一般默认为10,但是我安装oracle以后就不知道为什么是0。
oracle定时执行存储过程操作步骤
oracle存储过程定时执行操作过程1.检查oracle的JOB运行环境我这里遇到的只是要检查一下oracle的JOB队列的进程数,如果为0表示不运行JOB,说明:该参数在plsql中的command windows中查看.如果当前value 为“0”则说明JOB任务不能执行。
则需要修改//执行语句alter system set job_queue_processes=10 scope=both;//执行成功后,再查看一下。
2.定制定时任务1var job_num number;2begin3dbms_job.submit(:job_num,'test_proc;',SYSDATE,'sysdate+2/24/60');4end;执行截图该任务也在command windows 中执行。
参数说明:job_num:/*自动生成执行任务编号*/test_proc:/*调用的存储过程*/sysdate:/*当前系统时间*/select * from user_jobs;——查看调度任务select * from dba_jobs_running;——查看正在执行的调度任务select * from dba_jobs;——查看执行完的调度任务exec dbms_job.run(84);--运行一个定时器exec DBMS_JOB.BROKEN(83,SYS.DIUTIL.INT_TO_BOOL(1));--停止一个定时器exec DBMS_JOB.INTERVAL(84, 'sysdate + 60/1440');--改变一个定时器的执行频率成每隔一小时执行一次exec dbms_job.remove(83);--删除一个定时器--在user_jobs中查到的id执行存储过程1.begin2.dbms_job.run(41);--41为任务的id3.end;时间间隔写法如下:描述 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)''每3秒钟执行一次'sysdate+3/(24*60*60)'每2分钟执行一次'sysdate+2/(24*60)'1:每分钟执行Interval => TRUNC(sysdate,'mi') + 1/ (24*60) --每分钟执行interval =>'sysdate+1/(24*60)'--每分钟执行interval =>'sysdate+1'--每天interval =>'sysdate+1/24'--每小时interval =>'sysdate+2/24*60'--每2分钟interval =>'sysdate+30/24*60*60'--每30秒2:每天定时执行Interval => TRUNC(sysdate+1) --每天凌晨0点执行Interval => TRUNC(sysdate+1)+1/24 --每天凌晨1点执行Interval => TRUNC(SYSDATE+1)+(8*60+30)/(24*60) --每天早上8点30分执行3:每周定时执行Interval => TRUNC(next_day(sysdate,'星期一'))+1/24 --每周一凌晨1点执行Interval => TRUNC(next_day(sysdate,1))+2/24 --每周一凌晨2点执行4:每月定时执行Interval =>TTRUNC(LAST_DAY(SYSDATE)+1) --每月1日凌晨0点执行Interval =>TRUNC(LAST_DAY(SYSDATE))+1+1/24 --每月1日凌晨1点执行5:每季度定时执行Interval => TRUNC(ADD_MONTHS(SYSDATE,3),'q') --每季度的第一天凌晨0点执行Interval => TRUNC(ADD_MONTHS(SYSDATE,3),'q') + 1/24 --每季度的第一天凌晨1点执行Interval => TRUNC(ADD_MONTHS(SYSDATE+ 2/24,3),'q')-1/24 --每季度的最后一天的晚上11点执行6:每半年定时执行Interval => ADD_MONTHS(trunc(sysdate,'yyyy'),6)+1/24 --每年7月1日和1月1日凌晨1点7:每年定时执行Interval =>ADD_MONTHS(trunc(sysdate,'yyyy'),12)+1/24 --每年1月1日凌晨1点执行相关方法:修改要执行的操作:dbms_job.what(jobno,'sp_fact_charge_code;');--修改某个job名修改下次执行时间:dbms_job.next_date(job,next_date);修改间隔时间:dbms_job.interval(job,interval);停止job:dbms.broken(job,broken,nextdate);dbms_job.broken(v_job,true,next_date); --停止一个job,里面参数true也可是false,next_date(某一时刻停止)也可是sysdate(立刻停止)。
ORACLE 定时执行存储过程
每个季度最后一天的晚上 11 点 ''TRUNC(ADD_MONTHS(SYSDATE + 2/24, 3 ), ''Q'' ) -1/24'' 每星期六和日早上 6 点 10 分 /(24×60)'' ''TRUNC(LEAST(NEXT_DAY(SYSDATE, ''''SATURDAY"), NEXT_DAY(SYSDATE, "SUNDAY"))) + (6×60+10)
WHAT => 'proc_test_job;',
/*NEXT_DATE => sysdate, */ /*初次执行时间,立刻执行*/ /*INTERVAL => 'sysdate+3/(24*60*60)' */ /*执行周期 -每 3 秒钟*/ NEXT_DATE => TRUNC(SYSDATE+1)+(0*60+30)/(24*60), INTERVAL => 'TRUNC(SYSDATE+1)+(0*60+30)/(24*60)' ); COMMIT; /*初次执行时间,12 点 30 分*/ /*每天 12 点 30 分*/
/*dbms_job.submit(job, 'proc_test_job;', sysdate, 'trunc(sysdate,''mi'')+1/(24*60)'); /*执行周期 -每 1 分钟*/ commit;*/
Oracle定时执行存储过程
Oracle定时执行存储过程Oracle定时执行存储过程是一种自动化任务调度的方式,可以使存储过程定期地在指定的时间点执行。
在很多情况下,定时执行存储过程可以提高工作的效率,并减少手动操作的出错可能性。
下面是关于Oracle 定时执行存储过程的一些要点。
1. 创建定时任务:在Oracle中,可以使用DBMS_SCHEDULER包来创建和管理定时任务。
首先,需要创建一个作业,指明需要定时执行的存储过程。
可以使用DBMS_SCHEDULER.CREATE_JOB存储过程来创建作业。
2.指定作业的各种属性:创建作业后,需要指定作业的各种属性,如作业名称、作业类型、所属用户、执行模式等。
可以使用DBMS_SCHEDULER.SET_ATTRIBUTE存储过程来设置各种属性。
3.定义作业的调度计划:要让作业定期执行,需要定义作业的调度计划。
调度计划可以是基于时间的,也可以是基于事件的。
可以使用DBMS_SCHEDULER.SET_ATTRIBUTE存储过程来设置作业的调度计划。
4.启用作业:创建和配置完作业后,需要启用作业,使其可以按计划执行。
可以使用DBMS_SCHEDULER.ENABLE存储过程来启用作业。
5.监控和管理作业:一旦作业启用,它将按计划自动执行。
可以使用DBMS_SCHEDULER.SET_ATTRIBUTE存储过程来设置作业的调度计划。
以及其他相关的存储过程来监控和管理作业,如DBMS_SCHEDULER.DISABLE (禁用作业)、DBMS_SCHEDULER.RUN_JOB(手动运行作业)等。
6.定时任务的日志记录和错误处理:在定时执行存储过程时,常常需要记录执行的日志和处理错误。
可以在存储过程中使用DBMS_OUTPUT.PUT_LINE存储过程来写入日志信息,以及使用异常处理机制来捕获和处理错误。
7.定时任务的权限和安全性:在配置定时任务时,需要确保用户具有足够的权限来执行相关的操作。
ORACLE存储过程详解教程
ORACLE存储过程详解教程ORACLE是一种关系数据库管理系统,它支持存储过程的概念。
存储过程是一段预编译的SQL代码,可以被重复调用,用于实现复杂的业务逻辑。
在本篇文章中,我将详细介绍ORACLE存储过程的概念、语法和使用方法。
一、存储过程的概念存储过程是一种封装了一系列SQL语句的代码块,可以在数据库中创建和保存。
它可以接受输入参数,并返回输出参数。
存储过程通常用于实现复杂的业务逻辑,提高数据库的性能和安全性。
二、存储过程的语法在ORACLE中,可以使用CREATEPROCEDURE语句来创建存储过程。
以下是CREATEPROCEDURE语句的基本语法:```CREATE [OR REPLACE] PROCEDURE procedure_name[(parameter_name [IN , OUT , IN OUT] data_type [, ...])] [IS,AS]BEGIN--存储过程的SQL语句[EXCEPTION--异常处理代码END [procedure_name];```其中,CREATE PROCEDURE用于创建存储过程,OR REPLACE用于替换已存在的存储过程。
procedure_name是存储过程的名称。
parameter_name是存储过程的参数名,可以指定参数的类型(IN、OUT或IN OUT)。
data_type是参数的数据类型。
BEGIN和END之间是存储过程的代码块,可以包含多条SQL语句。
EXCEPTION用于处理异常情况。
三、存储过程的使用方法以下是一个简单的示例,演示了如何在ORACLE中创建和调用存储过程:```CREATE OR REPLACE PROCEDURE get_employee_name(p_employee_id IN NUMBER, p_employee_name OUT VARCHAR2)ISBEGINSELECT employee_name INTO p_employee_nameFROM employeesWHERE employee_id = p_employee_id;EXCEPTIONWHENNO_DATA_FOUNDTHENp_employee_name := 'Employee not found';END;```在这个例子中,我们创建了一个名为get_employee_name的存储过程。
oracle job存储过程使用参数-概述说明以及解释
oracle job存储过程使用参数-概述说明以及解释1.引言1.1 概述在Oracle数据库中,存储过程是一种被预先编译和存储在数据库中的一段SQL语句集合,它们可以被多次调用并重复使用。
Oracle Job存储过程是一种特殊的存储过程,它可以被调度执行,以实现定时任务的功能。
参数在存储过程中的作用不可忽视,它可以使存储过程更加灵活和通用,能够根据不同的需求动态地改变处理逻辑。
因此,本文将重点讨论在Oracle Job存储过程中使用参数的重要性和方法。
通过学习本文,读者将能够更好地理解存储过程中参数的作用,以及如何合理地使用参数来提高存储过程的灵活性和效率。
1.2 文章结构文章结构部分的内容:本文共分为三个部分,包括引言、正文和结论。
引言部分将介绍文章的背景和概述,以及文章结构的介绍,帮助读者快速了解全文内容。
正文部分将详细介绍Oracle Job存储过程以及存储过程中使用参数的重要性。
同时,将分享如何在Oracle Job存储过程中有效地使用参数,帮助读者更好地理解和应用这一技术。
结论部分将对Oracle Job存储过程中参数的作用进行总结,并提出参数使用的注意事项。
另外,还将展望未来发展方向,为读者提供进一步的思考和研究方向。
1.3 目的本文的主要目的是介绍在Oracle Job存储过程中使用参数的重要性和方法。
通过本文,读者可以了解到在存储过程中使用参数的好处,以及如何在Oracle Job中灵活地使用参数来提高代码的复用性和可维护性。
同时,本文还旨在帮助读者更好地理解存储过程中参数的作用,以便他们在实际项目中更加高效地应用参数化的方法。
通过深入分析和实践,读者可以更好地理解和掌握Oracle Job存储过程中参数的使用技巧,从而提升其在数据库开发中的技术水平和工作效率。
2.正文2.1 什么是Oracle Job存储过程:在Oracle数据库中,Job存储过程是一种用来管理定时任务的方式。
oracle execute immediate 存储过程 using 的用法
oracle execute immediate 存储过程using 的用法1. 引言1.1 概述本文将介绍关于Oracle数据库中的execute immediate存储过程using的用法。
execute immediate是Oracle数据库中的一个功能强大的语句,它可以在运行时动态执行SQL语句。
使用execute immediate可以灵活地执行具有不同条件和参数的SQL语句,使得代码更加可读性和灵活性。
1.2 文章结构本文将分为五个部分来讨论Oracle Execute Immediate存储过程using 的用法。
首先,在第二部分我们将介绍execute immediate语句的简介以及存储过程使用场景。
然后,在第三部分中,我们将重点探讨在Oracle存储过程中使用execute immediate using 实现参数化查询的步骤、概念和优势,并给出示例和注意事项。
接下来,在第四部分中,我们将探讨执行动态SQL语句时应考虑的安全性问题以及解决方案,包括防止SQL注入攻击的方法和技巧,并提供最佳实践以保证安全执行动态SQL语句。
最后,在结束部分,我们将总结文章内容并对Oracle Execute Immediate 存储过程using 的用法进行总结,并提出进一步研究方向或问题。
1.3 目的本文旨在帮助读者深入了解Oracle Execute Immediate 存储过程中的using 用法,以及使用execute immediate 实现参数化查询和保证动态SQL语句的安全性。
通过本文的阅读,读者将能够掌握执行动态SQL语句的技巧,并且能够正确地在存储过程中使用execute immediate语句来实现复杂的业务逻辑。
此外,阅读本文还将有助于读者提高对Oracle数据库相关知识的理解和应用能力。
2. Oracle Execute Immediate 存储过程using 的用法2.1 execute immediate 语句简介在Oracle数据库中,execute immediate语句用于执行动态SQL语句。
oracle定时器调用存储过程
oracle定时器调用存储过程博客分类:数据库介绍orcale定时器的简单用法,希望大家一看就能明白1.创建一个表,为了能清楚看到定时器的运行情况我们创建一个带有日期字段的表Sql代码1.create table job_table(run_time date);2.创建存储过程Sql代码1.create or replace procedure job_proc is2.begin3. insert into job_table (run_time) values (sysdate);4.end;3.创建job,并且指定为每天中午12点执行e.g:1, create table job_table(run_time date);2,create or replace procedure job_proc isbegininsert into job_table (run_time)values(sysdate);end job_proc;3,declare job number;begindbms_job.submit(job,'job_proc;',sysdate,'TRUNC(SYSDATE + 1) + (12*60)/(24*60)'); endcommit;Sql代码1.declare2. job number;3.begin4. dbms_job.submit(job, 'job_proc;', sysdate, 'TRUNC(sysdate,''mi'') + 1 / (24*60)');5.--每分钟执行6.end/mit;4.创建之后自动处于运行状态,我们查询job表,看看我们创建的jobSql代码1.select job,broken,what,interval,t.* from user_jobs t;job broken what interval ...81 N job_proc; TRUNC(sysdate,'mi') + 1 / (24*60) ...参数介绍job job的唯一标识,自动生成的broken是否处于运行状态,N;运行;Y:停止what存储过程名称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)''5.我们查询一下表job_table看看里面的数据Sql代码1.select * from job_tableRUN_TIME2011-7-1 下午 05:21:142011-7-1 下午 05:22:042011-7-1 下午 05:23:046.停止job,停止成功之后查看user_jobs表的broken是否变为Y值了Sql代码1.begin2. dbms_job.broken(81,true);3.end;mit;7.启动job,启动成功之后查看user_jobs表的broken是否变为N值了Sql代码1.begin2. dbms_job.run(81);3.end;mit;8.删除job、存储过程、表Sql代码1.delete user_jobs where job=81;2.drop procedure job_proc3.drop table job_table好了一个简单的job完成了,希望有助于初学者学习!!。
ORACLE定时执行
ORACLE数据库自带的DBMS_JOB功能可以实现定时执行PL/SQL的存储过程,但是如果SQL语句很复杂,SQL语句很多,以及经常要改变SQL语句的写法,用写PL/SQL存储过程的方法再定时执行会比较繁琐。
何况还有一些UNIX系统管理员不会写PL/SQL存储过程,所以我介绍一个简单的shell程序可以在安装了ORACLE SERVER或CLIENT的UNIX机器上实现定时执行一个*.sql文件。
首先我们在安装了ORACLE SERVER或CLIENT的UNIX机器上连接目的数据库:$sqlplus username/password@servie_name如果能够成功进入SQL>状态,并执行简单的SQL语句SQL> SELECT SYSDATE FROM DUAL;表明连接成功。
否则检查/$ORACLE_HOME/network/admin/tnsnames.ora 里servie_name是否正确定义/etc/hostname 里是否包含目的数据库的主机名等等......(其它的网络检查就不在这里详细列举了)接着在scott用户下运行测试的SQL语句:scott_select.sqlSQL> SELECT D.DNAME,E.ENAME,E.JOB,E.HIREDATEFROM EMP E,DEPT DWHERE TO_CHAR(E.HIREDATE,'YYYY')='1981' AND E.DEPTNO=D.DEPTNO;然后在目录/oracle_backup/bin/下写一个类似下面的shell文件scott_select.sh------------------------------------------------------------------------su - oracle -c "sqlplus -s scott/tiger@servie_name"<<EOFspool /oracle_backup/log/scott_select.txt;@/oracle_backup/bin/scott_select.sql;spool off;exit;-------------------------------------------------------------------------说明:spool语句把scott_select.sql语句的执行结果输出到/oracle_backup/log/scott_select.txt文件@符号是执行/oracle_backup/bin/scott_select.sql文件在要执行的*.sql文件里可以存放DML、DDL等多条SQL语句。
oracle通过job定时执行任务
oracle通过job定时执行任务2010年12月11日星期六 17:29在项目中,经常会遇到需要定时完成的任务,比如定时更新数据,定义统计数据生成报表等等,其实这些事情都可以使用Oracle的Job来完成。
下面考试大就结合我们实验室项目实际,简单介绍一下在Oracle数据库中通过Job完成自动创建表的方法。
整个过程总共分为两步。
虽然整个过程都非常简单,但是对于初学Oracle的生手还是有很多地方需要注意的。
首先介绍一下,创建该JOB的背景,因为每天更新的直播和点播节目信息比较多,为了方便处理,需要每天创建一张表来记录更新的节目信息,当前数据库中已经有一张tbl_programme的表,每天创建的表的字段需要同tbl_programme保持一致,每天新创建的表的名称格式为tbl_programme_日期(例如:tbl_programme_20090214)规定每天晚上1点钟生成该天的新表。
第一步:创建一个执行创建操作的存储过程在这一步首先要解决的问题就是构造表名。
在Oracle中格式话输出时间可以用to_char函数来处理,例如:SQL> select to_char(sysdate, ‟yyyy/mm/dd hh24:mi:ss‟) from dual;TO_CHAR(SYSDATE,‟YYYY/MM/DDHH2------------------------------2009/02/14 17:22:41以上SQL格式化输出了时间,要得到我们所需要的格式直接修改一下SQL即可SQL> select to_char(sysdate, ‟yyyymmdd‟) from dual;TO_CHAR(SYSDATE,‟YYYYMMDD‟)---------------------------20090214得到时间格式字符串后我们就可以将表名的前缀和时间连接在一起形成完整的表名。
这里需要注意,在Oracle中链接两个字符串需要使用…||‟符号,而在Sql Server中直接使用…+‟号就可以了,因为我以前一直在Sql Server下编程,好久都没编写Oracle的SQL所以费了很大的功夫才发现这个问题。
ORACLE定时执行存储过程
推荐用dbms_scheduler 方式更好(2012-11-19注)[sql] view plain copy1./*2.查询:3.selectjob, broken, what, interval, t. * fromuser_jobs t;4.job job的唯一标识,自动生成的5.broken是否处于运行状态,N;运行;Y:停止6.what存储过程名称7.next_date初次执行时间8.interval执行周期9.9.删除:10.begindbms_job. remove(jobno); end;11.根据what的内容确定其对应的job,并如此执行删除13.14.执行时间例子: 13.INTERVAL 参数15.描述16.每天午夜12 点''TRUNC (SYSDATE + 1)''17.每天早上8点30分''TRUNC(SYSDATE + 1) + (8*60+30)/(24*60)''18.每星期二中午12点''NEXT_DAY(TRUNC(SYSDATE ), ''''TUESDAY'''') + 1 2/24,'19.每个月第一天的午夜12点''TRUNC(LAST_DAY(SYSDATE ) + 1)''20.每个季度最后一天的晚上11点''TRUNC(ADD_M0NTHS(SYSDATE + 2/24, 3 ), '' Q'') -1/24''21.每星期六和日早上6点10分''TRUNC(LEAST(NEXT_DAY(SYSDATE, '''' SATURDAY"), NEXT.DAY(SYS DATE, "SUNDAY"))) + (6X60+10) / (24X60)22.每3秒钟执行一次'sysdate+3/(24*60*60)'23.每 2 分钟执行一次'sysdate+2/(24*60)'24.24.1:每分钟执行25.Interval => TRUNC(sysdate, J mi5) + 1/ (24*60) --每分钟执行27. interval => J sysdate+1/ (24*60) --每分钟执行28. interval => 'sysdate+r --每天29. interval => 'sysdate+l/24, --每小时30. interval => ,sysdate+2/24*60, --每2分钟31. interval => 'sysdate+30/24*60*60J--每30 秒32. 2:每天定时执行33. Interval => TRUXC (sysdate+1) --每天凌晨0点执行34. Interval二〉TRUXC (sysdate+1)+1/24 --每天凌晨 1 点执行35.Interval => TRUXC (SYSDATE+1) + (8*60+30) / (24*60) --每天早上8点30分执行36.3:每周定时执行37.Interval => TRUNC(next_day(sysdate, * 星期一'))+1/24 --每周—凌晨1点执行38.Interval => TRUXC(next_day (sysdate, 1)) +2/24 --每周一凌晨 2 点执行39.4:每月定时执行40.Interval =>TTRUXC(LAST_DAY(SYSDATE) +1) --每月 1 日凌晨0 点执41.Interval =>TRUXC(LAST_DAY(SYSDATE)) +1+1/24 —每月 1 日凌晨1点执行42.5:每季度定时执行43.Interval => TRUNC(ADD.MONTHS(SYSDATE, 3),' q') --每季度的第一天凌晨0点执行44.Interval => TRUNC(ADD_MO\THS(SYSDATE, 3)q') + 1/24 --每季度的第一天凌晨1点执行45.Interval => TRUNC(ADD_MOXTHS(SYSDATE+ 2/24,3),'q')-1/24 - -每季度的最后一天的晚上11点执行46.6:每半年定时执行47.Interval => ADD_MO\THS(trunc(sysddte, ' yyyy'), 6)+1/24 --每年7月1日和1月1日凌晨1点48.7:每年定时执行49.Interval 二〉ADD_MO\THS(trunc (sysdate, ' yyyy'), 12)+1/24 --每年1月1日凌晨1点执行50.50.相关方法:51.修改要执行的操作:dbms_job. what (jobno,1 sp_fact_charge_code;J );―修改某个job 名52.修改下次执行时间:dbms_job. next_date (job, next_date);53.修改间隔时间:dbms_job. interval (job, interval);54.停止job: dbms.broken (job, broken, nextdate):55.dbms_job・ broken (v_job, true, next_date); 一一停止——个job,里面参数true也可是false, next_date (某一时刻停止)也可是sysdate(立刻停止)。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
insert into job_table (run_time) values (sysdate);
end;
--3.创建job,并且指定为一分钟执行一次
--Sql代码
declare
job number;
begin
dbms_job.submit(job, 'job_proc;', sysdate, 'TRUNC(sysdate,''mi'') + 1 / (24*60)');
--用job
--oracle定时器调用存储过程
--1.创建一个表,为了能清楚看到定时器的运行情况我们创建一个带有日期字段的表
--Sql代码
create table job_table(run_time date);
--2.创建存储过程
--Sql代码
create or replace procedure job_proc is
/*参数介绍
job job的唯一标识,自动生成的
broken 是否处于运行状态,N;运行;Y:停止
what 存储过程名称
interval 定义的执行时间
补充:
描述 INTERVAL参数值
每天午夜12点 &9;
每天早上8点30分 ''TRUNC(SYSDATE + 1) + (8*60+30)/(24*60)''
每星期六和日早上6点10分 ''TRUNC(LEAST(NEXT_DAY(SYSDATE, ''''SATURDAY"), NEXT_DAY(SYSDATE, "SUNDAY"))) + (6×60+10)/(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''
end
commit;
--4.创建之后自动处于运行状态,我们查询job表,看看我们创建的job
--Sql代码
select job,broken,what,interval,t.* from user_jobs t;
--81 N job_proc; TRUNC(sysdate,'mi') + 1 / (24*60) ...