您的位置:首页 > 其它

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

2011-04-20 14:23 204 查看
       两个过程,只作参考。

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

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;

/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息