存储过程
存储过程(mysql)
- 什么是存储过程:(stored procedure)
是在大型数据库的系统中是在大型数据库的系统中,为了完成特殊的功能而编写的一组sql语句集,存储过程在数据库中编译,用户通过指定的存储过程名,调用存储过程,如果存储过程带参数,在调用存储过程时传递参数. - 跟一般的sql语句相比,使用存储过程有哪些优点,哪些缺点
存储过程的优点:
—减少了脚本的执行环节,缩短了获取数据时间
—存储过程只在创建时编译,在调用使用时直接执行,不需要编译
—一般的sql语句每条需要编译(执行计划)一次,所以存储过程效率高些
—减少网络传输量,提高了传输速度
—存储过程编译后存储在数据库服务器上
----使用的时候只需要指定存储过程的名称,如果有,并给出参数
—而一般的sql语句需要执行语句字符串传输到数据库服务器上
—相比于存储过程而言,向数据库服务端传送字符串长度比较大
—安全性较高,为存储过程参数赋值只能用?号占位符,避免sql注入
存储过程的缺点:
—如果一个程序系统中大量的使用存储过程,当程序交付使用的时候,
—随客户端的需求增加会导致数据结构复杂,存储过程修改的代价会越来越大
—应用程序对于数据库特性依赖过高,存储过程就是属于数据库特性范畴
存储过程的语法:
create procedure 存储过程的名称([[in|out|inout]参数名 参数类型…])
begin
存储过程的sql语句块
end
案例:
/没有任何输入和输出参数的存储过程/
DELIMITER $$
CREATE
PROCEDURE `testdb`.`proc_noparam`()
BEGIN
select
id ,username userName,userpassword userPassword,age,address
from t_user;
END$$
DELIMITER ;
/只有两个输入参数的存储过程/
DELIMITER $$
CREATE
PROCEDURE `testdb`.`proc_intwoparams`(in uname varchar(20),in uaddress varchar(20))
BEGIN
select *
from t_user
where
username like concat('%',uname,'%') and
address like concat('%',uaddress,'%');
END$$
DELIMITER ;
/只有两个输出参数/
DELIMITER $$
CREATE
PROCEDURE `testdb`.`proc_outtwoparams`(out uname varchar(20),out uaddress varchar(20))
BEGIN
select username into uname from t_user where id=1;
select address into uaddress from t_user where id=11;
/*不能上面的两个语句合并成一条语句
select username into uname,address into uaddress from t_user where id=1;
*/
END$$
DELIMITER ;
/输入参数一个,输出参数一个/
DELIMITER $$
CREATE
PROCEDURE `testdb`.`proc_inoneparamandoutoneparam`(in uname varchar(20),out uid int)
BEGIN
select
id
from t_user
where username=uname
into uid;
/*
select id into uid from t_user where username=uname
*/
END$$
DELIMITER ;
/输入参数即输出参数/
DELIMITER $$
CREATE
PROCEDURE `testdb`.`proc_inoutparam`(inout uname varchar(20))
BEGIN
select username into uname from t_user
where username like concat('%',uname,'%')
order by username desc
limit 1;
/*上面的语句可以替换成下面的写法
select username from t_user
where username like concat('%',uname,'%')
order by username desc
limit 1
into uname;
*/
END$$
DELIMITER ;
/存储过程中有两个结果集/
DELIMITER $$
CREATE
PROCEDURE `testdb`.`proc_tworesultset`()
BEGIN
select id,username from t_user;
select id,age,address from t_user;
END$$
DELIMITER ;