写MySQL存储过程实现动态执行SQL (转)

--存储过程名和参数,参数中in表示传入参数,out标示传出参数,inout表示传入传出参数  
  
create procedure p_procedurecode(in sumdate varchar(10))     
begin  
     declare v_sql varchar(500);    --需要执行的SQL语句  
     declare sym varchar(6);  
       
     declare var1 varchar(20);  
     declare var2 varchar(70);  
     declare var3 integer;  
  
     --定义游标遍历时,作为判断是否遍历完全部记录的标记  
     declare no_more_departments integer DEFAULT 0;       
  
     --定义游标名字为C_RESULT   
     DECLARE C_RESULT CURSOR FOR  
             SELECT barcode,barname,barnum FROM tmp_table;  
  
    --声明当游标遍历完全部记录后将标志变量置成某个值  
     DECLARE CONTINUE HANDLER FOR NOT FOUND  
             SET no_more_departments=1;  
  
     set sym=substring(sumdate,1,6);     --截取字符串,并将其赋值给一个遍历  
  
     --连接字符串构成完整SQL语句,动态SQL执行后的结果记录集,在MySQL中无法获取,因此需要转变思路将其放置到一个临时表中(注意代码中的写法)。一般写法如下:  
  
     --     'Create TEMPORARY Table   表名(Select的查询语句);  
     set v_sql= concat('Create TEMPORARY Table tmp_table(select aa as aacode,bb as aaname,count(cc) as ccnum from h',sym,' where substring(dd,1,8)=''',sumdate,''' group by aa,bb)');  
  
     set @v_sql=v_sql;   --注意很重要,将连成成的字符串赋值给一个变量(可以之前没有定义,但要以@开头)  
     prepare stmt from @v_sql;  --预处理需要执行的动态SQL,其中stmt是一个变量  
     EXECUTE stmt;      --执行SQL语句  
     deallocate prepare stmt;     --释放掉预处理段  
  
     OPEN C_RESULT;       --打开之前定义的游标  
     REPEAT                      --循环语句的关键词  
           FETCH C_RESULT INTO VAR1, VAR2, VAR3;   --取出每条记录并赋值给相关变量,注意顺序  
  
          --执行查询语句,并将获得的值付给一个变量 @oldaacode(注意如果以@开头的变量可以不用通过declare语句事先声明)  
           select @oldaacode:=vcaaCode from T_sum where vcaaCode=var1 and dtDate=sumdate;   
           if @oldaacode=var1 then    --判断  
              update T_sum set iNum=var3 where vcaaCode=var1 and dtDate=sumdate;  
           else  
               insert into T_sum(vcaaCode,vcaaName,iNum,dtDate) values(var1,var2,var3,sumdate);  
           end if;  
     UNTIL no_more_departments  END REPEAT;    --循环语句结束  
     CLOSE C_RESULT;                            --关闭游标  
  
     DROP TEMPORARY TABLE tmp_table;       --删除临时表  
end;  

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值