>参考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();

MySQL通过视图(或临时表)实现动态SQL(游标)的更多相关文章

  1. 动态sql

    目录 1.给动态语句传值(USING 子句) 2.从动态语句检索值(INTO子句) 3.动态调用存过 4.将返回值传递到PL/SQL记录类型;同样也可用%rowtype变量 5.传递并检索值.INTO ...

  2. proc程序中使用PLSQL、Exception 、 动态SQL(day08)

    . proc中如何使用plsql 1.1 使用plsql的语法 exec sql execute begin /* 相当于plsql的匿名块 */ end; end-exec; 在预编译时,需要加如下 ...

  3. mysql视图和临时表的区别

    视图 视图是由从数据库的基本表中选出来的数据组成的逻辑窗口,它与基本表不同的是,视图是一个虚表.数据库中只存放视图的定义,而不存放视图包含的数据,这些数据仍存放在原来的基表中.所以基表中的数据如果发生 ...

  4. Mysql学习---视图/触发器/存储过程/函数/执行计划/sql优化 180101

    视图 视图: 视图是一个虚拟表(非真实存在),动态获取数据,仅仅能做查询操作 本质:[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集,并可以将其当作表来使用.由 ...

  5. 使用动态SQL处理table_name作为输入参数的存储过程(MySQL)

    关于mysql如何创建和使用存储过程,参考笔记<MySQL存储过程和函数创建>以及官网:https://dev.mysql.com/doc/refman/5.7/en/create-pro ...

  6. Mysql - 游标/动态sql/事务

    游标这个在我目前的项目里面用的还不多, 但是其功能还是很强大的. 动态sql以前都没用过, 是跟着富士康(不是张全蛋的富土康哦)过来的同事学的. 还是挺好用的. 我的数据库方面, 跟他学了不少. 在此 ...

  7. MySQL存储过程动态SQL语句的生成

    用Mysql存储过程来完成动态SQL语句,使用存储过程有很好的执行效率: 现在有要求如下:根据输入的年份.国家.节假日类型查询一个节假日,我们可以使用一般的SQL语句嵌入到Java代码中,但是执行效率 ...

  8. Mysql动态sql语句,用当前时间做表名

    在mysql备份操作中, 我们可能要使用表名和当前时间来做为备份表的名称,但是MySQL在存储过程中不支持使用变量名来做表名或者列名. 例如:有一个表"user",我需要备份一份, ...

  9. ORACLE数据库之PL/SQL触发器、rownum、动态SQL、数据库之视图与索引

    WHEN子句说明触发约束条件.Condition为一个逻辑表达时,其中必须包含相关名称,而不能包含查询语句,也不能调用PL/SQL函数.WHEN子句指定的触发约束条件只能用在BEFORE和AFTER行 ...

随机推荐

  1. PyQt5教程——组件(7)

    PyQt5中的组件(widgets) 组件(widgets)是构建一个应用的基础模块.PyQt5有广泛的各式各样的组件,包含按钮,复选按钮,滑块条,和列表框.在这个部分的教程中,我们将学习几种有用的组 ...

  2. 算法笔记_175:历届试题 蚂蚁感冒(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 问题描述 长100厘米的细长直杆子上有n只蚂蚁.它们的头有的朝左,有的朝右. 每只蚂蚁都只能沿着杆子向前爬,速度是1厘米/秒. 当两只蚂蚁碰面时,它 ...

  3. DevExpress GridControl 动态创建字段及主细关系表过程

    原文地址:http://hi.baidu.com/qdseashore/item/38f1153e9d0143637d034b7a 在做项目中,往往需要在查询基类模板窗口内做主细关系Grid,引用一下 ...

  4. HTTP头返回码分析

    http协议通讯时,在客户端发送请求后(request),服务器端返回的状态码解释(response) http状态码 1**:请求收到,继续处理 2**:操作成功收到,分析.接受           ...

  5. coding云进行git push报:permission denied

    1.原因可能是 登录其他的git 项目,本地缓存了其他用户的 用户名和密码 认证信息,导致一直权限不通过 解决: git remote add origin http://yourname:passw ...

  6. awk打印倒数第2列

    cat 1-iplist.txt | awk '{ print $(NF-2) }'|wc 实际示例: 打印nginx日志中 变量request_time超过3秒的日志信息 [root@datalin ...

  7. hadoop编译map/reduce时的问题

    参考链接 http://hadoop.apache.org/common/docs/stable/mapred_tutorial.html http://blog.endlesscode.com/20 ...

  8. MFC中创建多线程

    1.   列举几种进程的同步机制,并比较其优缺点. 原子操作    信号量机制   自旋锁    管程,会合,分布式系统 2.   进程之间通信的途径 共享存储系统       消息传递系统      ...

  9. HDU 1757 A Simple Math Problem (矩阵乘法)

    A Simple Math Problem Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Ot ...

  10. Sourcetree 更新git账号密码

    删除Sourcetree 缓存文件(只需要删密码文件),文件位置: Mac: ~/Library/Application Support/SourceTree Windows: C:\Users\US ...