1.創建存儲過程(如果是沒有參數的存儲過程(V_PARAM IN VARCHAR) 這部分是需要刪除。
CREATE OR REPLACE PROCEDURE PROCNAME(V_PARAM IN VARCHAR) AS
---定義變量
V_CODE VARCHAR2(100);
V_SUM_CNT NUMBER(22);
V_BEGIN_TIME DATE;
V_END_TIME DATE;
V_SQL VARCHAR2(512);
V_HOUR NUMBER;
----定義遊標
Cursor jobcursor is select DEPT FROM TABLE_NAME1;
BEGIN
---變量初始化
V_CODE := 'TEST'||V_REGION;
V_BEGIN_TIME := SYSDATE-1;
V_END_TIME := SYSDATE ;
V_HOUR :=0;
--獲取當前分鐘數,賦給變量V_HOUR
SELECT TO_CHAR(SYSDATE,'HH24') INTO V_HOUR FROM DUAL;
------遊標的遍歷
for job in jobcursor LOOP
DBMS_OUTPUT.PUT_LINE(job.job);;
end LOOP;
-----------調用sql變量的執行方式。
V_SQL := 'SELECT /*+ PARALLEL(A ,16) */ COUNT(*) FROM '||V_CODE ||'.TABLE_LOG A
where logtime BETWEEN :V_BEGIN_TIME AND :V_END_TIME' ;
EXECUTE IMMEDIATE V_SQL into V_SUM_CNT using V_BEGIN_TIME,V_END_TIME;
-----------其他的邏輯處理
-------異常處理邏輯
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(SQLERRM(SQLCODE));
END;
---------存儲過程的執行方法(注意斜槓前面不要有任何空格)
/
2.oracle定時job的實現
SET SERVEROUTPUT ON;
DECLARE
JOB_ID NUMBER;
BEGIN
DBMS_JOB.SUBMIT(
JOB => JOB_ID, /*自動生成JOB_ID*/
WHAT => 'PROCNAME(''test'');', /*需要執行的過程或SQL語句,注意存儲過程後面要有分號*/
NEXT_DATE =>trunc(add_months(last_day(sysdate), -1)+25), /*初次執行時間,每月25日零點*/
INTERVAL =>'TRUNC(LAST_DAY(SYSDATE ))+25' /*每月25日零點,間隔時間*/
);
COMMIT;
DBMS_OUTPUT.PUT_LINE('PROC_CXCRM_CUSM_011_JOB ID:' || JOB_ID);
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('PROC_CXCRM_CUSM_011_JOB ERROR MSG:' || SQLERRM(SQLCODE));
END;
/
3.oracle 刪除定時job
SET SERVEROUTPUT ON;
DECLARE
Cursor jobcursor is select job FROM DBA_JOBS a where a.WHAT like '%?%' ;
begin
for job in jobcursor LOOP
DBMS_OUTPUT.PUT_LINE(job.job);
DBMS_JOB.REMOVE(job.job);
end LOOP;
commit;
end;
/