mysql 预编译绑定游标_mysql sp 练习游标和预编译

create procedureJack_count_cur_dual()BEGIN

DECLARE tb_name VARCHAR(50);DECLARE done int DEFAULT 0;DECLARE mycur CURSOR for SELECT table_name FROMtt_countrows;DECLARE CONTINUE HANDLER FOR NOT FOUND set done = 1;DROP TABLE IF EXISTStt_countrows;#删除,创建临时表CREATE TEMPORARY TABLEtt_countrows(

table_namevarchar(50),

table_countint);INSERT intott_countrows(table_name)#向临时表中插入表名数据select 'autidor'

UNION

SELECT 'spprogram.books'

UNION

SELECT 'information_schema.files';

;OPENmycur;

myloop:LOOPFETCH mycur intotb_name;#使用游标读取数据赋值给tb_name,得到表名if done = 1 THENleave myLoop;end if;set @v_sql = CONCAT('select count(*) into @v_count from',tb_name);#预编译查询表中数据数量的语句PREPARE stmt FROM @v_sql;EXECUTEstmt;UPDATE tt_countrows SET table_count = @v_count#修改临时表中table_count字段,值为预编译语句中的count值WHERE table_name =tb_name;DEALLOCATE PREPAREstmt;ENDLOOP myloop;CLOSEmycur;SELECT * FROMtt_countrows;#输出临时表结果并删除临时表DROP TABLEtt_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的统计。再通过创建临时表显示结果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值