首先说明一下使用的存储过程功能效果:
查询数据源表中的各个表名字段,根据表名查询各个表,统计各个表中的数据量,然后更新数据源表。
数据源表大致情况如图:

存储过程:
DROP PROCEDURE
IF EXISTS updateDataSource;
CREATE PROCEDURE updateDataSource ()
BEGIN
DECLARE
dataSize INT DEFAULT 0;
DECLARE
tableName VARCHAR (30);
DECLARE
done INT DEFAULT FALSE;
DECLARE
tableList CURSOR FOR SELECT
data_table
FROM
data_source;
DECLARE
CONTINUE HANDLER FOR NOT FOUND
SET done = TRUE;
OPEN tableList;
read_loop :
LOOP
FETCH tableList INTO tableName;
IF done THEN
LEAVE read_loop;
END
IF;
SET @STMT := CONCAT(
"SELECT count(*) INTO @dataSize",
" FROM ",
tableName,
";"
);
PREPARE STMT
FROM
@STMT;
EXECUTE STMT;
DEALLOCATE PREPARE STMT;
UPDATE data_source
SET DATA_SIZE = @dataSize
WHERE
DATA_TABLE = tableName;
END
LOOP
;
CLOSE tableList;
END
存储过程说明:
1.在LOOP循环中取游标中的值,获取各个表明;
2.为了能在存储过程中动态使用表名,定义了一个sql语句@STMT,使用函数拼接,并且把sql语句执行结果赋值给变量,以便后续使用;
3.PREPARE STMT FROM @STMT,预处理sql,作用域是当前客户端连接会话可见;EXECUTE STMT执行预处理的sql,如果执行的STMT不存在或没定义将会报错;DEALLOCATE PREPARE STMT释放预处理的sql资源;

被折叠的 条评论
为什么被折叠?



