含义:一组预先编译好的SQL语句的集合,理解成批处理语句。
好处:1.提高代码的重用性
2.简化操作,每次直接调用即可
3.减少了编译次数,减少了数据库服务器连接次数,提高了效率
语法:
一、创建语法
create procedure 存储过程名(参数列表)
begin
存储过程体(一组SQL语句)
end
注意事项:
1.参数列表包含3部分:参数模式 参数名 参数类型
举例:in stuname varchar(20)
参数模式:
in:输入,该参数需要调用方传入
out:输出,该参数可以作为返回值
inout:既可以输入又可以输出,既需要传入值,又可以返回值
2.如果存储过程只有一句话,begin end可以省略
3.每条SQL语句必须;号结尾,存储过程的结尾需要前面使用delimiter声明结束符重新设置。
语法:delimiter 结束标记
举例:delimiter //
二、调用语法
call 存储过程名(实参列表);
案例:
1.不带参数的存储过程
CREATE PROCEDURE myp1()
BEGIN
INSERT INTO student(studentName) VALUES('lili','lucy','rose');
END
2.带in模式参数的存储过程
CREATE PROCEDURE myp2(in stName VARCHAR(10))
BEGIN
SELECT * FROM student WHERE studentName=stName;
end
CALL myp2('rose');
http://3.in多个参数的存储过程,并在存储过程中声明变量并使用
CREATE PROCEDURE myp3(in studentName VARCHAR(10),in studentAge INT)
BEGIN
DECLARE result VARCHAR(10) DEFAULT '';#声明并初始化变量
SELECT COUNT(*) INTO result #给result变量赋值
FROM student
WHERE student.studentName=studentName and student.studentAge=studentAge;
SELECT result;#打印变量
END
CALL myp3('Jerry',18);#调用
4.带out模式的存储过程
-- 根据学号返回名字
CREATE PROCEDURE myp4(in stuId int,out stuName VARCHAR(10))
BEGIN #存储过程体中无需return语句,会直接把值传入out参数
SELECT studentName INTO stuName
FROM student
WHERE studentId=stuId;
END
SET @sName='jer';#给变量赋值
SELECT @sName; #打印结果为‘jer’
call myp4(1,@sName);#也可以不提前给变量赋值,直接调用也可以
SELECT @sName;#打印结果为正确的返回值
5.out多个参数的存储过程
-- 根据学号返回名字,年龄
CREATE PROCEDURE myp5(in stuId int,out stuName VARCHAR(10),out stuAge INT)
BEGIN #存储过程体中无需return语句,会直接把值传入out参数
SELECT studentName,studentAge INTO stuName,stuAge
FROM student
WHERE studentId=stuId;
END
CALL myp5(2,@stuName,@sAge);
SELECT @stuName,@sAge;
6.inout模式参数的存储过程
#传入2个值,2个值翻倍并返回
CREATE PROCEDURE myp6(INOUT n1 int,INOUT n2 INT)
BEGIN
SET n1=n1*2;
SET n2=n2*2;
END
SET @n1=10;
SET @n2=20;
CALL myp6(@n1,@n2);
SELECT @n1,@n2;
三、删除存储过程
语法:DROP PROCEDURE 存储过程名;
DROP PROCEDURE p1;
四、查看存储过程
语法:SHOW CREATE PROCEDURE 存储过程名;
SHOW CREATE PROCEDURE p2;