存储过程(预处理)
- 1.语法结构:
1. create [definer = {user | current_user}]
procedure sp_name ([proc_parameter[,...]]) [characteristic...] routine_body
proc_parameter: [in | out | inout] param_name type
in:该参数的值必须在调用存储过程时指定
out:该参数的值可以被存储过程改变,并且可以返回
inout:表示该参数在调用时指定,并且可以被改变和返回给调用者
过程体:由合法的sql语句构成,对于记录的增删改查及多表连接的sql语句,过程体如果超过两个语句,必须使用begin...end,复合语句内可以声明变量,循环,控制语句。
2. 创建不带参数的存储过程:create procedure sp1() select version(); //创建一个名为sp1的存储过程 功能是返回版本
3. 带有in类型参数的存储过程:
create procedure removeUserById(in myId int unsigned)
-> begin
-> delete from users where id = myId; //标准语句 参数赋值 参数名字不能和字段名相同
-> end
-> //
4. 调用存储过程:
call sp_name([parameter[,...]]) //若存储过程有参数,则()不能省略
call sp_name[()]
示例:
call sp1; call sp1();
call removeUserById(3);
5. 修改存储过程
:alter procedure sp_name [characteristic...] comment ‘string’
| {contains sql | no sql | reads sql data | modifies sql data}
| sql security {definer | invoker}
6. 删除存储过程:
drop procedure [if exists] sp_name
示例:
drop procedure removeUserById;
7.带有in和out类型参数的存储过程:
create procedure removeUserAndReturnUserNums(in p_id int unsigned,out userNums int unsigned)
-> begin
-> delete from test where id = p_id;
-> select count(id) from test into userNums; //userNums代表接收表test的id总数
-> end
-> //
调用:
call removeUserAndReturnUserNums(2,@nums); //@nums代表变量
查看:
select @nums;
8.带有多个out类型参数的存储过程
create procedure removeUserByAgeAndReturnInfos(in p_age smallint unsigned,out deleteUsers smallint unsigned,out userCountssmallint unsigned)
-> begin
-> delete from users where age=p_age; 根据p_age参数删除表的记录
-> select row_count() into deleteUsers; 返回改变字段的数量并赋给deleteUsers
-> select count(id) from users into userCounts; 返回id数量并赋给userCounts
-> end
-> //
in即为输入的变量 out是输出的变量
row_count():返回改变的字段的数量
调用:
call removeUserByAgeAndReturnInfos(20,@a,@b);
调用,删除age为20的所有记录,并返回改变字段的总数给a,返回剩余id数量给b。