(12) 预处理语句
最后更新于:2022-04-01 23:40:06
**目录**
[TOC]
# 1 使用者变量
MySQL数据库服务器提供一种简易的储存资料方式,称为“使用者变量、user variables”。使用者变量储存一些简单的资料,例如数字或字串,它们可以在后续的操作中使用。下列是设定使用者变量的语法:
[![mysql_12_snap_01](http://box.kancloud.cn/2015-09-15_55f7ef88abe52.png)](http://box.kancloud.cn/2015-09-15_55f7ef88abe52.png)
下列的叙述设定两个储存字串资料的使用者变量:
[![mysql_12_snap_02](http://box.kancloud.cn/2015-09-15_55f7ef8bacf3d.png)](http://box.kancloud.cn/2015-09-15_55f7ef8bacf3d.png)
设定好使用者变量以后,你可以在“SELECT”叙述中查询它们储存的内容:
[![mysql_12_snap_03](http://box.kancloud.cn/2015-09-15_55f7ef8c0150c.png)](http://box.kancloud.cn/2015-09-15_55f7ef8c0150c.png)
如果你需要设定多个变量的话,可以在一个“SET”叙述中设定多个需要的使用者变量:
[![mysql_12_snap_04](http://box.kancloud.cn/2015-09-15_55f7ef9137382.png)](http://box.kancloud.cn/2015-09-15_55f7ef9137382.png)
使用查询叙可以确认上列的叙述已经设定好的两个使用者变量:
[![mysql_12_snap_05](http://box.kancloud.cn/2015-09-15_55f7efa09b80f.png)](http://box.kancloud.cn/2015-09-15_55f7efa09b80f.png)
使用“SELECT”叙述也可以设定需要的使用者变量,不过要特别注意指定的符号只能使用“:=”:
[![mysql_12_snap_06](http://box.kancloud.cn/2015-09-15_55f7efa1433c0.png)](http://box.kancloud.cn/2015-09-15_55f7efa1433c0.png)
下列的叙述设定两个储存整数资料的使用者变量,因为是使用“SELECT”叙述,所以设定好使用者变量以后,也会显示设定的使用者变量内容:
[![mysql_12_snap_07](http://box.kancloud.cn/2015-09-15_55f7efa1a1461.png)](http://box.kancloud.cn/2015-09-15_55f7efa1a1461.png)
再使用查询叙确认上列的叙述已经设定好的两个使用者变量:
[![mysql_12_snap_08](http://box.kancloud.cn/2015-09-15_55f7efa229afb.png)](http://box.kancloud.cn/2015-09-15_55f7efa229afb.png)
已经设定好的使用者变量,可以使用在大部份的叙述中,例如下列的范例使用变量来设定查询叙述的条件设定:
[![mysql_12_snap_09](http://box.kancloud.cn/2015-09-15_55f7efa287250.png)](http://box.kancloud.cn/2015-09-15_55f7efa287250.png)
使用“SELECT”叙述设定使用者变量的方式,也可以直接把查询叙述传回的资料储存起来:
[![mysql_12_snap_10](http://box.kancloud.cn/2015-09-15_55f7efa2d55de.png)](http://box.kancloud.cn/2015-09-15_55f7efa2d55de.png)
上列范例执行后所设定的使用者变量,也可以使用在后续的叙述中:
[![mysql_12_snap_11](http://box.kancloud.cn/2015-09-15_55f7efa3631d0.png)](http://box.kancloud.cn/2015-09-15_55f7efa3631d0.png)
你也可以拿使用者变量来执行需要的运算:
[![mysql_12_snap_12](http://box.kancloud.cn/2015-09-15_55f7efa3c1233.png)](http://box.kancloud.cn/2015-09-15_55f7efa3c1233.png)
注:“LIMIT”子句指定的数字不可以使用变量。
# 2 Prepared Statements的应用
一个数据库在建立好并开始使用以后,数据库服务器就会接收各种不同的叙述来执行工作。以查询叙述来说,有一些叙述可能大部份的内容都是一样的,只有在条件的设定上会不一样。就算这些叙述的内容是差不多的,数据库服务器每次接收到叙述时,还是要执行一些同样的工作:
[![mysql_12_snap_13](http://box.kancloud.cn/2015-09-15_55f7efa478f37.png)](http://box.kancloud.cn/2015-09-15_55f7efa478f37.png)
如果有“许多要执行的叙述,可是内容却相似”的情况,可以使用“Prepared statements”改善数据库的效率。首先,你要把这种叙述先准备好:
[![mysql_12_snap_14](http://box.kancloud.cn/2015-09-15_55f7efa9f20a5.png)](http://box.kancloud.cn/2015-09-15_55f7efa9f20a5.png)
服务器已经准备好的叙述就称为“prepared statement”,后续要使用这种叙述前,要先设定好prepared statement需要的资料。在上列的范例中,因为prepared statement的内容中有一个问号,所以你要先设定好一个资料,也就是国家的代码。然后再请服务器执行指定的prepared statement,服务器就会传回执行后的结果了:
[![mysql_12_snap_15](http://box.kancloud.cn/2015-09-15_55f7efaa8a62d.png)](http://box.kancloud.cn/2015-09-15_55f7efaa8a62d.png)
# 3 建立、执行与移除Prepared Statements
如果有“许多要执行的叙述,可是内容却相似”的情形,你就可以考虑请服务器把这种叙述建立为prepared statement。下列是建立prepared statement的语法:
[![mysql_12_snap_16](http://box.kancloud.cn/2015-09-15_55f7efab487cd.png)](http://box.kancloud.cn/2015-09-15_55f7efab487cd.png)
如果常需要查询某个国家的代码、名称与GNP的话,你可以建立一个下列的prepared statement。叙述中的问号是“参数标记、parameter marker”,表示执行这个prepared statement需要一个参数资料:
[![mysql_12_snap_17](http://box.kancloud.cn/2015-09-15_55f7efab9018c.png)](http://box.kancloud.cn/2015-09-15_55f7efab9018c.png)
建立好需要的prepared statement以后,你必须使用“EXECUTE”来执行它:
[![mysql_12_snap_18](http://box.kancloud.cn/2015-09-15_55f7efabe329b.png)](http://box.kancloud.cn/2015-09-15_55f7efabe329b.png)
执行一个prepared statement并不一定需要传送资料给它,要依据prepared statement包含的叙述中有没有问号来决定。如果有问号的话,一个问号就需要先设定好一个使用者变量,然后再使用“USING”传送资料给prepared statement使用:
[![mysql_12_snap_19](http://box.kancloud.cn/2015-09-15_55f7efac7687a.png)](http://box.kancloud.cn/2015-09-15_55f7efac7687a.png)
后续要执行这个查询时,只要依照同样的步骤就可以查询别个国家资料了:
[![mysql_12_snap_20](http://box.kancloud.cn/2015-09-15_55f7efad67190.png)](http://box.kancloud.cn/2015-09-15_55f7efad67190.png)
如果一个prepared statement已经不需要了,你可以使用下列的语法,从服务器中删除指定的prepared statement:
[![mysql_12_snap_21](http://box.kancloud.cn/2015-09-15_55f7efadab667.png)](http://box.kancloud.cn/2015-09-15_55f7efadab667.png)
下列的叙述执行以后会删除名称为“my_country”的prepared statement:
[![mysql_12_snap_22](http://box.kancloud.cn/2015-09-15_55f7efb2e0a7f.png)](http://box.kancloud.cn/2015-09-15_55f7efb2e0a7f.png)
# 4 Prepared Statements的参数
在建立prepared statement时,你会依照叙述的需求设定参数标记,这些参数标记也决定执行prepared statement时,须要传多少参数资料给它才可以正确的执行。以下列新增纪录的叙述来说,它就使用了三个参数标记,依序为部门编号、名称与地点:
[![mysql_12_snap_23](http://box.kancloud.cn/2015-09-15_55f7efb330798.png)](http://box.kancloud.cn/2015-09-15_55f7efb330798.png)
根据prepared statement使用的参数标记,在执行prepared statement时一定传送正确的参数资料,否则会产生错误讯息:
[![mysql_12_snap_24](http://box.kancloud.cn/2015-09-15_55f7efb388717.png)](http://box.kancloud.cn/2015-09-15_55f7efb388717.png)
下列的范例先把要新增部门的编号、名称与地点资料设定为使用者变量,在执行“new_dept”时传送给它使用:
[![mysql_12_snap_25](http://box.kancloud.cn/2015-09-15_55f7efb3c1f02.png)](http://box.kancloud.cn/2015-09-15_55f7efb3c1f02.png)
如果传送的参数数量不对的话,就会产生错误讯息:
[![mysql_12_snap_26](http://box.kancloud.cn/2015-09-15_55f7efb44a88d.png)](http://box.kancloud.cn/2015-09-15_55f7efb44a88d.png)
如果传送的使用者变量不存在的话,会自动使用“NULL”值代替:
[![mysql_12_snap_27](http://box.kancloud.cn/2015-09-15_55f7efb498cbc.png)](http://box.kancloud.cn/2015-09-15_55f7efb498cbc.png)
# 5 有效范围
所有使用者变量与prepared statements都是某一个用户端专属的:
[![mysql_12_snap_28](http://box.kancloud.cn/2015-09-15_55f7efb4ebe4b.png)](http://box.kancloud.cn/2015-09-15_55f7efb4ebe4b.png)
如果用户端离线以后,他所设定的使用者变量与prepared statements都会被清除:
[![mysql_12_snap_29](http://box.kancloud.cn/2015-09-15_55f7efb57ee1b.png)](http://box.kancloud.cn/2015-09-15_55f7efb57ee1b.png)
所以建立prepared statements时,不可以指定它是属于哪一个数据库,否则会有错误讯息:
[![mysql_12_snap_30](http://box.kancloud.cn/2015-09-15_55f7efb5c9585.png)](http://box.kancloud.cn/2015-09-15_55f7efb5c9585.png)
';