mysql 存储过程 例子

CREATE DEFINER=`root`@`%` PROCEDURE `sp_GetWangingsCount`(IN `PCode` VARCHAR(50), IN `FromDay` DATE, IN `Cycle` INT, IN `DayCount` INT, OUT `Rlt` INT, OUT `DayStr` VARCHAR(520))

LANGUAGE SQL

NOT DETERMINISTIC

CONTAINS SQL

SQL SECURITY DEFINER

COMMENT ‘‘

BEGIN

  if Date_Add(FromDay, interval DayCount-1 day) < date(now()) then

     set Rlt = 0;            

  else   

set @n = floor((datediff(date(now()), FromDay)  + 1) / Cycle); 

set Rlt = 0;

set DayStr = ‘‘;

set @i=1;  


while @i <= @n do 

    set @_FromDay = Date_Add(FromDay, interval DayCount/Cycle*(@i-1) - 1 day) ;

     

       if @_FromDay <= date(now()) then

       

      if @i < @n then

              set @_ToDay = Date_add(date(FromDay), interval DayCount/Cycle*@i day);

      else

           set @_ToDay = Date_add(date(Fromday), interval DayCount-1 day);

      end if;      

 

          if datediff(@_ToDay, now()) > 0 then

              set @_ToDay = date(now());

          end if;       

                     

      select @k:=if(sum(sa_money)/datediff(@_ToDay, @_FromDay) < 1000, 1 ,0) 

   from `t_sale`

   where sa_code = PCode and sa_date between @_FromDay and @_ToDay;

  

          set Rlt = Rlt + @k; 

          

          select @i, @_FromDay, @_ToDay, @k, Rlt;

    

   if @k = 1 then

      if DayStr = ‘‘ then

         set DayStr = concat(DayStr,  @_FromDay, ‘-‘,  @_ToDay); 

      else

         set DayStr = concat(DayStr, ‘,‘,  @_FromDay, ‘-‘,  @_ToDay); 

   end if;   

   end if;

end if;  

       

set @i = @i + 1;

 

    end while;       

  end if; 

END



CREATE DEFINER=`root`@`%` PROCEDURE `showWarnings`()

LANGUAGE SQL

NOT DETERMINISTIC

CONTAINS SQL

SQL SECURITY DEFINER

COMMENT ‘ShowWarnigsDay‘

BEGIN

 

 -- 遍历数据结束标志

DECLARE done INT DEFAULT FALSE;

declare a_code varchar(50);

declare cur cursor for select * from `t_temp`; 


 -- 将结束标志绑定到游标

DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

  

create table t_tmp 

select 

  b.ps_name ps_name,

  a.p_code p_code,

  a.p_name p_name,

  a.p_scale p_scale,

  (select sum(c.sa_money) from t_sale c where c.sa_code=a.p_code) as sa_money,

  p_scale-(select sum(c.sa_money) from t_sale c where c.sa_code=a.p_code) as sa_left,

  datediff(p_EndDate,p_BeginDate) as dayLeft, 

  floor(datediff(a.p_EndDate, a.p_BeginDate)/7) as LeftWeek,

  a.p_period p_period,

  a.p_BeginDate p_eginDate,

 (select sum(c.sa_money) from t_sale c where c.sa_code=a.p_code)/a.p_scale*100 As Percent,

 1 as`预警次数` ,

 1 as`破线次数` ,

 ‘2014-08-10‘ as`破线日期` ,

 (select w_color from t_warning d where d.w_code=a.p_code) as W_color,

 1 as `当日破线` 

from t_product a 

  left join t_product_sort b on a.p_sort=b.ps_id and a.p_sort in (‘1‘,‘2‘);  


 

  -- 打开游标

  OPEN cur;

  

   -- 开始循环

  read_loop: LOOP

    -- 提取游标里的数据,这里只有一个,多个的话也一样;

    FETCH cur INTO a_code;

    

    -- 声明结束的时候

    IF done THEN

      LEAVE read_loop;

    END IF;

    

    call `spGetWangingsCount`(a_code, ‘‘, ‘‘, ‘‘);

    update t_temp set `预警次数`=@;


  END LOOP;

  -- 关闭游标

  CLOSE cur;


 

END


郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。