历史数据统计-存储过程的应用

    技术2022-05-19  19

           两个过程,只作参考。

    一、存储过程.调用存储过程

    CREATE OR REPLACE procedure SEDATUM.SP_HISSTA (nDate  NUMBER ) AS -- 声明变量,存放游标值 nTime           NUMBER ( 12) ; nData           NUMBER ( 12) ; nOpertime     NUMBER ( 12) ;

    nStartDay     NUMBER (12); nCalcType     NUMBER (12); strSQL          CHAR ( 500) ; BEGIN     nStartDay   := 1;     nCalcType   := 1;     -- 结算日     SELECT F4050_INTVAL     INTO   nStartDay     FROM   SEMODEL.TB4050_SYSTEMINFO     WHERE  F4050_CODE= 'START_DAY' ;     -- 结算方式:0-月初结算(结算上月);1-月末结算(结算本月)     SELECT F4050_INTVAL     INTO   nCalcType     FROM   SEMODEL.TB4050_SYSTEMINFO     WHERE  F4050_CODE = 'CALC_TYPE' ;     nTime := (TO_DATE (nDate, 'YYYYMMDD' ) - TO_DATE ('19700101' , 'YYYYMMDD' )) * 86400 - 8 * 3600 ;     nOpertime := nTime + (SYSDATE - TO_DATE (nDate,  'YYYYMMDD' )) * 86400;     -- 执行日统计   调用存储过程 SP_DAYDATA YYYYMMM    strSQL := ' CALL SP_DAYDATA ' ||                                  TO_CHAR (TO_DATE (nDdate, 'YYYYMMDD '), 'YYYYMM ')||                                  '(' ||                                  ''' HISSTA'',' ||                                  '1' ||                                  ',' ||                                  TO_CHAR (nTime)||                                  ',' ||                                  TO_CHAR (nDate)||                                  ',' ||                                  TO_CHAR (nOpertime)||                                  ', NULL )' ;      EXECUTE IMMEDIATE strSQL;     END SP_HISSTA;

    /

    二、存储过程.游标操作使用

    create or replace procedure SP_DAYDATA201104(seuser VARCHAR2,nOption NUMBER, nTime NUMBER, nDate NUMBER, nTimeStamp NUMBER, nSavePoint VARCHAR2) AS -- 声明游标保存所有要处理的点的代码 -- 如果点不存在或不存盘,则不统计 CURSOR  cursor_save_point IS SELECT DISTINCT F4007_POINTCODE, F4004_MEASTYPEID, F4007_SAVEINTERVAL FROM SEMODEL.TB4007_ANAPOINT WHERE (nOption = 1) AND (F4007_SAVEINTERVAL > 0)                 -- 声明游标保存指定点指定时间段的所有瞬时值 CURSOR  cursor_real_data(SavePt VARCHAR2, nTimeStart NUMBER, nTimeEnd NUMBER) IS SELECT POINTTIME, STATUS,VALUE, OPERTIME FROM SEDATUM.se_datum201104 WHERE POINTCODE = SavePt AND FLAG = 1 AND POINTTIME >= nTimeStart AND POINTTIME < nTimeEnd ORDER BY POINTTIME ASC; -- 声明变量,存放游标值 wk_save_point   CHAR(24); wk_meastype     NUMBER(6); wk_interval     NUMBER(6); wk_kdtime       NUMBER(12); wk_kddata       NUMBER(19,6); wk_status       NUMBER(12); wk_opertime     NUMBER(12); -- 声明当地变量              wk_day_max      NUMBER; wk_day_min      NUMBER; wk_day_max_at   NUMBER; wk_day_min_at   NUMBER; wk_start_time   NUMBER; wk_end_time     NUMBER; wk_date         NUMBER; wk_flag         NUMBER; v_dummyval      NUMBER; wk_factor       NUMBER; BEGIN               wk_start_time := nTime;     wk_end_time   := nTime + 86400;     wk_date       := nDate;                    OPEN cursor_save_point;            LOOP     BEGIN         FETCH cursor_save_point         INTO    wk_save_point,wk_meastype,wk_interval;         EXIT WHEN cursor_save_point%NOTFOUND;                                wk_day_max     := 0;         wk_day_min     := 0;         wk_day_max_at  := 0;         wk_day_min_at  := 0;                       OPEN cursor_real_data(wk_save_point,wk_start_time,wk_end_time);         LOOP         BEGIN             FETCH cursor_real_data             INTO    wk_kdtime,                                        wk_status,                     wk_kddata,                     wk_opertime;                                 EXIT WHEN cursor_real_data%NOTFOUND;                          IF (wk_day_count = 0) THEN                 wk_day_max := wk_kddata;                 wk_day_max_at := wk_kdtime;                 wk_day_min := wk_kddata;                 wk_day_min_at := wk_kdtime;                 END IF;                                     IF (abs(wk_kddata) > abs(wk_day_max)) THEN             BEGIN                 wk_day_max := wk_kddata;                 wk_day_max_at := wk_kdtime;                            END;              END IF;                                   IF (abs(wk_kddata) < abs(wk_day_min)) THEN             BEGIN                 wk_day_min := wk_kddata;                 wk_day_min_at := wk_kdtime;                            END;                        END IF;                                                     END;            END LOOP;         CLOSE cursor_real_data;                                                     -- 删除原有数据         BEGIN         DELETE SEDATUM.SE_DAYDATA201104 T         WHERE  T.POINTCODE = wk_save_point         AND    T.POINTTIME = wk_date         AND    T.FLAG IN (100,101,103);         EXCEPTION            WHEN OTHERS THEN               v_dummyval := NULL;         END;         COMMIT;                -- 日统计最大值(包括发生时间)                   IF (wk_day_max_at > 0) THEN         BEGIN             INSERT INTO SEDATUM.SE_DAYDATA201104(                     POINTCODE,                     POINTTIME,                     FLAG,                     VALUE,                     APPEND,                     OPERTIME)             VALUES(wk_save_point,                     wk_date,                     100,                     wk_day_max,                     wk_day_max_at,                     i_timestamp);                          EXCEPTION             WHEN DUP_VAL_ON_INDEX THEN                  BEGIN                                v_dummyval := NULL;             END;         END;         END IF;                            -- 日统计最小值(包括发生时间)                BEGIN             INSERT INTO SEDATUM.SE_DAYDATA201104(                     POINTCODE,                     POINTTIME,                     FLAG,                     VALUE,                     APPEND,                     OPERTIME)             VALUES(wk_save_point,                     wk_date,                     101,                     wk_day_min,                     wk_day_min_at,                     i_timestamp);             EXCEPTION             WHEN DUP_VAL_ON_INDEX THEN                  BEGIN                                v_dummyval := NULL;              END;           END;                            END LOOP;     CLOSE cursor_save_point;          /* 必须提交上次游标操作,否则下次游标操作失败 */     COMMIT; END SP_DAYDATA201104; /


    最新回复(0)