十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
工作中,我们使用的数据库大部分是oracle、mysql、db2、sql server等数据库,在使用oracle最匹配的工具plsql的时候,如果用plsql创建定时器呢看下面我简单介绍使用工具创建定时器的方法。
创新互联建站主要从事网页设计、PC网站建设(电脑版网站建设)、wap网站建设(手机版网站建设)、成都响应式网站建设、程序开发、网站优化、微网站、成都微信小程序等,凭借多年来在互联网的打拼,我们在互联网网站建设行业积累了丰富的网站制作、成都网站设计、网站设计、网络营销经验,集策划、开发、设计、营销、管理等多方位专业化运作于一体。
在项目中,经常会遇到需要定时完成的任务,比如定时更新数据,定义统计数据生成报表等等,其实这些事情都可以使用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所以费了很大的功夫才发现这个问题。完整的Sql就是SQL select ’tbl_programme_’ || to_char(sysdate, ’yyyymmdd’) from dual;’TBL_PROGRAMME_’||TO_CHAR(SYSD------------------------------tbl_programme_20090214接下来就是创建表的代码了,因为新表需要tbl_programme保持一致,所以直接CTAS来创建表那是非常适合的了,代码如下:Create table tablename as select * from tbl_programme如果需要指定一个TableSpace则将该SQL做适当修改:Create table tablename tablespace p2p as select * from tbl_programme所以整个创建存储过程的SQL就是create or replace procedure sp_createtab_tbl_programmeAuthid Current_Userastabname varchar(200);beginselect ’TBL_PROGRAMME_’ || to_char(sysdate, ’yyyymmdd’) into tabname from dual;--create table tabname as select * from tbl_programme where 1 != 1;execute immediate ’create table ’ || tabname ||’ tablespace p2p as select * from tbl_programme where 1 != 1’;commit;end;/这里还需要注意一下在Oracle里面如果要对一个变量赋值的话有两种方式:(1) 使用:=进行赋值(2) 使用select ‘xjkxj ’ into 变量名称 from tabname另外,在存储过程中定义变量的时候一般放在as/is后begin前面。在存储过程一般是不能直接使用create table,truncate table这类似的语句的,如果要使用这些语句必须使用excute immediate + 所要执行的sql语句来实现。注意上面用红色标志的语句:Authid Current_User这个语句比较重要,如果我们在创建存储过程的时候不添加这条语句执行该存储过程将不会成功,原因是默认情况向存储过程是没有Create table等权限的,即使当前用户有DBA的权限也不行,如果存储过程中存在创建表的操作,可以有以下两种方式来解决该问题。(1) 显示的赋予该用户Create table的权限,grant create table to user.(2) 在存储过程中使用Authid Current_User 标识使用当前用户的权限。第二步:创建JOB创建JOB就比较简单了,下面就是创建JOB的代码每天晚上1电job启动一次,执行sp_createtab_tbl_programme存储过程。VARIABLE testjobid number;beginsys.dbms_job.submit(:testjobid,’sp_createtab_tbl_programme;’,trunc(sysdate+1)+1/24,’trunc(sysdate+1)+1/24’);commit;end;/这里需要注意的是,在submit方法的前面一定要先定义job这个变量,另外,submit方法的第二个参数是一个存储过程的名,记得在后面添加“:”号,在next_date是一个时间类型变量而不是一个字符串,所以需要注意不要把它当成字符串,不需要对该参数加引号。最后一个参数interval是一个字符串类型,记得添加引号。最常见的错误如下图所示:ORA-01008: not all variables bound就是没有定义变量的意思。一定记的在使用submit方法时定义jobid变量。下面是常有的设置Interval的方法:2 每天固定时间运行,比如早上8:10分钟:Trunc(Sysdate+1) + 8/24�0�5 每天:trunc(sysdate+1)�0�5 每周:trunc(sysdate+7)�0�5 每月:trunc(sysdate+30)�0�5 每个星期日:next_day(trunc(sysdate),’SUNDAY’)�0�5 每天6点:trunc(sysdate+1)+6/24�0�5 半个小时:sysdate+30/1440需要用到的完整SQL如下:------------------------------------------------------- Export file for user P2P ---- Created by Administrator on 2009-2-14, 15:45:18 -------------------------------------------------------spool gjgdp2p(v1.3).logpromptprompt Creating procedure SP_CREATETAB_TBL_PROGRAMMEprompt =============================================promptcreate or replace procedure sp_createtab_tbl_programmeAuthid Current_Userastabname varchar(200);beginselect ’TBL_PROGRAMME_’ || to_char(sysdate, ’yyyymmdd’) into tabname from dual;--create table tabname as select * from tbl_programme where 1 != 1;execute immediate ’create table ’ || tabname ||’ tablespace p2p as select * from tbl_programme where 1 != 1’;commit;end;/VARIABLE testjobid number;beginsys.dbms_job.submit(:testjobid,’sp_createtab_tbl_programme;’,trunc(sysdate+1)+1/24,’trunc(sysdate+1)+1/24’);commit;end;/spool off
用job,具体用法:
declare
n_job binary_integer;
begin
dbms_job.submit(n_job, '你要执行的东西', sysdate, TRUNC(LAST_DAY(SYSDATE))+4+2/24);
end;
-- 每月4号执行
dbms_job.submit(n_job_01,'你调的东西',sysdate,'TRUNC(LAST_DAY(SYSDATE))+4+2/24');
-- 每分钟执行一次
dbms_job.submit(n_job_01,'你调的东西',sysdate,'TRUNC(sysdate,’mi’) + 1 / (24*60)');
-- 凌晨两点执行
dbms_job.submit(n_job_01,'你调的东西',sysdate,'TRUNC(sysdate) + 1 + 2/24');
-- 每周一凌晨2点执行 周一是每周的第二天next_day(sysdate,2)同理周二是第三天,next_day(sysdate,3)
dbms_job.submit(n_job_01,'你调的东西',sysdate,'TRUNC(next_day(sysdate,2))+2/24');
-- 每月1日凌晨两点执行
dbms_job.submit(n_job_01,'你调的东西',sysdate,'TRUNC(LAST_DAY(SYSDATE))+1+2/24');
-- 每季第一天凌晨两点执行
dbms_job.submit(n_job_01,'你调的东西',sysdate,'TRUNC(ADD_MONTHS(SYSDATE,3),'Q') + 2/24');
-- 每年7月1日和1月1日凌晨2点
dbms_job.submit(n_job_01,'你调的东西',sysdate,'ADD_MONTHS(trunc(sysdate,'yyyy'),6)+2/24');
-- 每年1月1日凌晨2点执行
dbms_job.submit(n_job_01,'你调的东西',sysdate, 'Add_months(trunc(sysdate,'yyyy'), 12) +2/24');
两种方法
1。oracle中有 [作业] 功能,创建一个作业,然后,设置定时执行。
2。用系统的[定时任务],定一个时间,然后调用bat文件,从bat中调用oracle的存储过程。