SQL执行过程
存储过程:存储过程是SQL语句和控制语句的预编译集合,以一个名称存储并作为一个单元处理。
存储过程比单一SQL过程效率高,因为存储过程只在第一次执行语法检查,编译的过程,今后不需要。
存储过程的优点:
1. 增强了SQL语句的功能和灵活性
2. 实现较快的执行速度
3. 减少网络流量
创建存储过程
Create [definer = {user | current_user}]
Procedure sp_name ([proc_parameter[,…]])
[characteristic…] routine_body
Proc_parameter:
[ in | out | inout] param_name type
IN: 表示该参数的值必须在调用存储过程时指定
OUT: 表示该参数的值可以被存储过程改变,并且可以返回
INOUT:表示该参数的调用时指定,并且可以被改变和返回
过程体
n 过程体由合法的SQL语句构成
n 过程体可以是任意SQL语句
n 过程体如果为复合结构则使用begin…end语句
n 复合结构可以包含声明,循环,控制结构
调用存储过程
Callsp_name([ parameter[,…]]);
callsp_name[()]
创建无参存储过程
例:Create procedure sp1() selection VERSION()
创建带IN类型参数存储过程
例:create procedure removeUserById( IN id int unsigned)
Begin
Delete from users where id = id
End
创建带IN,OUT参数的存储过程
例:create procedure removeUserAndReturnUserNums( IN p_id int unsigned,OUT userNums int unsigned)
Begin
Delete from users where id = p_id
Selectcount(id) from users INTO userNums
End
CallremoveUserAndReturnUserNums( 27, @nums);
Select@nums;
创建带多个OUT类型参数
例:create procedure removeUserByAgeAndReturnInfos( IN p_age smallintunsigned, OUT deleteUsers smallint unsigned,OUT userCountssmallint unsigned)
Begin
Deletefrom users where age = p_age;
SelectROW_COUNT() INTO deleteUsers;
SelectCOUNT(id) from users INTO userCounts;
End
MySQL存储过程与自定义函数区别
n 存储过程实现的功能要复杂一些,而函数的针对性更强
n 存储过程可以返回多个值,函数只能有一个返回值
n 存储过程一般独立的来执行,而函数可以作为其他SQL语句的组成部分来出现