最近在使用存储过程定时创建分区的时候,使用到了预处理相关语句,在此记录一下MySQL的预处理语句使用,方便自己和大家查阅,各位看到此博客的小伙伴,如有不对的地方请及时通过私信我或者评论此博客的方式指出,以免误人子弟。多谢!
MySQL预处理通常使用 PREPARE、EXECUTE 和 DEALLOCATE PREPARE 三个语句来进行处理。
另外,这是一个系列文章,最终我们将实用MySQL定时器和存储过程,实现定时自动创建分区功能,这是在此之前需要掌握的知识点,感兴趣的敬请关注。
目录
PREPARE 语句
语法:
PREPARE stmt_name FROM preparable_stmt
prepare:该prepare语句准备一条SQL语句,并指定一个名称 stmt_name,以便后边进行引用。
stmt_name:语句名称不区分大小写。
preparable_stmt:字符串或包含SQL语句本文的用户变量。
文本必须代表单个语句,而不是多个语句。
语句中,?字符可用作参数标记,已指示稍后在执行查询时将数据绑定到查询的位置。
?字符不应包含在引号内,参数标记只能用于出现数据值的地方,不能用于SQL关键字、标识符等。
EXECUTE 语句
语法:
EXECUTE stmt_name [USING @var_name [, @var_name] ...]
使用 prepare 定义好预处理语句后,使用 execute 来执行。
如果准备好的语句包含任何参数标记,则必须提供一个 USING 子句,该子句列出包含要绑定到参数的值的用户变量。参数值只能由用户变量提供,并且 USING 子句必须命名与语句中参数标记的数量一样多的变量,并且按 using 后取值的顺序为 ? 赋值。
DEALLOCATE PREPARE 语句
语法:
{DEALLOCATE | DROP} PREPARE stmt_name
释放生成的预处理语句。如果不释放生成的预处理语句可以一直执行,释放后,再次执行就会报错。
示例
使用预处理语句向 tbl_msg_send 表中插入一条数据,执行如下语句:
insert into tbl_msg_send(msg_id,acc_id) values('12345',47);
定义prepare语句:
prepare stmt1 from 'insert into tbl_msg_send(msg_id,acc_id) values(?,?)';
如上这个prepare语句,有两个 ?字符作参数标记,在执行execute之前需要给这两个参数赋值,?字符不应包含在引号内,即使 msg_id 在数据库中为 varchar 类型 ,赋值时也不需要使用引号,直接赋值即可。
参数赋值:
@a=12345;
@b=47;
使用execute执行:
execute stmt1 using @a,@b;
execute stmt1 using @b,@a;
按照 using 后面取值的顺序为 预处理语句stmt中的 ? 赋值,我分别使用 @a,@b 和 @b,@a 执行两次,执行后查看数据库结果如下:
释放预处理语句:
deallocate prepare stmt1;
如果不释放生成的预处理语句可以一直执行,释放后,再次执行就会报错。
完整过程如下: