mysql sp 练习游标和预编译

Posted 贪梦好

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql sp 练习游标和预编译相关的知识,希望对你有一定的参考价值。

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的统计。再通过创建临时表显示结果。


以上是关于mysql sp 练习游标和预编译的主要内容,如果未能解决你的问题,请参考以下文章

MySQL存储过程和游标

如何使用预安装的 libv8 gem 和预编译的 v8 依赖项在 aarch64 上安装 therubyracer?

GCC 和预编译头文件

递归和预编译

T-SQL:带有游标的 sp_depends

将SP的输出游标合并到表中?