历史数据统计-存储过程的应用
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;
/
一、存储过程.调用存储过程
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;
/
相关文章推荐
- 应用存储过程按月建数据表
- MySQL实现统计数据并插入数据的存储过程
- [生产库实战] 采用存储过程对生产线历史表数据进行归档
- sqlserver存储过程及临时表在统计中的应用
- 应用存储过程按月建数据表
- mysql数据存储过程应用
- 存储过程统计数据
- 大数据应用之双色球算奖平台总体设计历史数据存储篇
- 应用存储过程添加数据
- MySQL实现统计数据并插入数据的存储过程
- 应用存储过程删除数据
- Mybatis应用mysql存储过程查询数据实例
- 应用存储过程添加删除数据
- 数据统计存储过程规范(mysql)
- 数据统计存储过程规范(sql server)
- 存储过程+Even定时删除历史数据(Mysql5.1.6+)
- Oracle表的分析统计及应用的存储过程
- Mybatis应用mysql存储过程查询数据
- Android应用之——不要将数据存储在Application类中
- 插入数据的存储过程的经典例子