mysql存储过程《3》

首先说明一下使用的存储过程功能效果:

查询数据源表中的各个表名字段,根据表名查询各个表,统计各个表中的数据量,然后更新数据源表。

数据源表大致情况如图:



 存储过程:

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资源;

猜你喜欢

转载自lxzqz.iteye.com/blog/2297475