概述

本章节介绍使用游标来批量进行表操作,包括批量添加索引、批量添加字段等。如果对存储过程、变量定义、预处理还不是很熟悉先阅读我前面写过的关于这三个概念的文章,只有先了解了这三个概念才能更好的理解这篇文章。

MySQL变量和条件:http://www.cnblogs.com/chenmh/p/5203429.html

PREPARE 预处理语句:http://www.cnblogs.com/chenmh/articles/5308085.html

MySQL存储过程和函数:http://www.cnblogs.com/chenmh/p/5201473.html

正文

光标声明

声明光标

DECLARE cursor_name CURSOR FOR select_statement

这个语句声明一个光标。也可以在子程序中定义多个光标,但是一个块中的每一个光标必须有唯一的名字。

注意:SELECT语句不能有INTO子句。

打开光标

OPEN cursor_name

这个语句打开先前声明的光标。

前进光标

FETCH cursor_name INTO var_name [, var_name] ...

这个语句用指定的打开光标读取下一行(如果有下一行的话),并且前进光标指针。

关闭光标

CLOSE cursor_name

这个语句关闭先前打开的光标。

批量添加索引

共享一个批量添加索引的游标,当一个库中有上百张表结构一样但是名称不一样的表,这个时候批量操作就变得简单了。

#删除创建存储过程
DROP PROCEDURE IF EXISTS FountTable;
DELIMITER $$
CREATE PROCEDURE FountTable()
BEGIN
DECLARE TableName varchar(64);
#声明游标
DECLARE cur_FountTable CURSOR FOR SELECT TABLE_NAME FROM information_schema.TABLES WHERE TABLE_SCHEMA='front' AND TABLE_NAME LIKE 'student%';
DECLARE EXIT HANDLER FOR not found CLOSE cur_FountTable;
#打开游标
OPEN cur_FountTable;
REPEAT
FETCH cur_FountTable INTO TableName;
#定义预处理
SET @SQLSTR1 = CONCAT('create index Flag on ','`',TableName,'`',' (Flag); ');
SET @SQLSTR2 = CONCAT('create index State on ','`',TableName,'`',' (State); ');
SET @SQLSTR3 = CONCAT('create index upload on ','`',TableName,'`',' (upload); ');
SET @SQLSTR4 = CONCAT('create index ccFlag on ','`',TableName,'`',' (lockFlag); ');
SET @SQLSTR5 = CONCAT('create index comes on ','`',TableName,'`',' (comes); ');
###SET @SQLSTR=CONCAT(@SQLSTR1,@SQLSTR2,@SQLSTR3,@SQLSTR4,@SQLSTR5 );
PREPARE STMT1 FROM @SQLSTR1;
PREPARE STMT2 FROM @SQLSTR2;
PREPARE STMT3 FROM @SQLSTR3;
PREPARE STMT4 FROM @SQLSTR4;
PREPARE STMT5 FROM @SQLSTR5;
EXECUTE STMT1;
EXECUTE STMT2;
EXECUTE STMT3;
EXECUTE STMT4;
EXECUTE STMT5;
DEALLOCATE PREPARE STMT1;
DEALLOCATE PREPARE STMT2;
DEALLOCATE PREPARE STMT3;
DEALLOCATE PREPARE STMT4;
DEALLOCATE PREPARE STMT5;
# SELECT @SQLSTR; UNTIL 0 END REPEAT;
#关闭游标
CLOSE cur_FountTable; END $$
DELIMITER ; CALL FountTable();

这里有几个细节:

  • 在声明游标的时候记得修改自己需要查询的条件
  • 在预处理这里也需要改成对应的字段
  • 在定义条件变量的时候这里我使用的是EXIT就是遇到错误就中断,当然也可以使用CONTINUE 。

游标嵌套授权

DROP PROCEDURE IF EXISTS pro_grant_pri;
DELIMITER $$
CREATE PROCEDURE pro_grant_pri()
BEGIN
DECLARE cur1_username varchar(128);
DECLARE cur2_dbname varchar(128);
DECLARE done int; DECLARE cur1 CURSOR FOR SELECT username FROM testuser;
DECLARE cur2 CURSOR FOR SELECT SCHEMA_NAME FROM information_schema.SCHEMATA WHERE SCHEMA_NAME like 'test%'; DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1; OPEN cur1;
out_loop:LOOP
FETCH cur1 INTO cur1_username;
IF done = 1 THEN
LEAVE out_loop;
END IF; OPEN cur2;
inner_loop:LOOP
FETCH cur2 INTO cur2_dbname;
IF done = 1 THEN
LEAVE inner_loop;
END IF; SET @SQLSTR1 = CONCAT('grant select,insert,delete,update on ',cur2_dbname,'.*',' to ','''',cur1_username,'''','@','''%'';') ;
PREPARE STMT1 FROM @SQLSTR1;
EXECUTE STMT1;
DEALLOCATE PREPARE STMT1; end LOOP inner_loop;
CLOSE cur2;
SET done=0;
END LOOP out_loop;
CLOSE cur1; END $$
DELIMITER ;

注意:

1.由于mysql在存储过程当中无法将查询出来的变量名直接作为表名来用,所以这里要用到动态拼接SQL的方法,但是通常的SET CONCAT的方法并不管用,所以这里就使用了PREPARE来进行预编译。

2.在定义游标之前所以的定义都只能通过decalre定义,不能使用SET定义!!!!!!

3.定义的变量名不能和表返回的字段名相同,否则接收的值为空。

总结

批量处理虽然有时候能提高工作的效率,但是带来的潜在危险也是挺大了,所以在执行之前必须要非常有把握你执行的语句对数据的影响,否则在生成环境就非常危险了。

备注:

作者:pursuer.chen

博客:http://www.cnblogs.com/chenmh

本站点所有随笔都是原创,欢迎大家转载;但转载时必须注明文章来源,且在文章开头明显处给明链接。

《欢迎交流讨论》

MySQL 游标(PREPARE预处理语句)的更多相关文章

  1. 理解Mysql prepare预处理语句

    MySQL 5.1对服务器一方的预制语句提供支持.如果您使用合适的客户端编程界面,则这种支持可以发挥在MySQL 4.1中实施的高效客户端/服务器二进制协议的优势.候选界面包括MySQL C API客 ...

  2. 1117Mysql prepare预处理语句

    转自http://www.jb51.net/article/81378.htm 综述:一般用来拼凑SQL然后执行 MySQL 5.1对服务器一方的预制语句提供支持.如果您使用合适的客户端编程界面,则这 ...

  3. PDO prepare预处理语句

    预处理语句 $dsn="mysql:host=localhost;dbname=emp"; try{ $pdo=new PDO($dsn,'root','root'); }catc ...

  4. MySQL 游标

    概述 本章节介绍使用游标来批量进行表操作,包括批量添加索引.批量添加字段等.如果对存储过程.变量定义.预处理还不是很熟悉先阅读我前面写过的关于这三个概念的文章,只有先了解了这三个概念才能更好的理解这篇 ...

  5. mysql之预处理语句prepare、execute、deallocate

    预制语句的SQL语法基于三个SQL语句: PREPARE stmt_name FROM preparable_stmt; EXECUTE stmt_name [USING @var_name [, @ ...

  6. MySQL 预处理语句prepare、execute、deallocate的使用

    所以对于中文乱码,需要去check的地方有如下3个:1.mysql窗口的字符编码(xshell连接的远程工具的字符集设置):2.数据库的字符编码(show variables like '%char% ...

  7. Mysql预处理语句prepare、execute、deallocate

    前言 做CTF题的时候遇到的所以参考资料学习一波.... MySQL的SQL预处理(Prepared) 一.SQL 语句的执行处理 1.即时 SQL 一条 SQL 在 DB 接收到最终执行完毕返回,大 ...

  8. MySQL预处理语句

    预制语句的SQL语法基于三个SQL语句: PREPARE stmt_name FROM preparable_stmt; EXECUTE stmt_name [USING @var_name [, @ ...

  9. PHP MySQL 预处理语句

    PHP MySQL 预处理语句 预处理语句对于防止 MySQL 注入是非常有用的. 预处理语句及绑定参数 预处理语句用于执行多个相同的 SQL 语句,并且执行效率更高. 预处理语句的工作原理如下: 预 ...

随机推荐

  1. 第一个spring简单的helloworld

    spring 是一个开源的框架 也是轻量级框架 1.导入jar包 spring的版本 4.0 目录: spring-framework-4.0.0.RELEASE-libs 下的jar  spring ...

  2. linux上安装MongoDB副本集(带keyfile安全认证以及用户权限)

    搭建前准备 MongoDB版本:4.0 主要参考搭建MongoDB副本集网站:https://www.jianshu.com/p/f021f1f3c60b 安装之前最好先确定一下几点: 防火墙关闭 M ...

  3. Win10下windows mobile设备中心连接不上的方法无法启动

    微软Win10自动更细补丁后windows mobile设备中心就无法启动了 需要重新启动相关的服务并授予 本机登录用户 权限 1.点击屏幕左下角“开始”图标,点击“运行”,在弹出的输入框中输入“se ...

  4. JavaSE 初学系统托盘图标SystemTray类

    文章目录 1.预备知识 2.使系统托盘显示图标 3.添加提示 4.添加弹出菜单 设置Java程序的系统托盘图标,用到SystemTray类和TrayIcon类. 1.预备知识 JavaAPI对于Sys ...

  5. 文件操作命令(del)

    del 命令: // 描述: 删除一个或多个文件.同等于 erase 命令. 相比较 rd 命令来说,del 命令只能删除文件,不能删除文件夹. // 语法: del [/p] [/f] [/s] [ ...

  6. SystemUI中设置横竖屏显示

    SystemUI中快捷菜单有 “方向锁定” . RotationLockTile protected void handleClick() { if (mController == null) ret ...

  7. Qt自定义滚动条(不使用样式表)

    前面使用Qt 样式表实现滚动条,在实际工作中,发现存在一些瑕疵,例如如果在主窗口中绘制背景,则有可能给滚动条染色,还有如果想实现特殊的效果,则必须使用自定义风格,即从QStyle的子类派生出新的类型. ...

  8. js做的轮播图

    以下那些注释呢,都是要靠自己理解才是最重要的, <!DOCTYPE html> <html> <head> <meta charset="utf-8 ...

  9. 20155312张竞予 Exp1 PC平台逆向破解(5)M

    Exp1 PC平台逆向破解(5)M 目录 实验内容 手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数. 利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发get ...

  10. 解决Xcode8模拟器无法删除应用的问题

    关闭模拟器的​3DTouch.Hardware​ →Touch Pressure→Use Trackpad Force.