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的统计。再通过创建临时表显示结果。
原文地址:https://www.cnblogs.com/Jack-0824/p/9382972.html
时间: 2024-10-12 03:56:59