日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

oracle job 与存储过程,应用oracle job和存储过程

發(fā)布時(shí)間:2023/12/10 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 oracle job 与存储过程,应用oracle job和存储过程 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

每月新增數(shù)據(jù)百萬(wàn)多條,需要定期處理2個(gè)主要數(shù)據(jù)表(test_ad,test_pd),移動(dòng)非當(dāng)月數(shù)據(jù)到歷史表中保存

數(shù)據(jù)操作存儲(chǔ)過(guò)程如下:

MYPROC.prc

create or replace procedure MYPROC is

TableName_AD char(13);

TableName_PD char(13);

tmp_str varchar2(100);

tmp_str2 varchar2(100);

tmp_str3 varchar2(100);

tmp_str4 varchar2(100);

tmp_str5 varchar2(100);

tmp_str6 varchar2(100);

tmp_str7 varchar2(100);

tmp_str8 varchar2(100);

begin

--臨時(shí)表名賦值

if TableName_AD is null then

select 'PA_AD_'||to_char(add_months(sysdate,-1),'yyyymm') into TableName_AD from dual;

end if;

if TableName_PD is null then

select 'PA_PD_'||to_char(add_months(sysdate,-1),'yyyymm') into TableName_PD from dual;

end if;

--創(chuàng)建(test_ad)歷史表

tmp_str:='create table '||TableName_AD||' as select * from test_ad where patroldate

execute immediate tmp_str;

--創(chuàng)建(test_pd)歷史表

tmp_str2:='create table '||TableName_PD||' as select * from test_pd where patroldate

execute immediate tmp_str2;

--commit;

--創(chuàng)建本月數(shù)據(jù)臨時(shí)表

tmp_str3:='create table temp_ad as select * from test_ad Where patroldate > ='''||to_date(to_char(add_months(last_day(sysdate) +1,-1), 'yyyymmdd'),'yyyymmdd')||'''';

execute immediate tmp_str3;

tmp_str4:='create table temp_pd as select * from test_pd Where patroldate > ='''||to_date(to_char(add_months(last_day(sysdate) +1,-1), 'yyyymmdd'),'yyyymmdd')||'''';

execute immediate tmp_str4;

--刪除本月數(shù)據(jù)表(test_ad,test_pd)

tmp_str5:='drop TABLE test_ad';

execute immediate tmp_str5;

tmp_str6:='drop TABLE test_pd';

execute immediate tmp_str6;

--本月數(shù)據(jù)臨時(shí)表重命名表(test_ad,test_pd)

tmp_str7:='rename temp_ad to test_ad';

tmp_str8:='rename temp_pd to test_pd';

execute immediate tmp_str7;

execute immediate tmp_str8;

/*--刪除主數(shù)據(jù)表上非本月記錄

delete from test_ad where patroldate

--刪除歷史表本月記錄

delete from test_pd where patroldate

--刪除歷史表本月記錄

tmp_str2:='delete from '||tmp_TableName||' where patroldate>='||to_date(to_char(add_months(last_day(sysdate) +1,-1),'yyyymmdd'),'yyyymmdd');

execute immediate tmp_str2;

*/

--插入操作記錄

insert into oper_proc_log values(sysdate,'pc',0);

commit;

end MYPROC;

--=============注意!在存儲(chǔ)過(guò)程中使用CREATE或DROP需要顯示授權(quán)==========

--grant create table to user,grant drop any table to user

/

注:上面有一段被注釋的內(nèi)容,是最初的方案,但是后來(lái)了解到:刪除大量數(shù)據(jù),oracle并不釋放空間!所以用了現(xiàn)在的方案,復(fù)制創(chuàng)建表——>刪除表——>重命名。

以上存儲(chǔ)過(guò)程每月3號(hào)定期執(zhí)行

declare job1 number;

begin

--每月3號(hào)午夜12點(diǎn)執(zhí)行MYPROC

dbms_job.submit(job1,'MYPROC;',sysdate,'TRUNC(LAST_DAY(SYSDATE ) + 3)');

commit;

end;

為了補(bǔ)救意外導(dǎo)致3號(hào)午夜12點(diǎn)沒(méi)有執(zhí)行MYPROC

使用另外一個(gè)存儲(chǔ)過(guò)程驗(yàn)證MYPROC是否執(zhí)行

PASUPPLYPROC.prc

create or replace procedure PASUPPLYPROC is

isnull integer;

tmp_str varchar2(100);

begin

--取得本月執(zhí)行myproc次數(shù)

if isnull is null then

select count(*) into isnull from oper_proc_log

where oper_date>=to_date(to_char(add_months(last_day(sysdate) +1,-1), 'yyyymmdd'),'yyyymmdd');

end if;

--無(wú)本月執(zhí)行記錄則立即執(zhí)行myproc

if isnull=0 then

tmp_str:='begin myproc; end;';

execute immediate tmp_str;

commit;

end if;

end PASUPPLYPROC;

--=============注意!在存儲(chǔ)過(guò)程中使用CREATE或DROP需要顯示授權(quán)==========

--grant create table to user,grant drop table to user

/

第二個(gè)job定期執(zhí)行PASUPPLYPROC驗(yàn)證

declare job1 number;

begin

--每月15號(hào)午夜12點(diǎn)10分執(zhí)行PASUPPLYPROC

dbms_job.submit(job1,'PASUPPLYPROC;',sysdate,'TRUNC(LAST_DAY(SYSDATE) + 14) +(24*60+10)/(24*60)');

commit;

end;

DBA_JOBS

===========================================

字段(列)????????? 類型???????????????? 描述

JOB??????????????? NUMBER????????? 任務(wù)的唯一標(biāo)示號(hào)

LOG_USER?????????? VARCHAR2(30)??? 提交任務(wù)的用戶

PRIV_USER????????? VARCHAR2(30)??? 賦予任務(wù)權(quán)限的用戶

SCHEMA_USER??????? VARCHAR2(30)??? 對(duì)任務(wù)作語(yǔ)法分析的用戶模式

LAST_DATE????????? DATE??????????? 最后一次成功運(yùn)行任務(wù)的時(shí)間

LAST_SEC?????????? VARCHAR2(8)???? 如HH24:MM:SS格式的last_date日期的小時(shí),分鐘和秒

THIS_DATE ??? DATE??????????? 正在運(yùn)行任務(wù)的開始時(shí)間,如果沒(méi)有運(yùn)行任務(wù)則為null

THIS_SEC ??? VARCHAR2(8)???? 如HH24:MM:SS格式的this_date日期的小時(shí),分鐘和秒

NEXT_DATE????????? DATE??????????? 下一次定時(shí)運(yùn)行任務(wù)的時(shí)間

NEXT_SEC?????????? VARCHAR2(8)???? 如HH24:MM:SS格式的next_date日期的小時(shí),分鐘和秒

TOTAL_TIME???????? NUMBER????????? 該任務(wù)運(yùn)行所需要的總時(shí)間,單位為秒

BROKEN???????????? VARCHAR2(1)???? 標(biāo)志參數(shù),Y標(biāo)示任務(wù)中斷,以后不會(huì)運(yùn)行

INTERVAL?????????? VARCHAR2(200)?? 用于計(jì)算下一運(yùn)行時(shí)間的表達(dá)式

FAILURES??? NUMBER ??? 任務(wù)運(yùn)行連續(xù)沒(méi)有成功的次數(shù)

WHAT?????????????? VARCHAR2(2000) 執(zhí)行任務(wù)的PL/SQL塊

CURRENT_SESSION_LABEL RAW????????? MLSLABEL 該任務(wù)的信任Oracle會(huì)話符

CLEARANCE_HI????? RAW MLSLABEL???? 該任務(wù)可信任的Oracle最大間隙

CLEARANCE_LO????? RAW????????????? MLSLABEL 該任務(wù)可信任的Oracle最小間隙

NLS_ENV?????????? VARCHAR2(2000)?? 任務(wù)運(yùn)行的NLS會(huì)話設(shè)置

MISC_ENV????????? RAW(32)????????? 任務(wù)運(yùn)行的其他一些會(huì)話參數(shù)

描述??????????????????? INTERVAL參數(shù)值 每天午夜12點(diǎn)??????????? 'TRUNC(SYSDATE + 1)' 每天早上8點(diǎn)30分???????? 'TRUNC(SYSDATE + 1) + (8*60+30)/(24*60)' 每星期二中午12點(diǎn)???????? 'NEXT_DAY(TRUNC(SYSDATE ), ''TUESDAY'' ) + 12/24' 每個(gè)月第一天的午夜12點(diǎn)??? 'TRUNC(LAST_DAY(SYSDATE ) + 1)' 每個(gè)季度最后一天的晚上11點(diǎn) 'TRUNC(ADD_MONTHS(SYSDATE + 2/24, 3 ), 'Q' ) -1/24' 每星期六和日早上6點(diǎn)10分??? 'TRUNC(LEAST(NEXT_DAY(SYSDATE, ''SATURDAY"), NEXT_DAY(SYSDATE, "SUNDAY"))) + (6×60+10)/(24×60)'

總結(jié)

以上是生活随笔為你收集整理的oracle job 与存储过程,应用oracle job和存储过程的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。