Orcle存储过程统计最近30分钟和最近60分钟最大降雨及降雨开始时间和结束时间

来源:互联网 发布:api编程 编辑:程序博客网 时间:2024/05/03 13:44

需求如题。

数据表如下,drp为降雨量,每10分钟一条记录。

存储过程代码如下:

create or replace procedure sp_pro9 is


type sp_pptn_cursor is ref cursor;
type pptn_record_type is record(tm st_pptn_r.tm%type,drp st_pptn_r.drp%type);
type pptn_table_type is table of  pptn_record_type index by binary_integer;


rain_cursor sp_pptn_cursor;   --定义游标,用于循环取值
rain_record pptn_record_type; --定义结构体,由tm和drp组成
rain_table pptn_table_type;   --定义table


v_tm st_pptn_r.tm%type;
v_drp st_pptn_r.drp%type;


n int:=0;  --计数器1
i int:=0;  --计数器2
max3rain st_pptn_r.drp%type := 0; --30分钟最大值降雨量
sum3rain st_pptn_r.drp%type := 0;  --30分钟降雨量和
max6rain st_pptn_r.drp%type := 0; --60分钟最大值降雨量
sum6rain st_pptn_r.drp%type := 0;  --60分钟降雨量和


beginDate_3h st_pptn_r.tm%type;  --记录30分钟最大降雨时段出现的开始时间
endDate_3h st_pptn_r.tm%type;    --记录30分钟最大降雨时段出现的结束时间
beginDate_6h st_pptn_r.tm%type;  --记录60分钟最大降雨时段出现的开始时间
endDate_6h st_pptn_r.tm%type;    --记录60分钟最大降雨时段出现的结束时间


begin
open rain_cursor for select tm,drp from st_pptn_r;   --扩展参数 如时间范围
loop
     fetch rain_cursor into  rain_table(n);-- 将数据读取到数组中 
     --判断是否test_cursor是否为空
     exit when rain_cursor%notfound;
     dbms_output.put_line('时间:'||rain_table(n).tm||' '||'降雨量:'||rain_table(n).drp);
     
      n := n+1;
end loop;


loop
  --查找30分钟降雨量
    if i>n-3 
      then exit; 
    end if;
    
    sum3rain := rain_table(i).drp + rain_table(i+1).drp + rain_table(i+2).drp;    
    if sum3rain > max3rain then
      max3rain := sum3rain;
      beginDate_3h := rain_table(i).tm - 10/24/60;
      endDate_3h := rain_table(i+2).tm;
    end if;
  --查找60分钟降雨量
    if i>n-6 then
      i := i+1;
      continue;
    end if;
     sum6rain := rain_table(i).drp + rain_table(i+1).drp + rain_table(i+2).drp + rain_table(i+3).drp +rain_table(i+4).drp +rain_table(i+5).drp;    
    if sum6rain > max6rain then
      max6rain := sum6rain;
      beginDate_6h := rain_table(i).tm - 10/24/60;
      endDate_6h := rain_table(i+5).tm;
     end if;
     
     
    i := i+1;
end loop;


dbms_output.put_line('3小时最大值:' || max3rain || '开始时间:' || to_char(beginDate_3h,'YYYY-MM-DD HH24:mi:ss') || '结束时间:' || to_char(endDate_3h,'YYYY-MM-DD HH24:mi:ss'));
dbms_output.put_line('3小时最大值:' || max3rain || '开始时间:' || to_char(beginDate_6h,'YYYY-MM-DD HH24:mi:ss') || '结束时间:' || to_char(endDate_6h,'YYYY-MM-DD HH24:mi:ss'));
end;

0 0