单个SQL语句 实现不了复杂的实际应用,需要一组SQL语句来实现,创建函数,以方便应用。
可编程的函数,完成特定功能编写的SQL语句&控制语句的预编译的集合,再次调用时不再编译。
优点:
create procedure 存储过程名 ([参数列表[,...]])
过程体;
/*参数列表 由 输入输出类型,参数名,参数类型 组成.
[in|out|inout] 参数名 类型
*/
e.g.
-- 这部分是存储过程的定义,用于获取学生表中的记录数
delimiter $$
create procedure proc_stucent(out cnt int)
begin
-- 使用子查询获取学生表中的记录数,并将结果赋值给cnt变量
set cnt = (select count(*) from student);
end $$
delimiter ;
-- 调用存储过程,将结果存储在@nu变量中
call proc_stucent(@nu);
select * from information_schema.routines
[where routine_name = '名称'];
alter procedure sp_name [characteristic ..]
characteristic"
{contains SQL | no SQL | reads SQL data| modifies SQL data}
-- alter 只能需改存储过程的特性,不能修改存储过程定义的内容
-- e.g.
alter proc1 modifies sql data sql security invoker;
drop procedure [if exist] 函数名;
函数只能返回一个 返回值or表对象
存储过程 可以返回参数 如,记录集
delimiter $$ create procedure register(username varchar(20), userpwd varchar(20)) begin if exists( select * from user where uname = username) then select 'existed'; else insert into user(uname,upwd) values(username ,userpwd); end if; end $$ delimiter ; call register('admin','123456');
e.g. 注册过程 用户名不能重复
e.g. 修改密码
delimiter $$ create procedure register(name varchar(20), oldupwd varchar(20),newpwd varchar(20)) begin if (select count(*) from user where upwd = oldpwd) then select '不是你'; else update user set upwd=newpwd where uname = username; end if; end $$ delimiter ; call register('admin','123456');
查询语句返回多条记录,逐条读取查询结果集中的记录
declare cursorname cursor for selevt _ statement
--声明游标
open cursor _ name
--打开游标
fetch cursor_name into var_name1[, var_name2...]
--读取数据 变量列表
游标写在存储过程里
e.g.:
delimiter $$
create procedure p1()
begin
declare xh char(7);
declare xm varchar(20);
declare cur_stu cursor for select sno,sname from student;
set i=1;
while i<=4 do
open cure_stu;
fetch cur_stu into xh,xm;
-- sno,sname;
set i=i+1;
end while;--循环 输出 4个 单行结果集
select xh,xm;
close cur_stu;
end $$
delimiter ;