zoukankan      html  css  js  c++  java
  • MySQL通过视图(或临时表)实现动态SQL(游标)

    >参考de优秀文章

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

    Dynamic cursor in stored procedure

    MySQL通过视图(或临时表)实现动态SQL(游标)。

    因在实现中,需要通过DDL语句创建视图(或临时表)、删除视图(或临时表),故,只适合在一些一次性的脚本中使用,比如调试一些数据问题、做一些简单的数据初始化。

    不适合使用在涉及业务操作的程序中。

    >使用view实现

    drop procedure if exists p_simulate_dynamic_cursor;
    
    create procedure p_simulate_dynamic_cursor()
    begin
        declare v_sql varchar(4000);
            declare v_field varchar(4000);
            declare v_result varchar(4000) default '';
            declare cur_temp cursor for select v.* from view_temp_20150701 v;
            declare continue handler for not found set v_field = null;
    
            set v_sql = 'create view view_temp_20150701 as select t.id from t_user t';
            
            set @v_sql = v_sql;
            prepare statement from @v_sql;
            execute statement;
            deallocate prepare statement;
    
            open cur_temp;
            fetch cur_temp into v_field;
            while (v_field is not null) do
                    set v_result = concat(v_result, v_field, ',');
                    fetch cur_temp into v_field;
            end while;
            close cur_temp;
            select v_result;
    
            drop view if exists view_temp_20150701;
    end;
    
    call p_simulate_dynamic_cursor();
            

    >使用temporary table实现

    drop procedure if exists p_simulate_dynamic_cursor_by_temp_table;
    
    create procedure p_simulate_dynamic_cursor_by_temp_table()
    begin
        declare v_sql varchar(4000);
            declare v_field varchar(4000);
            declare v_result varchar(4000) default '';
            declare cur_temp cursor for select t.* from t_temp_20150701 t;
            declare continue handler for not found set v_field = null;
    
            set v_sql = 'create temporary table t_temp_20150701 as select t.id from t_user t limit 0, 100';
            
            set @v_sql = v_sql;
            prepare statement from @v_sql;
            execute statement;
            deallocate prepare statement;
    
            open cur_temp;
            fetch cur_temp into v_field;
            while (v_field is not null) do
                    set v_result = concat(v_result, v_field, ',');
                    fetch cur_temp into v_field;
            end while;
            close cur_temp;
            select v_result;
    
            drop temporary table if exists t_temp_20150701;
    end;
    
    call p_simulate_dynamic_cursor_by_temp_table();
  • 相关阅读:
    开采镍矿与冶炼加工镍的上市公司一览(转载)
    2010年螺纹期货基本走势分析(个人分析原创文章)
    从松柏那转载的ajax类
    推荐30个可以养站的博客(转载)
    年报掘金:机构增仓路线图曝光(20100306转载)
    一个人过习惯了,两个人不知道怎么过。。。
    各大搜索引擎的网站登录入口(转载)
    志向
    主力做庄骗术
    网上发现襄阳市场,说是正品,初步推断举步维艰
  • 原文地址:https://www.cnblogs.com/nick-huang/p/4614284.html
Copyright © 2011-2022 走看看