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();
  • 相关阅读:
    奥展项目笔记12-批量下载文件
    深度学习笔记03-梯度下降和方向传播
    深度学习笔记02-高效计算基础(python)
    深度学习笔记01-数学基础
    解决Android Studio卡在Gradle:Resolve dependecies 'app:_debugCompile'问题
    Oracle DB , 计算各个用户/schema 的磁盘占用空间
    转载:删除github上文件夹的两种方式
    Win7无法保存共享帐户密码
    怎么做网线,网线水晶头接法和线序
    QQ Protect 的删除
  • 原文地址:https://www.cnblogs.com/nick-huang/p/4614284.html
Copyright © 2011-2022 走看看