1.create table test(id int,starttime date,state int);
隆堯網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)!從網(wǎng)頁設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、響應(yīng)式網(wǎng)站建設(shè)等網(wǎng)站項(xiàng)目制作,到程序開發(fā),運(yùn)營維護(hù)。創(chuàng)新互聯(lián)于2013年開始到現(xiàn)在10年的時(shí)間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選創(chuàng)新互聯(lián)。
2.create or replace procedure sp_update is
cursor cur is select * from test where state=0;
v_id int;
v_starttime date;
v_state int;
begin
open cur;
loop
fetch cur into v_id,v_starttime,v_state;
exit when cur%notfound;
update test set state=1 where starttime=sysdate;
commit;
end loop;
close cur;
end;
/
3.創(chuàng)建JOB
SQL variable job1 number;
SQL
SQL begin
2 dbms_job.submit(:job1,sp_update;',sysdate,'sysdate+1/1440'); --每天1440分鐘,即一分鐘運(yùn)行sp_update過程一次
3 end;
4 /
PL/SQL 過程已成功完成。
運(yùn)行JOB
SQL begin
2 dbms_job.run(:job1);
3 end;
4 /
用job
oracle定時(shí)器調(diào)用存儲(chǔ)過程
1、創(chuàng)建一個(gè)表,為了能清楚看到定時(shí)器的運(yùn)行情況我們創(chuàng)建一個(gè)帶有日期字段的表
Sql代碼 ?
create table job_table(run_time date); ?
create table job_table(run_time date);
2、創(chuàng)建存儲(chǔ)過程
Sql代碼 ?
create or replace procedure job_proc is ?
begin
insert into job_table (run_time) values (sysdate); ?
end; ?
create or replace procedure job_proc is
begin
insert into job_table (run_time) values (sysdate);
end;
3、創(chuàng)建job,并且指定為一分鐘執(zhí)行一次
Sql代碼 ?
declare
job number; ?
begin
dbms_job.submit(job, 'job_proc;', sysdate, 'TRUNC(sysdate,''mi'') + 1 / (24*60)'); ?
end/ ?
commit; ?
declare
job number;
begin
dbms_job.submit(job, 'job_proc;', sysdate, 'TRUNC(sysdate,''mi'') + 1 / (24*60)');
end/
commit;
4.創(chuàng)建之后自動(dòng)處于運(yùn)行狀態(tài),我們查詢job表,看看我們創(chuàng)建的job
Sql代碼 ?
select job,broken,what,interval,t.* from user_jobs t; ?
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
oracle定時(shí)器調(diào)用存儲(chǔ)過程
創(chuàng)建一個(gè)表,為了能清楚看到定時(shí)器的運(yùn)行情況我們創(chuàng)建一個(gè)帶有日期字段的表
Sql代碼 ?
create table job_table(run_time date); ?
create table job_table(run_time date);
2.創(chuàng)建存儲(chǔ)過程
Sql代碼 ?
create or replace procedure job_proc is ?
begin
insert into job_table (run_time) values (sysdate); ?
end; ?
create or replace procedure job_proc is
begin
insert into job_table (run_time) values (sysdate);
end;
3.創(chuàng)建job,并且指定為一分鐘執(zhí)行一次
Sql代碼 ?
declare
job number; ?
begin
dbms_job.submit(job, 'job_proc;', sysdate, 'TRUNC(sysdate,''mi'') + 1 / (24*60)'); ?
end/ ?
commit; ?
declare
job number;
begin
dbms_job.submit(job, 'job_proc;', sysdate, 'TRUNC(sysdate,''mi'') + 1 / (24*60)');
end/
commit;
4.創(chuàng)建之后自動(dòng)處于運(yùn)行狀態(tài),我們查詢job表,看看我們創(chuàng)建的job
Sql代碼 ?
select job,broken,what,interval,t.* from user_jobs t; ?
select job,broken,what,interval,t.* from user_jobs t;
job broken what interval ...
81 N job_proc; TRUNC(sysdate,'mi') + 1 / (24*60) ...
oracle定時(shí)更新(JOBS)
rm.pro_hrm_emp_info_job過程
需要每天都更新,所以先創(chuàng)建個(gè)procedure,再創(chuàng)建個(gè)job就可以實(shí)現(xiàn)定時(shí)更新
create or replace procedure rm.pro_hrm_emp_info_job is
zm
begin
update rm.hrm_emp_info
set ages = to_number(TRUNC(nvl((sysdate brith_date) / 365, 0))),
leng_serv = to_number(TRUNC(nvl((sysdate work_date) / 365, 0))),
ins_len_ser = to_number(TRUNC(nvl((sysdate ente_appe_date) / 365,
0)));
commit;
end pro_hrm_emp_info_job;
相應(yīng)的`job
declare
jobno number;
begin
dbms_job.submit(jobno,’rm.pro_hrm_emp_info_job;’,trunc(sysdate),’trunc(sysdate)+1’);每天零點(diǎn)更新
commit;
end;
/
分解下job
dbms_job.submit(jobno, job號,由sys.jobseq生成
’rm.pro_hrm_emp_info_job;’, 要執(zhí)行的procedure
trunc(sysdate), 下次要執(zhí)行的時(shí)間
’trunc(sysdate)+1’); 每次間隔的時(shí)間,此處的1標(biāo)識一天 也可1/1440每一分鐘執(zhí)行一次
查看
select * from sys.user_jobs;
其中創(chuàng)建的jobno(任務(wù)號)由sys.jobseq序列生成
主由packages中的sys.dbms_job執(zhí)行
細(xì)節(jié)可以查看sys.dbms_job包內(nèi)容。 ;
1、創(chuàng)建數(shù)據(jù)庫日志表導(dǎo)出為文本文件的腳本tabout.ctl或tabout.sql
注意:該日志導(dǎo)出后在c:\HttpLog目錄下
tabout.ctl腳本內(nèi)容如下:
SET NEWPAGE NONE
SET HEADING OFF
SET TERM OFF
SET SPACE 0
SET PAGESIZE 0
SET TRIMOUT ON
SET TRIMSPOOL ON
SET LINESIZE 2500
set feedback off
set echo off
SET VERIFY OFF
column v_date new_value filename;
select to_char(sysdate,'yyyymmdd') || '.log' v_date from dual;
spool ..\HttpLog\filename ? ? ? ? ? ?
select id||','||name from orcluser.test;
spool off;
exit;
2、創(chuàng)建調(diào)用該腳本的logout.bat文件
logout.bat內(nèi)容如下:
mkdir ..\HttpLog\
C:\oracle\ora92\bin\sqlplus orcluser/orcl @C:Oracleout.ctl
說明:該bat文件直接在當(dāng)前目錄下創(chuàng)建名為HttpLog的文件夾,以便tabout.ctl腳本輸出的文件存放到該目錄下。其通過調(diào)用Oracle中sqlplus可執(zhí)行文件來執(zhí)行tabout.ctl腳本,所以該文件直接雙擊即可運(yùn)行,無需其他操作。
3、通過windows定時(shí)任務(wù)實(shí)現(xiàn)自動(dòng)定期執(zhí)行
“在控制面板——任務(wù)計(jì)劃——添加任務(wù)計(jì)劃”中建立定期將數(shù)據(jù)庫中日志表數(shù)據(jù)導(dǎo)出為文本格式(如:你可以根據(jù)需求設(shè)置為每天對日志表數(shù)據(jù)進(jìn)行導(dǎo)出)。根據(jù)你當(dāng)前對日志文件路徑的存儲(chǔ)需求,修改上面兩個(gè)腳本中的存儲(chǔ)路徑,在windows定時(shí)任務(wù)直接調(diào)用logout.bat文件執(zhí)行即可。
Oracle定時(shí)任務(wù)是在oracle系統(tǒng)中一個(gè)非常重要的子系統(tǒng),運(yùn)用得當(dāng),可以大大提高我們系統(tǒng)運(yùn)行和維護(hù)能力。oracle定時(shí)任務(wù)的功能,可以在指定的時(shí)間點(diǎn)自行執(zhí)行任務(wù)。
那么在實(shí)際工作中,什么樣的場景會(huì)用到定時(shí)任務(wù)呢?下面是在實(shí)際工作中用到的真實(shí)業(yè)務(wù)場景舉例
上面是通過腳本創(chuàng)建,當(dāng)然也可以通過plsql圖形化工具來創(chuàng)建,具體創(chuàng)建過程如下
**系統(tǒng)會(huì)自動(dòng)分配一個(gè)任務(wù)號jobno ** ,根據(jù)jobno 可以進(jìn)行如下定時(shí)任務(wù)操作
查詢結(jié)果如下
其中broken = N 表示該job已經(jīng)生效
我們再來查看目標(biāo)表中有沒有定時(shí)插入數(shù)據(jù)
可以看到,定時(shí)一分鐘插入了一條數(shù)據(jù)。
1、根據(jù)jobno,執(zhí)行以下腳本可以停止job
再來查看定時(shí)任務(wù)是否停用成功
我們發(fā)現(xiàn)BROKEN=Y 說明定時(shí)任務(wù)已經(jīng)停止成功了
BROKEN = N ,剛才的定時(shí)任務(wù)又啟動(dòng)了
下面總計(jì)了一些定時(shí)任務(wù)中常用的運(yùn)行時(shí)間
通過網(wǎng)上查詢,找到一種方案,就是先在oracle里面對要定時(shí)的sql寫成存儲(chǔ)過程,再用DBMS_scheduler對存儲(chǔ)過程進(jìn)行定時(shí)執(zhí)行。
在數(shù)據(jù)庫中新建了一個(gè)表MY_JOB_TEST
在數(shù)據(jù)庫中新建了一個(gè)表MY_JOB_TEST
在數(shù)據(jù)庫中新建了一個(gè)表MY_JOB_TEST
在PLSQL中,執(zhí)行下面語句模擬存儲(chǔ)過程的調(diào)用,執(zhí)行后要點(diǎn)提交才有反應(yīng)
[sql] view plain copy
BEGIN
INSERT?INTO?MY_JOB_TEST?(NUM)?VALUES?(1);
END;
然后下面建立一個(gè)存儲(chǔ)過程JOB_TEST
(注意,這里用戶需要CREATE JOB權(quán)限,可以用超級管理員用戶執(zhí)行下面語句給指定用戶賦予該權(quán)限)
[sql] view plain copy
Grant?Create?Job?To?指定用戶名
[sql] view plain copy
SQLCREATE?OR?REPLACE?PROCEDURE
JOB_TEST
BEGIN
INSERT?INTO?MY_JOB_TEST?(NUM)?VALUES?(1);
END;
(此處要執(zhí)行存儲(chǔ)過程不能用exec JB_TEST,這種執(zhí)行方式只能在命令行中使用)
使用DBMS_SCHEDULER進(jìn)行定時(shí),這里為每分鐘執(zhí)行一次
[sql] view plain copy
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;
但是這樣子定時(shí)任務(wù)并不會(huì)執(zhí)行。
我們可以用下面的命令查看一下scheduler的狀態(tài)
[plain] view plain copy
SQLSELECT?*?FROM?USER_SCHEDULER_JOBS;
此時(shí)我們可以看到enable的狀態(tài)是false的,因此我們需要去啟動(dòng)定時(shí)任務(wù)
[plain] view plain copy
SQLBEGIN
DBMS_SCHEDULER.ENABLE('SCHEDULER_TEST');
END
dbms_scheduler.enable('j_test'); ?--啟用jobs ??
dbms_scheduler.disable('j_test'); ?--禁用jobs ? ?
dbms_scheduler.run_job('j_test'); ?--執(zhí)行jobs ? ?
dbms_scheduler.stop_job('j_test'); ?--停止jobs ??
dbms_scheduler.drop_job('j_test'); ?--刪除jobs ?
然后再查詢job的enable裝態(tài),發(fā)現(xiàn)為true了。
然后查看MY_JOB_TEST表,發(fā)現(xiàn)每分鐘會(huì)往里面添加記錄。
當(dāng)需要修改定時(shí)任務(wù)或者調(diào)度的其他屬性時(shí),可以用下面的
dbms_scheduler.set_attribute('調(diào)度名','調(diào)度屬性','調(diào)度值');
至此,定時(shí)任務(wù)完成。