码迷,mamicode.com
首页 > 数据库 > 详细

mysql sp 练习游标和预编译

时间:2018-07-28 18:56:27      阅读:212      评论:0      收藏:0      [点我收藏+]

标签:插入   用户   form   mys   赋值   file   读取   glob   creat   

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 练习游标和预编译

标签:插入   用户   form   mys   赋值   file   读取   glob   creat   

原文地址:https://www.cnblogs.com/Jack-0824/p/9382972.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!