create procedureJack_count_cur_dual()BEGIN
DECLARE tb_name VARCHAR(50);DECLARE done int DEFAULT 0;DECLARE mycur CURSOR for SELECT table_name FROMtt_countrows;DECLARE CONTINUE HANDLER FOR NOT FOUND set done = 1;DROP TABLE IF EXISTStt_countrows;#删除,创建临时表CREATE TEMPORARY TABLEtt_countrows(
table_namevarchar(50),
table_countint);INSERT intott_countrows(table_name)#向临时表中插入表名数据select 'autidor'
UNION
SELECT 'spprogram.books'
UNION
SELECT 'information_schema.files';
;OPENmycur;
myloop:LOOPFETCH mycur intotb_name;#使用游标读取数据赋值给tb_name,得到表名if done = 1 THENleave myLoop;end if;set @v_sql = CONCAT('select count(*) into @v_count from',tb_name);#预编译查询表中数据数量的语句PREPARE stmt FROM @v_sql;EXECUTEstmt;UPDATE tt_countrows SET table_count = @v_count#修改临时表中table_count字段,值为预编译语句中的count值WHERE table_name =tb_name;DEALLOCATE PREPAREstmt;ENDLOOP myloop;CLOSEmycur;SELECT * FROMtt_countrows;#输出临时表结果并删除临时表DROP TABLEtt_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的统计。再通过创建临时表显示结果。