mysql sp 练习游标和预编译
create procedure Jack_count_cur_dual()
BEGIN
DECLARE tb_name VARCHAR(50);
DECLARE done int DEFAULT 0;
DECLARE mycur CURSOR for SELECT table_name FROM tt_countrows;
DECLARE CONTINUE HANDLER FOR NOT FOUND set done = 1; DROP TABLE IF EXISTS tt_countrows;#删除,创建临时表
CREATE TEMPORARY TABLE tt_countrows(
table_name varchar(50),
table_count int
); INSERT into tt_countrows(table_name)#向临时表中插入表名数据
select 'autidor'
UNION
SELECT 'spprogram.books'
UNION
SELECT 'information_schema.files';
; OPEN mycur;
myloop:LOOP
FETCH mycur into tb_name;#使用游标读取数据赋值给tb_name,得到表名 if done = 1 THEN
leave myLoop;
end if; set @v_sql = CONCAT('select count(*) into @v_count from ',tb_name);#预编译查询表中数据数量的语句
PREPARE stmt FROM @v_sql;
EXECUTE stmt; UPDATE tt_countrows SET table_count = @v_count #修改临时表中table_count字段,值为预编译语句中的count值
WHERE table_name = tb_name; DEALLOCATE PREPARE stmt;
END LOOP myloop;
CLOSE mycur;
SELECT * FROM tt_countrows;#输出临时表结果并删除临时表
DROP TABLE tt_countrows;
END
问题一:首先,在mysql中的变量分为四类,分别是:
用户变量:以"@"开始,形式为"@变量名"
用户变量跟mysql客户端是绑定的,设置的变量,只对当前用户使用的客户端生效
全局变量:定义时,以如下两种形式出现,set GLOBAL 变量名 或者 set @@global.变量名对所有客户端生效。只有具有super权限才可以设置全局变量
会话变量:只对连接的客户端有效。
局部变量:作用范围在begin到end语句块之间。在该语句块里设置的变量
declare语句专门用于定义局部变量。set语句是设置不同类型的变量,包括会话变量和全局变量。
在存储过程中定义了prepare语句然后EXECUTE,它不能接收在存储过程中定义的局部变量,而只能接受带@的用户变量。
这是MYSQL设计上所决定的。 PREPARE, EXCEUTE其实已经可以说是在另外一个栈上执行,不属于当前存储过程了。
问题二:存储过程需要获取数据库表名和表中数据数量,数据库表名需要从information_schema数据库下的tables中寻找,而表中数据数量需要利用count()到对应的表中统计。参考相关资料,利用游标实现tablename的查找,利用prepare实现quantity的统计。再通过创建临时表显示结果。
mysql sp 练习游标和预编译的更多相关文章
- 预编译语句(Prepared Statements)介绍,以MySQL为例
背景 本文重点讲述MySQL中的预编译语句并从MySQL的Connector/J源码出发讲述其在Java语言中相关使用. 注意:文中的描述与结论基于MySQL 5.7.16以及Connect/J 5. ...
- mysql预编译
一.背景: 用Mybatis+mysql的架构做开发,大家都知道,Mybatis内置参数,形如#{xxx}的,均采用了sql预编译的形式,举例如下: <select id=”aaa” param ...
- MySQL开启预编译环境
Mysql是默认 没有开启预编译的,需要在配置中加上 jdbc:mysql://xxx.22.11.31:3306/dbname?useServerPrepStmts=true
- 测试mysql的sql语句预编译效果
玩Oracle的都比较关注shared pool,特别是library cache,在使用了绑定变量(预编译sql)之后确实能得到很大的性能提升.现在在转Mysql之后特别是innodb很多东西都还能 ...
- PHP中对mysql预编译查询语句的一个封装
原文地址:http://chen-shan.net/?p=474 为了防止sql注入,我们都使用过mysqli这个类,但是每次都需要绑定参数,绑定结果等,比较麻烦,所以可以把这些重复的语句封装成一个函 ...
- Mysql的预编译和批处理
MySQL的预编译功能 预编译的好处 大家平时都使用过JDBC中的PreparedStatement接口,它有预编译功能.什么是预编译功能呢?它有什么好处呢? 当客户发送一条SQL语句给服务器后,服务 ...
- MySQL的预编译功能
1.预编译的好处 大家平时都使用过JDBC中的PreparedStatement接口,它有预编译功能.什么是预编译功能呢?它有什么好处呢? 当客户发送一条SQL语句给服务器后,服务器总是需要校验S ...
- php mysql语句预编译(preparestatement)
预处理语句用于执行多个相同的 SQL 语句,并且执行效率更高. 预处理语句的工作原理如下: 预处理:创建 SQL 语句模板并发送到数据库.预留的值使用参数 "?" 标记 .例如: ...
- 浅谈 MySQL的预编译
之前的一篇 Mybatis中 #{}和${}的区别 中涉及到通过 SQL预编译和 #{} 传值 的方式防止SQL注入. 由此引发了想了解预编译的想法.那么什么是预编译那? 一.三个阶段: 词法和语义解 ...
随机推荐
- java代码实现点击鼠标从控制台输出信息
总结:最难的就是当我们需要点击按钮时去实现某个功能-----------因为那个我没有理解透,是涉及整个程序的 package com.a.b; import javax.swing.*; impor ...
- DOM对象与JQuery对象
在初学JAVA时,经常会迷惑,分不清DOM/JQuery对象,以及可以调用的方法. 1.什么是DOM/JQuery对象 DOM对象,即是我们用传统的方法(javascript)获得的对象: eg:va ...
- Oray.com花生壳路由器配置注意
当路由器不链接wan口,只链接lan口时,此路由器其实就是当做一个无线交换机使用了,在此种情况下,花生壳登录会失败,因为花生壳本身也认为这设备不是路由器.
- Oracle 分区表-Range分区
原文:http://www.tuicool.com/articles/MzeM7r 一.什么是分区表 Oracle提供了分区技术以支持VLDB(Very Large DataBase).分区表通过对分 ...
- 【292】Python 关于中文字符串的操作
参考:什么是字符编码? 参考:Unicode 和 UTF-8 有何区别? 参考:python中文decode和encode转码 一.相关说明 Python 中关于字符串的操作只限于英文字母,当进行中文 ...
- 嵌入式Linux启动配置文件及脚本分…
使用Busybox制作根文件系统时,/etc目录非常重要,它包含了嵌入式Linux启动所需的配置文件及脚本.由于init进程,或者说linuxrc程序会解析inittab文件,因此就从/etc/ini ...
- idea写中文到mysql乱码
idea中中文写入到mysql乱码 参考如下链接: https://segmentfault.com/q/1010000006174975/a-1020000006184639
- C++中使用TCP传文件
在两个文件中都定义文件头和用到的宏: #define MAX_SIZE 10 #define ONE_PAGE 4096 struct FileHead { ]; int size; }; 在客户端发 ...
- 当property遇上category
[当property遇上category] @property可以在类定义中,以及extension定义中使用,编译器会自动为@property生成代码,并在变量列表(ivar_list_t)中添加相 ...
- 【bzoj1050】[HAOI2006]旅行comf
1050: [HAOI2006]旅行comf Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2813 Solved: 1534[Submit][St ...