码迷,mamicode.com
首页 > 数据库 > 详细

mysql存储过程笔记

时间:2014-07-15 11:09:09      阅读:262      评论:0      收藏:0      [点我收藏+]

标签:sql数据库   sql语句   function   

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‘);




mysql存储过程笔记,布布扣,bubuko.com

mysql存储过程笔记

标签:sql数据库   sql语句   function   

原文地址:http://fucheng.blog.51cto.com/2404495/1438119

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!