MySQL从5.0版本开始支持存储过程。存储过程(StoredProcedure)是一种数据库对象,将复杂的程序存储在数据库中,供外部程序调用。存储过程是一组完成特定功能的SQL语句。它被编译并保存在数据库中。用户可以通过指定存储过程的名称和给定参数(必要时)来调用和执行存储过程。存储过程在思想上很简单,就是数据库SQL语言层面的代码封装和复用。优点存储过程可以封装,隐藏复杂的业务逻辑。存储过程可以返回值,可以接受参数。存储过程不能使用SELECT指令运行,因为它是一个子例程,与查找表、数据表或用户定义的函数不同。存储过程可用于数据验证、执行业务逻辑等。缺点存储过程往往是针对特定的数据库定制的,因为支持的编程语言不同。当切换到其他供应商的数据库系统时,需要重写原来的存储过程。存储过程的性能调优和编写受到各种数据库系统的限制。创建和调用存储过程创建存储过程CREATE[DEFINER={user|CURRENT_USER}] PROCEDUREsp_name([proc_parameter[,...]])[characteristic...]routine_bodyproc_parameter:[IN|OUT|INOUT]param_nametypecharacteristic:COMMENT'string'|LANGUAGESQL|[NOT]DETERMINISTIC|{CONTAINSSQL|NOSQL|READSSQLDATA|MODIFIESSQLDATA}|SQLSECURITY{DEFINER|INVOKER}routine_body: ValidSQLroutinestatement[begin_label:]BEGIN [statement_list]…。..END[end_label]MYSQL存储过程中的关键语法1、声明语句终止符,可自定义:DELIMITER$$或DELIMITER//2。声明存储过程:CREATEPROCEDUREdemo_in_parameter(INp_inint)3.存储过程开始和结束符号:BEGIN....END4。变量赋值:SET@p_in=15。变量定义:DECLAREl_intintunsigneddefault4000000;6、创建mysql存储过程、存储函数:createprocedure存储过程名(参数)7、存储过程体:createfunction存储函数名(参数)实例1、创建数据库并备份数据表实例操作:mysql>createdatabasedb1;mysql>usedb1;mysql>createtablePLAYERSasselect*fromTENNIS.PLAYERS;mysql>createtableMATCHESasselect*fromTENNIS.MATCHES;2。下面是一个存储过程的例子,删除一个给定的选手参加的所有比赛:mysql>delimiter$$ #将语句的结束符由分号改成;暂时给两个$$(可以自定义)mysql>CREATEPROCEDUREdelete_matches(INp_playernoINTEGER)->BEGIN-> DELETEFROMMATCHES->WHEREplayerno=p_playerno;->END$$QueryOK,0rowsaffected(0.01sec)mysql>delimiter; #恢复语句结束符号为分号解析:默认情况下,存储过程与默认数据库相关联。如果要指定存储过程在特定数据库下创建,则在过程名称前添加数据库名称作为前缀。定义过程时,使用DELIMITER$$命令结束语句表示法暂时由分号改为;到两个$$,这样过程体中使用的分号直接传递给服务器而不被mysql等客户端解释。调用存储过程:callsp_name[(passparameter)];mysql>select*fromMATCHES;+--------+--------+----------+-----+------+|MATCHNO|TEAMNO|PLAYERNO|WON|LOST|+--------+--------+-----------+-----+-----+|1|1|6|3|1||7|1|57|3|0||8|1|8|0|3||9|2|27|3|2||11|2|112|2|3|+--------+--------+----------+-----+-----+5rowsinset(0.00sec)mysql>calldelete_matches(57);QueryOK,1rowaffected(0.03sec)mysql>select*fromMATCHES;+----------+--------+----------+-----+-----+|MATCHNO|TEAMNO|PLAYERNO|WON|LOST|+---------+--------+----------+-----+------+|1|1|6|3|1||8|1|8|0|3||9|2|27|3|2||11|2|112|2|3|+--------+--------+------------+-----+------+4rowsinset(0.00sec)分析:存储过程中设置了需要传递的变量p_playerno,存储调用过程中,通过参数将57赋值给p_playerno,然后在存储过程中进行SQL操作。存储过程体存储过程体包含调用过程时必须执行的语句,如:dml、ddl语句、if-then-else和while-do语句、声明变量的declare语句等。过程体格式:startwithbegin,endwithendend(nestable)BEGIN BEGIN BEGIN statements; END END注意:每个嵌套块和其中的每个语句必须以分号结尾,表示过程主体末尾的begin-end块(也称为复合语句)不需要分号。标记语句块:[begin_label:]BEGIN [statement_list]END[end_label]例如:label1:BEGIN label2:BEGIN label3:BEGIN statements; ENDlabel3; 结束标签2;ENDlabel1标签有两个作用:1.增强代码的可读性2.在某些语句中(例如:leave和iterate语句),需要使用标签
