1.提高了代码的复用性
2.简化操作
3.减少了编译次数和数据库服务器的次数,提高了效率
create procedure 存储过程名称(参数模式 参数名 参数类型)
begin
存储过程体
end
参数列表包含三部分:
参数模式 参数名 参数类型
举例
in stuname varchar(32)
in 该参数可以作为输入,需要调用方传入值
out 该参数可以作为输出,可以作为返回值
inout 改参数及可以作为输入、又可以作为输出
1.如果存储过程仅仅只有一句话,那么begin end可以省略
2.存储过程体中的每条sql语句的结果必须加上分号’;’
3.存储过程的结果可以使用delemiter 重新设置
语法:
delimiter 结束标记
例:delimiter //
call 存储过程名(实参列表);
练习:
1.批量插入数据
DELIMITER //
CREATE PROCEDURE pro1()
BEGIN
INSERT INTO stu(id,NAME) VALUES(NULL,'jack');
INSERT INTO stu(id,NAME) VALUES(NULL,'tom');
INSERT INTO stu(id,NAME) VALUES(NULL,'mike');
INSERT INTO stu(id,NAME) VALUES(NULL,'rose');
END;
//
-- 调用
CALL pro1();
SELECT * FROM stu;
-- 有参数
DELIMITER //
CREATE PROCEDURE pro2(IN t_name VARCHAR(32))
BEGIN
SELECT * FROM stu WHERE NAME = t_name;
END;
//
-- 调用
CALL pro2('jack');
SELECT * FROM stu;
DELIMITER //
CREATE PROCEDURE pro3(IN id INT,IN NAME VARCHAR(32))
BEGIN
DECLARE result VARCHAR(32) DEFAULT '';
SELECT COUNT(*)
INTO result
FROM stu
WHERE stu.`id`=id AND stu.`name`=NAME;
SELECT result;
END;
//
-- 调用
CALL pro3(15,'jack');
-- out类型
DELIMITER //
CREATE PROCEDURE pro4(IN id INT,OUT NAME VARCHAR(32))
BEGIN
SELECT stu.`name`
INTO NAME
FROM stu
WHERE stu.`id`=id;
END;
//
-- 调用
-- 定义一个变量接收返回值
CALL pro4(1,@name);
SELECT @name;
-- 有两个out类型返回值
DELIMITER //
CREATE PROCEDURE pro5(IN id INT,OUT NAME VARCHAR(32),OUT age INT)
BEGIN
SELECT stu.`name`,stu.`age`
INTO NAME,age
FROM stu
WHERE stu.`id`=id;
END;
//
-- 调用
CALL pro5(1,@name2,@age);
SELECT @name2;
SELECT @age;
SELECT @name2,@age;
-- 创建带inout模式参数的存储过程
-- 传入两个值a和b,最终a和b都翻倍并返回
DELIMITER //
CREATE PROCEDURE pro6(INOUT a INT,INOUT b INT)
BEGIN
SET a=a*2;
SET b=b*2;
END;
-- 调用
SET @m=10;
SET @n=20;
CALL pro6(@m,@n);
SELECT @m,@n;
//
格式:DROP PROCEDURE 存储过程名
注意: 一次只能删除一个存储过程
DELIMITER //
CREATE PROCEDURE pro7()
BEGIN
SELECT * FROM stu;
END;
//
DROP PROCEDURE pro7;
格式:SHOW CREATE PROCEDURE 存储过程名
SHOW CREATE PROCEDURE pro6;
以下操作不支持
不允许desc
DESC PROCEDURE pro7;
修改存储过程(不支持)
存储过程可以有0个返回值,也可以有多个返回值,适合做批量插入,批量更新
函数:有且仅有1个返回值,适合做处理数据后返回一个结果
CREATE FUNCTION 函数名(参数列表) RETURNS 返回类型
BEGIN
函数体
END
注意:
参数列表包含两个部分:参数名 参数类型
函数体:
一定要有return语句,否则将报错,建议放在函数体的最后
当函数体只有一句话,则begin end 可以省略
SELECT 函数名(参数列表)
执行完语句,得到返回值
语法: SHOW CREATE FUNCTION 函数名称
SHOW CREATE FUNCTION fun2;
test
语法:DROP FUNCTION 函数名
DROP FUNCTION fun2;
函数一般也不会去修改
返回学生个数
DELIMITER //
CREATE FUNCTION fun1() RETURNS INT
BEGIN
DECLARE result INT DEFAULT 0;-- 变量声明
SELECT COUNT(*) INTO result FROM stu;
RETURN result;
END;
//
SELECT fun1();
SELECT * FROM stu;
-- 根据学生名返回学生id
DELIMITER //
CREATE FUNCTION fun2(sname VARCHAR(32)) RETURNS INT
BEGIN
SET @a=0; -- 定义一个用户变量
SELECT id
INTO @a
FROM stu
WHERE NAME = sname;
RETURN @a;
END;
//
SELECT fun2('jack');
SELECT * FROM stu;
-- 创建函数:实现传入两个float,返回两者之和
DELIMITER //
CREATE FUNCTION num_sum(a FLOAT,b FLOAT) RETURNS FLOAT
BEGIN
DECLARE result FLOAT DEFAULT 0;
SET result = a + b;
RETURN result;
END;
//
SELECT num_sum(1,2);