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();
  • 相关阅读:
    python实现压缩文件成zip格式
    python实现自动发送邮件
    jmeter业务建模中遇到的问题
    python开发环境必备之vim配置
    第五章 python中的异常处理
    第四章 python中的面向对象设计
    第三章 python中的字符串
    Web前端面试题目及答案汇总
    做一个网站一般的步骤流程有哪些
    不用新变量直接交换现有两个变量的值
  • 原文地址:https://www.cnblogs.com/nick-huang/p/4614284.html
Copyright © 2011-2022 走看看