MySQL入门 (十一) : Prepared Statements

1 使用者变数

MySQL资料库伺服器提供一种简易的储存资料方式,称为「使用者变数、user variables」。 使用者变数储存一些简单的资料,例如数字或字串,它们可以在后续的操作中使用。 下列是设定使用者变数的语法:

mysql_12_snap_01

下列的叙述设定两个储存字串资料的使用者变数:

mysql_12_snap_02

设定好使用者变数以后,你可以在「SELECT」叙述中查询它们储存的内容:

mysql_12_snap_03

如果你需要设定多个变数的话,可以在一个「SET」叙述中设定多个需要的使用者变数:

mysql_12_snap_04

使用查询叙可以确认上列的叙述已经设定好的两个使用者变数:

mysql_12_snap_05

使用「SELECT」叙述也可以设定需要的使用者变数,不过要特别注意指定的符号只能使用「:=」:

mysql_12_snap_06

下列的叙述设定两个储存整数资料的使用者变数,因为是使用「SELECT」叙述,所以设定好使用者变数以后,也会显示设定的使用者变数内容:

mysql_12_snap_07

再使用查询叙确认上列的叙述已经设定好的两个使用者变数:

mysql_12_snap_08

已经设定好的使用者变数,可以使用在大部份的叙述中,例如下列的范例使用变数来设定查询叙述的条件设定:

mysql_12_snap_09

使用「SELECT」叙述设定使用者变数的方式,也可以直接把查询叙述传回的资料储存起来:

mysql_12_snap_10

上列范例执行后所设定的使用者变数,也可以使用在后续的叙述中:

mysql_12_snap_11

你也可以拿使用者变数来执行需要的运算:

mysql_12_snap_12

注:「LIMIT」子句指定的数字不可以使用变数。

2 Prepared Statements的应用

一个资料库在建立好并开始使用以后,资料库伺服器就会接收各种不同的叙述来执行工作。 以查询叙述来说,有一些叙述可能大部份的内容都是一样的,只有在条件的设定上会不一样。 就算这些叙述的内容是差不多的,资料库伺服器每次接收到叙述时,还是要执行一些同样的工作:

mysql_12_snap_13

如果有「许多要执行的叙述,可是内容却相似」的情况,可以使用「Prepared statements」改善资料库的效率。 首先,你要把这种叙述先准备好:

mysql_12_snap_14

伺服器已经准备好的叙述就称为「prepared statement」,后续要使用这种叙述前,要先设定好prepared statement需要的资料。 在上列的范例中,因为prepared statement的内容中有一个问号,所以你要先设定好一个资料,也就是国家的代码。 然后再请伺服器执行指定的prepared statement,伺服器就会传回执行后的结果了:

mysql_12_snap_15

3 建立、执行与移除Prepared Statements

如果有「许多要执行的叙述,可是内容却相似」的情形,你就可以考虑请伺服器把这种叙述建立为prepared statement。 下列是建立prepared statement的语法:

mysql_12_snap_16

如果常需要查询某个国家的代码、名称与GNP的话,你可以建立一个下列的prepared statement。 叙述中的问号是「参数标记、parameter marker」,表示执行这个prepared statement需要一个参数资料:

mysql_12_snap_17

建立好需要的prepared statement以后,你必须使用「EXECUTE」来执行它:

mysql_12_snap_18

执行一个prepared statement并不一定需要传送资料给它,要依据prepared statement包含的叙述中有没有问号来决定。 如果有问号的话,一个问号就需要先设定好一个使用者变数,然后再使用「USING」传送资料给prepared statement使用:

mysql_12_snap_19

后续要执行这个查询时,只要依照同样的步骤就可以查询别个国家资料了:

mysql_12_snap_20

如果一个prepared statement已经不需要了,你可以使用下列的语法,从伺服器中删除指定的prepared statement:

mysql_12_snap_21

下列的叙述执行以后会删除名称为「my_country」的prepared statement:

mysql_12_snap_22

4 Prepared Statements的参数

在建立prepared statement时,你会依照叙述的需求设定参数标记,这些参数标记也决定执行prepared statement时,须要传多少参数资料给它才可以正确的执行。 以下列新增纪录的叙述来说,它就使用了三个参数标记,依序为部门编号、名称与地点:

mysql_12_snap_23

根据prepared statement使用的参数标记,在执行prepared statement时一定传送正确的参数资料,否则会产生错误讯息:

mysql_12_snap_24

下列的范例先把要新增部门的编号、名称与地点资料设定为使用者变数,在执行「new_dept」时传送给它使用:

mysql_12_snap_25

如果传送的参数数量不对的话,就会产生错误讯息:

mysql_12_snap_26

如果传送的使用者变数不存在的话,会自动使用「NULL」值代替:

mysql_12_snap_27

5 有效范围

所有使用者变数与prepared statements都是某一个用户端专属的:

mysql_12_snap_28

如果用户端离线以后,他所设定的使用者变数与prepared statements都会被清除:

mysql_12_snap_29

所以建立prepared statements时,不可以指定它是属于哪一个资料库,否则会有错误讯息:

mysql_12_snap_30

 

翻译自: http://www.codedata.com.tw/database/mysql-tutorial-12-prepared-statement/

更多参考:

MySQL 超新手入门教程系列

MySQL入门 (一) : 资料库概论与MySQL的安装

MySQL入门 (二) : SELECT 基础查询

MySQL入门 (三) : 运算式与函式

MySQL入门 (四) : JOIN 与UNION 查询

MySQL入门 (五) : CRUD 与资料维护

MySQL入门 (六) : 字元集与资料库

MySQL入门 (七) : 储存引擎与资料型态

MySQL入门 (八) : 表格与索引

MySQL入门 (九) : 子查询 Subquery

MySQL入门 (十) : Views

MySQL入门 (十二) : Stored Routines 入门

 

本文: MySQL入门 (十一) : Prepared Statements

Loading

Add a Comment

Your email address will not be published. Required fields are marked *

Time limit is exhausted. Please reload CAPTCHA.