有個需求,就是每天從一個表中提取出特定數據,保存到另一個表中。才疏學淺,最初想用Oracle的觸發器可以實現,翻開課本之后才發現觸發器不是用來干這個的。於是用Java的Quartz框架編寫代碼實現了這個需求。完成之后又想用數據庫實現,翻了下課本,找了些教程,發現網上都是用PL/SQL DEV工具編寫腳本實現的。我的電腦上只有Oracle SQL Developer工具,經過一陣折騰,最終也實現了。
個人感覺用SQL Developer的圖形化工具可以很方便的實現創建存儲過程,定時作業的任務。相比較於PL/SQL,這個的學習成本更低一些,不需要知道那么多的腳本命令。
記錄下步驟。
1.獲取昨天一天的所有數據
select pk_information,problemno,problemname,productid,partno,createUser,createTime,dutygroup,dutyuser,batch,problemtype,emergencydegree from brsj_kms_problem where createtime between to_char(sysdate-1,'yyyy-mm-dd') and to_char(sysdate,'yyyy-mm-dd');
2.將查詢到的數據插入到對應的表中
insert into brsj_kms_distributeproblem ( pk_information ,problemno ,problemname ,productid ,partno ,createUser ,createTime ,dutygroup ,dutyuser ,batch ,problemtype ,emergencydegree ) select pk_information,problemno,problemname,productid,partno,createUser,createTime,dutygroup,dutyuser,batch,problemtype,emergencydegree from brsj_kms_problem where createtime between to_char(sysdate-1,'yyyy-mm-dd') and to_char(sysdate,'yyyy-mm-dd');
這里特別說明一下,第一個括號后面沒有values關鍵字,加上values關鍵字執行就會報錯,錯誤的表達式。
3.測試上面的SQL語句無誤后,開始創建存儲過程
create procedure ScheduledTasks is begin insert into brsj_kms_distributeproblem ( pk_information ,problemno ,problemname ,productid ,partno ,createUser ,createTime ,dutygroup ,dutyuser ,batch ,problemtype ,emergencydegree ) select pk_information,problemno,problemname,productid,partno,createUser,createTime,dutygroup,dutyuser,batch,problemtype,emergencydegree from brsj_kms_problem where createtime between to_char(sysdate-1,'yyyy-mm-dd') and to_char(sysdate,'yyyy-mm-dd'); COMMIT; EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('Exception happened,data was rollback'); ROLLBACK; END;
創建好了之后,刷新一下,在左側的過程文件夾中就可以看到對應的過程名稱,檢查圖標上是否有紅叉,如果有,說明語句錯誤,重新檢查哪里出錯。如果沒有錯誤,直接右擊,選擇運行,運行成功后,可以查看對應的表中是否成功插入了數據,需要注意的是要確保執行過程的SQL語句邏輯上是能產生數據的,例如查詢昨日的所有記錄,如果昨日沒有數據產生,即便SQL語句無誤也不會產生結果,所以需要提前添加一些測試數據,確保能看到結果。
運行到這里,能看到新產生的數據,說明創建的過程是沒有問題的,接下來就是如何每天讓它運行一次的問題了。
4.定時執行存儲過程
打開項目列表-->調度程序-->作業,右擊新建作業。
打開編輯作業窗口后,就可以在這里設定參數了。
作業名隨便起一個,已啟用可以先不打勾,創建好后選擇啟用也可以的。
說明里可以加漢字做一些介紹。
作業類用默認的。
作業類型里面選擇存儲過程,方案選擇默認,打開過程下拉框,就可以看到我們之前創建好的存儲過程,把它選上。
右邊何時執行作業就是選擇頻率了,可以根據自己的需求選擇執行一次還是每天執行,重復時間間隔里面可以詳細選擇每年、每月、每天、每時等詳細參數。選好之后會自動生成代碼。
開始時間和結束時間也可以按自己的需求進行選擇。
選好之后點擊應用,作業就創建好了,如果剛才選擇了已啟用,這時候作業已經開始運行了。如果剛才沒選啟用,在創建好的作業上右擊,選擇啟用,也會開始運行。
設置一個合理的運行頻率和運行時間進行測試是否運行正確,無誤之后再修改頻率和時間為真正運行的頻率和時間。至此,所有過程全部完成了。
網上用的都是PL/SQL里面創建Job,需要寫一大堆命令,這個比較簡單,圖形化工具創建定時任務,不容易出錯。個人感覺Oracle的這個SQL Developer工具還是很強大的,功能很豐富,很多東西都可以用圖形界面創建出來。