1.目的
处理天气数据
2.Java函数
结果:
IDEA把CPU都占满了还什么结果都没跑出来,报错空间溢出...然后就想到了存储过程,直接在数据库上处理而不需要经过程序
3.存储过程
4.总结
终于在数据库中经历了五个多小时把数据都处理完了,也算是深刻理解了为什么要使用存储过程
代码—Java
/**
* 数据处理函数
* 1.将天气等数据转换为现实数据
* 在数据说明中,对温度等数据设置的比例为10
* 2.将-9999对应的缺失数据置为平均值
* 在数据库中查询得知:
* 缺失数据-9999存在于
* air_temperature
* dew_point_temperature
* sea_level_pressure
* wind_direction
* wind_speed
* sky_coverage
* one_hour_duration
* six_hour_duration
* (正确方法应该是按照地区将对应数据置为一段时间内的平均值,但是我懒得写,就直接全部设为一个大概值了)
*/
public BaseResult processData(){
List<Record> list=Db.find("select * from site_weather");
System.out.println(list);
for(Record value:list){
BigInteger id=value.getBigInteger("id");
int airTemperature=value.getInt("air_temperature");
int dewPointTemperature=value.getInt("dew_point_temperature");
int seaLevelPressure=value.getInt("sea_level_pressure");
int windDirection=value.getInt("wind_direction");
int windSpeed=value.getInt("wind_speed");
int skyCoverage=value.getInt("sky_coverage");
int oneHourDuration=value.getInt("one_hour_duration");
int sixHourDuration=value.getInt("six_hour_duration");
//处理缺失数据
if(airTemperature==-9999){
airTemperature=200;
}
if(dewPointTemperature==-9999){
dewPointTemperature=200;
}
if(seaLevelPressure==-9999){
seaLevelPressure=10000;
}
if(windDirection==-9999){
windDirection=180;
}
if(windSpeed==-9999){
windSpeed=40;
}
if(skyCoverage==-9999){
skyCoverage=5;
}
if(oneHourDuration==-9999){
oneHourDuration=0;
}
if(sixHourDuration==-9999){
sixHourDuration=0;
}
//转换为现实数据,将value中的数据更新到数据库
Kv cond=Kv.by("id",id).set("air_temperature",airTemperature/10).
set("dew_point_temperature",dewPointTemperature/10).set("sea_level_pressure",seaLevelPressure/10).
set("wind_direction",windDirection).set("wind_speed",windSpeed/10).
set("sky_coverage",skyCoverage).set("one_hour_duration",oneHourDuration/10).
set("six_hour_duration",sixHourDuration/10);
SqlPara sqlPara=Db.getSqlPara("site.processData",cond);
int result=Db.update(sqlPara);
if(result==0){
return BaseResult.fail("数据处理失败");
}
}
return BaseResult.ok("数据处理完成");
}
代码—SQL
drop procedure processData;
/*创建存储过程,使用游标处理site_weather中的数据*/
create procedure processData() begin
/*声明临时变量,用于更改*/
declare result_code integer default 1; #定义返回结果并赋初值0
declare s int default 0; #标志变量
declare resultId bigint default 0;
declare air int default 0;
declare dew int default 0;
declare sea int default 0;
declare windDirection int default 0;
declare windSpeed int default 0;
declare sky int default 0;
declare one int default 0;
declare six int default 0;
/*声明游标*/
declare processCursor cursor for select
id,air_temperature,dew_point_temperature,sea_level_pressure,wind_direction,wind_speed,sky_coverage,one_hour_duration,six_hour_duration
from site_weather;
/*定义HANDLER*/
declare continue handler for sqlexception set result_code=0; #在执行过程中出任何异常设置result_code为0
declare continue handler for not found set s=1; #声明当游标遍历完后将标志变量置成某个值
/*打开游标*/
open processCursor;
/*将游标中的值赋值给变量,注意:变量名不要和返回的列名同名,变量顺序要和sql结果列的顺序一致*/
fetch processCursor into resultId,air,dew,sea,windDirection,windSpeed,sky,one,six;
-- 当s不等于1,也就是未遍历完时,会一直循环
while s<>1 do
-- 执行业务逻辑
/*
*处理air_temperature为缺失数据时(-9999)
*这里由于之前更新操作失误,因此-1000的值也是无效的,需要重新更新
*/
if air=-9999 or air=-1000 then
set air=200;
end if;
/*
*处理dew_point_temperature为缺失数据时(-9999)
*/
if dew=-9999 or dew=-1000 then
set dew=200;
end if;
/*
*处理sea_level_pressure为缺失数据时(-9999)
*/
if sea=-9999 or sea=-1000 then
set sea=10000;
end if;
/*
*处理wind_direction为缺失数据时(-9999)
*/
if windDirection=-9999 or windDirection=-1000 then
set windDirection=180;
end if;
/*
*处理wind_speed为缺失数据时(-9999)
*/
if windSpeed=-9999 or windSpeed=-1000 then
set windSpeed=40;
end if;
/*
*处理sky_coverage为缺失数据时(-9999)
*/
if sky=-9999 or sky=-1000 then
set sky=5;
end if;
/*
*处理one_hour_duration为缺失数据时(-9999)
*/
if one=-9999 or one=-1000 then
set one=0;
end if;
/*
*处理six_hour_duration为缺失数据时(-9999)
*/
if six=-9999 or six=-1000 then
set six=0;
end if;
/*
*转换为现实数据(前面都只是在判断以及赋值,这里才是真正的更新语句)
*/
update site_weather
set air_temperature=air/10,dew_point_temperature=dew/10,
sea_level_pressure=sea/10,wind_speed=windSpeed/10,
one_hour_duration=one/10,six_hour_duration=six/10
where id=resultId;
-- 将游标中的值再赋值给变量,供下次循环使用
fetch processCursor
into resultId,air,dew,sea,windDirection,windSpeed,sky,one,six;
-- 当s等于1时表明遍历以完成,退出循环
end while;
/*--关闭游标*/
close processCursor;
end
call processData();