存储过程(Stored Procedure)是一个可编程的函数,是为了完成特定功能的SQL语句集;创建的存储过程保存在数据库的数据字典中
一、存储过程的优点:
1.将重复性很高的一些操作,封装到一个存储过程中,简化SQL的调用
2.批量处理
3.统一接口,保证数据的安全
存储过程是数据库的一个重要的功能,MySQL 5.0以前并不支持存储过程,相对oracle来说,MySQL的存储过程相对功能较弱,使用比较少
二、存储过程使用
存储过程的创建
DELIMITER //
CREATE PROCEDURE myproc(OUT s int)
BEGIN
SELECT COUNT(*) INTO s FROM students;
END
//
DELIMITER ;
分隔符:
MySQL默认以";"为分隔符,如果没有声明分割符,则编译器会把存储过
程当成SQL语句进行处理,因此编译过程会报错,
所以要事先用'DELIMITER //' 声明当前段分隔符;
让编译器把两个"//"之间的内容当做存储过程的代码,不会执行这些代码;
'DELIMITER ;'的意为把分隔符还原。
过程体:
过程体的开始与结束使用'BEGIN'与'END'进行标识。
存储过程的调用
call 名称();
查看存储过程
#查询存储过程
SHOW PROCEDURE STATUS WHERE db='数据库名';
查看存储过程详细信息
SHOW CREATE PROCEDURE 数据库.存储过程名;
存储过程的删除
DROP PROCEDURE 存储过程名;
DECLARE 变量
声明变量、赋值
语法:
DELIMITER //
CREATE PROCEDURE myproc()
BEGIN
DECLARE x,y int default 0; -- 声明变量
set x=3; --变量赋值
select avg(salary) into avgRes from emp;-- 将avg(salary)赋值给avgRes
SELECT COUNT(*) INTO s FROM students;
END
//
DELIMITER ;
变量声明在当前的存储过程中有效
存储过程参数传递
in :传入-在调用存储过程时指定,不能被返回
DELIMITER //
CREATE PROCEDURE in_param(IN p_in int)
BEGIN
SELECT p_in;
SET p_in=2;
SELECT p_in;
END;
//
DELIMITER ;
#调用
SET @p_in=1;
CALL in_param(@p_in);
SELECT @p_in;
#结果
p_in =1; 传入的值是1,直接查询返回1
p_in =2; 传入的p_in是1 ,但是set p_in =2;以后查询的结果是2
p_in =1; in_param()没有任何返回,查询的@p_in 是外面定义的
out :输出-存储过程内部被改变,并可返回
#存储过程OUT参数
DELIMITER //
CREATE PROCEDURE out_param(OUT p_out int)
BEGIN
SELECT p_out;
SET p_out=2;
SELECT p_out;
END;
//
DELIMITER ;
#调用
SET @p_out=1;
CALL out_param(@p_out);
SELECT @p_out;
# 结果:
1.p_out =null out_param()没有接收到任何参数,直接查询为null
2.p_out =2 set p_out= 2 以后查询的结果为2
3.p_out =2 out_param() 中p_out=2以后返回给 SELECT @p_out 查询的结果
inout (输入输出)
DELIMITER //
CREATE PROCEDURE inout_param(INOUT p_inout int)
BEGIN
SELECT p_inout;
SET p_inout=2;
SELECT p_inout;
END;
//
DELIMITER ;
#调用
SET @p_inout=1;
CALL inout_param(@p_inout) ;
SELECT @p_inout;
# 结果
1.p_inout = 1 inout_param(@p_inout) ;传入的值是1,直接查询返回1
2.p_inout = 2 inout_param(@p_inout) ;传入的值是1 被SET p_inout=2后查询结果为2
2.p_inout = 2 inout_param(@p_inout) ;传入的值是1 被SET p_inout=2 返回给SELECT @p_inout;后查询结果为2
用户变量一般以@开头
存储过程语句
if语句
case语句
循环
待续…
网友评论