欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

mysql存储过程《3》 博客分类: MySQL mysql存储过程mysql游标mysql循环mysql动态使用表名mysql预处理PREPARE 

程序员文章站 2024-03-11 18:34:07
...

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

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

数据源表大致情况如图:


mysql存储过程《3》
            
    
    博客分类: MySQL mysql存储过程mysql游标mysql循环mysql动态使用表名mysql预处理PREPARE 
 存储过程:

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

  • mysql存储过程《3》
            
    
    博客分类: MySQL mysql存储过程mysql游标mysql循环mysql动态使用表名mysql预处理PREPARE 
  • 大小: 18.8 KB