oracle存储过程定时执行
1. 想请教一下如何用oracle 中JOB实现定时存储过程。
如果是10g的话就用scheler来代替job吧,比job稳定多了。
先解释一下基础概念,scheler 包含了以下几个实体对象
Program -- 提供了scheler 将要运行什么,包含program name,program type(PLsql块、存储过程、外部程序),program action(具体的程序实体,比如说一个PLSQL块、或者是存储过程的名称、或者是外部程序的路径加名称) 。
Scheles -- 指定何时何种频率来运行job,可以被不同的job重复的利用。比如说我有两个job都要求在每天的凌晨4点运行,那么两个job可以同时指定相同的schele。
Jobs -- 具体的作业的名称,依赖于那个program、schele。也可以不指定program、schele,而直接写入program、schele的相应参数。
Chains -- 把一组program像一个单独的实体连接在一起,作为一个对象。Job可以指向Chains代替单一的program 。这样就能完成类似如下功能:运行A,然后运行B,当A、B都运行成功则运行C,否则运行D。
下面参考文档边看边做。
1.创建一张表 create table scheler_test(id number,instime date);
2.创建一个存储过程,实现往表中插入资料。
create or replace procere p_insSysdate as
id number;
begin
select count(*) into id from scheler_test;
insert into scheler_test values(id,sysdate);
commit;
end;
/
3.创建一个schele,这个仅仅是一个时间上的安排,由DBMS_SCHEDULER.CREATE_JOB调用。这样就可以重用schele,并且schele在时间的安排上强大与原先的JOB 。语法如下:
BEGIN
SYS.DBMS_SCHEDULER.CREATE_SCHEDULE
(
schele_name => 'SCOTT.EVERY_MINUTE'
,start_date => NULL
,repeat_interval => 'FREQ=MINUTELY'
,end_date => NULL
,comments => NULL
);
END;
/
以下给出部分repeat_interval的写法实例,以供参考
EVERY DAY 'FREQ=DAILY;INTERVAL=1'
EVERY MINUTE 'FREQ=MINUTELY;INTERVAL=1'
EVERY 4 HOURS ON THE HOUR 'FREQ=HOURLY;INTERVAL=4;BYMINUTE=0;BYSECOND=0'
1st DAY OF EVERY MONTH 'FREQ=DAILY;BYMONTHDAY=1'
WEEKDAYS AT 7am and 3pm 'FREQ=DAILY; BYDAY=MON,TUE,WED,THU,FRI; BYHOUR=7,15; BYMINUTE=0;BYSECOND=0'
4.创建DBMS_SCHEDULER.CREATE_PROGRAM,指定运行什么样的程序。
BEGIN
SYS.DBMS_SCHEDULER.CREATE_PROGRAM
(
program_name => 'SCOTT.PRG_INSSYSDATE'
,program_type => 'STORED_PROCEDURE'
,program_action => 'p_insSysdate'
,number_of_arguments => 0
,enabled => TRUE
,comments => NULL
);
END;
/
2. oracle定时执行怎么执行多个存储过程
定时执行存储过程,需要在job里定义;而执行多个存储过程,则在job中定义多次即可。
运行环境:oracle 10g
1、定义其中一个job
declare
jobnonumber;
begin
dbms_job.submit(11,
what=>'pro_bdc_bh(
to_char(add_months(trunc(sysdate),-1),''yyyy''),
to_char(add_months(trunc(sysdate),-1),''MM''),
''true''
);',
next_date=>sysdate,
Interval=>'TRUNC(sysdate)+1+2/(24)');
commit;
end;
注意:其中pro_bdc_bh为存储过程名称,TRUNC(sysdate) + 1 +2 / (24)为定义的运行时间为每日凌晨2点。
2、然后定义另外一个job
declare
jobnonumber;
begin
dbms_job.submit(11,
what=>'p_test(
to_char(add_months(trunc(sysdate),-1),''yyyy''),
to_char(add_months(trunc(sysdate),-1),''MM''),
''true''
);',
next_date=>sysdate,
Interval=>'TRUNC(sysdate)+1+2/(24)');
commit;
end;
注意:这次运行的存储过程名为p_test,运行时间同样为每日凌晨2点。
3、创建job完成后,可通过具有创建job的账号查询创建是否成功,语句如下:
select*fromuser_jobs;
3. 如何使用oracle存储过程执行外部的sql脚本文件
你把脚本内容直接在存储过程中实现,然后利用job去定时调度就好了。
4. oracle 添加一个计划任务 每天凌晨两点 定时执行一个存储过程 求详细步骤!!急!!
在你的存储过程里面定义一个变量:
v_HH24 CHAR(2) := '00';
begin后面给变量赋值:
v_HH24 := to_char(sysdate, 'HH24');
然后在你执行的代码外羡友核面加上:
IF v_HH24 = '02'兄掘 THEN
你的代码;
end if;
然告游后使用下面的脚本创建job:
begin
sys.dbms_job.submit(job => :job,
what => '你的存储过程名字;',
next_date => to_date('01-06-2013 00:00:00', 'dd-mm-yyyy hh24:mi:ss'),
interval => 'SYSDATE+60/1440');
commit;
end;
/
5. 有A,B两个表,再建一个C表把A,B表中的一些字段保存在C表中每月定时保存,用oracle怎么写存储过程
A表和B的user_id是不是相同的主键,是的话就可以用一下的语句
CREATE OR REPLACE PROCEDURE get_A_B_to_C
BEGIN
insert to c (user_id,need_pay) select a.userid_id,b.need_pay from (selet user_id from A)a,(select user_id,need_pay from B)b where a.user_id=b.user_id and a.user_id not in user_id
END get_A_B_to_C
你想每个月执行就要见一个作业调用存储过程 也就是JOB。
不要用select xx into xx from table
这个语句第一次执行的时候可以,第二次就会报此表已经建立 不能重复建立。
6. 各位大神们,我想在oracle后台执行多个存储过程,请问要怎么做呢
你是需要定时执行吗?你说的后台执行应该就是存储过程自动执行吧:
1、定时执行你可以创建job,可以定时每个多久执行一次存储过程(job中可以执行多个存储过程,只需要使用‘;’隔开);
2、你可以将你所有的存储过程打包(pkg);
7. Oracle中如何定时执行一条SQL语句
通过网上查询,找到一种方案,就是先在oracle里面对要定时的sql写成存储过程,再用DBMS_scheler对存储过程进行定时执行。
在数据库中新建了一个表MY_JOB_TEST
在数据库中新建了一个表MY_JOB_TEST
在数据库中新建了一个表MY_JOB_TEST
在PLSQL中,执行下面语句模拟存储过程的调用,执行后要点提交才有反应
[sql] view plain
BEGIN
INSERTINTOMY_JOB_TEST(NUM)VALUES(1);
END;
GrantCreateJobTo指定用户名
SQL>CREATEORREPLACEPROCEDURE
JOB_TEST
BEGIN
INSERTINTOMY_JOB_TEST(NUM)VALUES(1);
END;
- (此处要执行存储过程不能用exec JB_TEST,这种执行方式只能在命令行中使用)
SQL>BEGIN
DBMS_SCHEDULER.CREATE_JOB(
job_name=>'SCHEDULER_TEST',
job_type=>'STORED_PROCEDURE',
job_action=>'JOB_TEST',
start_date=>sysdate,
repeat_interval=>'FREQ=MINUTELY;INTERVAL=1');
END;
- 但是这样子定时任务并不会执行。
SQL>SELECT*FROMUSER_SCHEDULER_JOBS;
- 此时我们可以看到enable的状态是false的,因此我们需要去启动定时任务
SQL>BEGIN
DBMS_SCHEDULER.ENABLE('SCHEDULER_TEST');
然后下面建立一个存储过程JOB_TEST
(注意,这里用户需要CREATE JOB权限,可以用超级管理员用户执行下面语句给指定用户赋予该权限)
[sql] view plain
[sql] view plain
使用DBMS_SCHEDULER进行定时,这里为每分钟执行一次
[sql] view plain
我们可以用下面的命令查看一下scheler的状态
[plain] view plain
[plain] view plain
dbms_scheler.enable('j_test'); --启用jobs
dbms_scheler.disable('j_test'); --禁用jobs
dbms_scheler.run_job('j_test'); --执行jobs
dbms_scheler.stop_job('j_test'); --停止jobs
dbms_scheler.drop_job('j_test'); --删除jobs
然后再查询job的enable装态,发现为true了。
然后查看MY_JOB_TEST表,发现每分钟会往里面添加记录。
当需要修改定时任务或者调度的其他属性时,可以用下面的
dbms_scheler.set_attribute('调度名','调度属性','调度值');
至此,定时任务完成。