概述
存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,存储在数据库中,经过第一次编译后调用不需要再次编译,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。存储过程是数据库中的一个重要对象。
简要
存储过程和函数是事先经过编译并存储在数据库中的一段sql语句的集合。
- 存储过程和函数的区别
函数必须有返回值,而存储过程没有。
存储过程的参数可以是IN,OUT,INOUT,类型,而函数只能是IN。
- 优点
存储过程只在创建时进行编译,而sql语句每次执行都需要编译,所以存储过程可以提高数据库执行速度。
简化复杂操作,结合事务一起封装。
复用性好;
安全性高,可指定存储过程的使用权。
- 创建存储过程的语法
语法:
CREATE PROCEDURE 存储过程名(参数体)
BEGIN
sql语句;
END
存储过程的参数形式:[IN | OUT | INOUT]参数名 类型
IN 输入参数
OUT 输出参数
INOUT 输入输出参数
//案例
DELIMITER $$
CREATE PROCEDURE p1()
BEGIN
SELECT * FROM t_su;
END $$
CALL P1();
- 调用
call 存储名(); - @ delimiter $ $
他与存储过程无关 delimiter 语句将标准分割符–分号(;)
更改 $ $ , 因为我们想将存储过程 作为一个整体传递给服务器,而不是让mysql 工具一次解析每个语句,告诉mysql解析器 ,该段命令是否已经结束了,mysql是否可以执行了,默认情况下delimiter是分号;。在命令行客户端中,如果有一行以分号结束,那么回车 后执行 改命令,但是有的时候,不希望mysql这么做。在为可能输入较多的语句,且 语句包含有分号,使用delimiterr$ $ 这样只有$$出现之后mysql解析器解析执行这段语句
案例
1)参数 in 类型
DELIMITER $$
CREATE PROCEDURE P2(IN a INT)
BEGIN
SELECT * from t_su where stu_id = a;
END $$
CALL p2(2);
2)参数 out 类型
DELIMITER $$
CREATE PROCEDURE P3(OUT a INT)
BEGIN
SELECT count(*) into a from t_su ;
END $$
CALL p3(@a);
SELECT @a;
DELIMITER $$
CREATE PROCEDURE P4(OUT a INT,in b int)
BEGIN
SELECT count(*) into a from t_su where stu_id = b;
END $$
CALL p4(@a,2);
SELECT @a;
3)参数 inout 参数
DELIMITER //
CREATE PROCEDURE P5(inOUT p INT)
BEGIN
if(p is not null)THEN
set p = p+1;
ELSE
set p = 10;
end if;
END //
CALL p5(@p);
SELECT @p;