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