1. <var id="fe6gj"></var>

    <rp id="fe6gj"><nav id="fe6gj"></nav></rp>

    <noframes id="fe6gj"><cite id="fe6gj"></cite>

    <ins id="fe6gj"><button id="fe6gj"><p id="fe6gj"></p></button></ins>
    1. <tt id="fe6gj"><i id="fe6gj"><sub id="fe6gj"></sub></i></tt>
        始創于2000年 股票代碼:831685
        咨詢熱線:0371-60135900 注冊有禮 登錄
        • 掛牌上市企業
        • 60秒人工響應
        • 99.99%連通率
        • 7*24h人工
        • 故障100倍補償
        您的位置: 網站首頁 > 幫助中心>文章內容

        應用Oracle job和存儲過程

        發布時間:  2012/8/21 16:37:41

        每月新增數據百萬多條,需要定期處理2個主要數據表(test_ad,test_pd),移動非當月數據到歷史表中保存

        數據操作存儲過程如下:

        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
        --臨時表名賦值
        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;

        --創建(test_ad)歷史表
        tmp_str:='create table '||TableName_AD||' as select * from test_ad where patroldate<'''||to_date(to_char(add_months(last_day(sysdate) +1,-1), 'yyyy-mm-dd'),'yyyy-mm-dd')||'''';
        execute immediate tmp_str;

        --創建(test_pd)歷史表
        tmp_str2:='create table '||TableName_PD||' as select * from test_pd where patroldate<'''||to_date(to_char(add_months(last_day(sysdate) +1,-1), 'yyyy-mm-dd'),'yyyy-mm-dd')||'''';
        execute immediate tmp_str2;
        --commit;

        --創建本月數據臨時表
        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;

        --刪除本月數據表(test_ad,test_pd)
        tmp_str5:='drop TABLE test_ad';
        execute immediate tmp_str5;
        tmp_str6:='drop TABLE test_pd';
        execute immediate tmp_str6;
        --本月數據臨時表重命名表(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;

        /*--刪除主數據表上非本月記錄
        delete from test_ad where patroldate<to_date(to_char(add_months(last_day(sysdate) +1,-1), 'yyyymmdd'),'yyyymmdd');
        --刪除歷史表本月記錄
        delete from test_pd where patroldate<to_date(to_char(add_months(last_day(sysdate) +1,-1), 'yyyymmdd'),'yyyymmdd');

        --刪除歷史表本月記錄
        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;

        --=============注意!在存儲過程中使用CREATE或DROP需要顯示授權==========
        --grant create table to user,grant drop any table to user
        /

        注:上面有一段被注釋的內容,是最初的方案,但是后來了解到:刪除大量數據,Oracle并不釋放空間!所以用了現在的方案,復制創建表——>刪除表——>重命名。

        以上存儲過程每月3號定期執行

        declare job1 number;
        begin
        --每月3號午夜12點執行MYPROC
        dbms_job.submit(job1,'MYPROC;',sysdate,'TRUNC(LAST_DAY(SYSDATE ) + 3)');
        commit;
        end;

        為了補救意外導致3號午夜12點沒有執行MYPROC

        使用另外一個存儲過程驗證MYPROC是否執行

        PASUPPLYPROC.prc

        create or replace procedure PASUPPLYPROC is
        isnull integer;
        tmp_str varchar2(100);
        begin
        --取得本月執行myproc次數
        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;
        --無本月執行記錄則立即執行myproc
        if isnull=0 then
        tmp_str:='begin myproc; end;';
        execute immediate tmp_str;
        commit;
        end if;
        end PASUPPLYPROC;

        --=============注意!在存儲過程中使用CREATE或DROP需要顯示授權==========
        --grant create table to user,grant drop table to user
        /

        第二個job定期執行PASUPPLYPROC驗證

        declare job1 number;
        begin
        --每月15號午夜12點10分執行PASUPPLYPROC
        dbms_job.submit(job1,'PASUPPLYPROC;',sysdate,'TRUNC(LAST_DAY(SYSDATE) + 14) +(24*60+10)/(24*60)');
        commit;
        end;

        DBA_JOBS
        ===========================================
        字段(列)          類型                 描述
        JOB                NUMBER          任務的唯一標示號
        LOG_USER           VARCHAR2(30)    提交任務的用戶
        PRIV_USER          VARCHAR2(30)    賦予任務權限的用戶
        SCHEMA_USER        VARCHAR2(30)    對任務作語法分析的用戶模式
        LAST_DATE          DATE            最后一次成功運行任務的時間
        LAST_SEC           VARCHAR2(8)     如HH24:MM:SS格式的last_date日期的小時,分鐘和秒
        THIS_DATE     DATE            正在運行任務的開始時間,如果沒有運行任務則為null
        THIS_SEC     VARCHAR2(8)     如HH24:MM:SS格式的this_date日期的小時,分鐘和秒
        NEXT_DATE          DATE            下一次定時運行任務的時間
        NEXT_SEC           VARCHAR2(8)     如HH24:MM:SS格式的next_date日期的小時,分鐘和秒
        TOTAL_TIME         NUMBER          該任務運行所需要的總時間,單位為秒
        BROKEN             VARCHAR2(1)     標志參數,Y標示任務中斷,以后不會運行
        INTERVAL           VARCHAR2(200)   用于計算下一運行時間的表達式
        FAILURES    NUMBER     任務運行連續沒有成功的次數
        WHAT               VARCHAR2(2000) 執行任務的PL/SQL塊
        CURRENT_SESSION_LABEL RAW          MLSLABEL 該任務的信任Oracle會話符
        CLEARANCE_HI      RAW MLSLABEL     該任務可信任的Oracle最大間隙
        CLEARANCE_LO      RAW              MLSLABEL 該任務可信任的Oracle最小間隙
        NLS_ENV           VARCHAR2(2000)   任務運行的NLS會話設置
        MISC_ENV          RAW(32)          任務運行的其他一些會話參數


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


        本文出自:億恩科技【www.endtimedelusion.com】

        服務器租用/服務器托管中國五強!虛擬主機域名注冊頂級提供商!15年品質保障!--億恩科技[ENKJ.COM]

      1. 您可能在找
      2. 億恩北京公司:
      3. 經營性ICP/ISP證:京B2-20150015
      4. 億恩鄭州公司:
      5. 經營性ICP/ISP/IDC證:豫B1.B2-20060070
      6. 億恩南昌公司:
      7. 經營性ICP/ISP證:贛B2-20080012
      8. 服務器/云主機 24小時售后服務電話:0371-60135900
      9. 虛擬主機/智能建站 24小時售后服務電話:0371-60135900
      10. 專注服務器托管17年
        掃掃關注-微信公眾號
        0371-60135900
        Copyright© 1999-2019 ENKJ All Rights Reserved 億恩科技 版權所有  地址:鄭州市高新區翠竹街1號總部企業基地億恩大廈  法律顧問:河南亞太人律師事務所郝建鋒、杜慧月律師   京公網安備41019702002023號
          0
         
         
         
         

        0371-60135900
        7*24小時客服服務熱線

         
         
        av不卡不卡在线观看_最近2018年中文字幕_亚洲欧美一区二区三区_一级A爱做片免费观看国产_日韩在线中文天天更新_伊人中文无码在线