Crontab定時執行Oracle存儲過程
需求描述
我們有一個Oracle的存儲過程,里面是每個月需要執行一下,生成報表,然后發送給業務部門,這一個功能我們有實現在系統的前台界面(如圖1-1),但是客戶每次都不點重新生成,導致導出報表時報出異常(如圖1-2)。
圖1-1
圖1-2
問題分析
既然它是一個存儲過程,我們定位到了該請求相對應的存儲過程,如下圖所示
圖1-3
我們看它的參數,只有兩個,一個是開始時間,表示當月的開始時間,一個時結束時間,表示當月結束時間,我們只要在腳本執行它的時候傳一個參數給它就可以。
問題解決
想要解決這個問題,我的想法是這樣,把需要處理的所有邏輯寫在腳本里,然后設定一個Crontab,通過定時任務去執行。
一,首先看單純在plsql是如何調用這個存儲過程的,我通過定義一個startdate和enddate,然后通過Oracle的時間函數last_day計算出每月的最后一天,開始的第一天我是直接在月份拼接了'01',至於為什么add_months(sysdate,-1)要-1,是因為當月的一般執行上個月的。
declare
startdate varchar2(8);
enddate varchar2(8);
begin
select to_char(add_months(sysdate,-1),'YYYYMM')||'01'
into startdate from dual;
select to_char(last_day(add_months(sysdate,-1)),'YYYYMMDD')
into enddate from dual;
proc_high_settle_rep_month(startdate,enddate);
end;
/
二,把上述的邏輯寫入到sh腳本中,我們在相關的路徑新建一個文件call_proc_high_settle_rep_month.sh,通過執行sqlplus,然后去執行上述的內容
腳本內容如下:
其中sqlplus中的zh表示數據庫賬戶名,*表示密碼,zh10g表示數據庫實例名,是你配置在tnsnames.ora的連接名。
. /issdata/application/appiss/.profile
echo "get begging"
date
sqlplus zh/*****@zh10g <<!
declare
startdate varchar2(20);
enddate varchar2(20);
begin
select to_char(add_months(sysdate,-1),'YYYYMM')||'01'
into startdate from dual;
select to_char(last_day(add_months(sysdate,-1)),'YYYYMMDD')
into enddate from dual;
proc_high_settle_rep_month(startdate,enddate);
end;
/
!
echo "get Finished"
三、手工執行了這個腳本,發現沒錯誤,可以執行。
sh call_proc_high_settle_rep_month.sh
我們添加到crontab中,crontab -e進入crontab編輯,注意腳本要寫絕對路徑
08 23 5 * * sh /tmp/call_proc_high_settle_rep_month.sh
上述的crontab就代表每月的5號的23:08分就會執行這個命令。
上面的08 23 5 * * 依次代表分、時、日、月、周。
至此,整個程序已經實現好所有的邏輯,以后就算以后業務部分不點,也可以導出生成基礎數據,報出報表了。