mysql 存储过程:
用变量做表名: 简单的用set或者declare语句定义变量,然后直接作为sql的表名是不行的,mysql会把变量名当作表名。在其他的sql数据库中也是如此,mysql的解决方法是将整条sql语句作为变量,其中穿插变量作为表名,然后用sp_executesql调用该语句。 这在mysql5.0之前是不行的,5.0之后引入了一个全新的语句,可以达到类似sp_executesql的功能(仅对procedure有效,function不支持动态查询),比如在用游标循环遍历多个表名后,表名需提取出来用作查询,但此时表名是一个游标赋于的变量,因此
set @sql_str1=concat(‘select count(*) into @a from ‘,table_name_list," where TIME(fromdate) >= ‘08:00:00‘ and time(todate)<=‘12:00:00‘");
PREPARE sql_str1 from @sql_str1;
EXECUTE sql_str1;
DEALLOCATE PREPARE sql_str1;
2. 在用concat()函数时,如果是拼接查询,注意查询语句中拼接处要留有空格!!!
3. 在prepare stmt_name from stmt_sql语句中,此种语句不接收存储过程中的局部变量,比如上面的 @a,如果用declare a int,这样声明的局部变量不行!需要用set @a=1声明成一个用户变量prepare 语句才能识别的到!可能是prepare其实是在另一线程中执行了!
4. 定义游标中不可以使用变量,也就是静态游标,但可以使用各种条件语句的!
?DECLARE cur1 CURSOR for select table_name from information_schema.tables where table_schema=‘contestdb‘ and table_name like ‘contest_table_%‘ and table_name not in (‘contest_table_99_bak‘,‘contest_table_99_bak2‘,‘contest_table_35_bak‘,‘contest_table_3 ?5_bak2‘,‘contest_table_0‘,‘contest_table_1‘);