Mysql16—— 存储过程和函数

存储过程和函数:类似于java中的方法

好处:

  • 提高代码的重用率
  • 简化操作

存储过程

含义:一组预先编译好的SQL语句的集合,理解成批处理语句

  • 提高代码的重用率
  • 简化操作
  • 减少了编译次数并且减少了和数据库服务器的连接次数,提高了效率

一、创建语法

CREATE PROCEDURE 存储过程名(参数列表)

BRGIN

  存储过程体(一组合法的SQL语句)

END

注意:

1、参数列表包含三部分(参数模式、参数名、参数类型)

举例:

IN stuname VARCHAR(20)

参数模式:

IN:该参数可以作为输入,也就是该参数需要调用方法传入值

OUT:该参数可以作为输出,也就是该参数可以作为返回值

INOUT:该参数既可以作为输入又可以作为输出,也就是该参数既需要传入值,又可以返回值

2、如果存储过程体仅仅只有一句话,BEGIN END 可以省略,存储过程体重的每条SQL 语句的结尾要求必须加分号。存储过程的结尾可以使用DELIMITER重新设置

语法:

DELIMITER 结束标记

DELIMITER $

二、调用语法

 CALL 存储过程名(实参列表);

1、空参列表

案例:插入到admin表中五条记录

SELECT * FROM admin;

DELIMITER $

CREATE PROCEDURE myp1()

BEGIN

  INSERT INTO admin(username,`password`)

  VALUES('john1','0000'),('LIly','0000'),('LIly','0000'),('LIly','0000'),('LIly','0000');

END $

CALL myp1()$

2、创建带in模式参数的存储过程

案例1:创建存储过程实现根据女神名,查询对应的男神信息

CREATE PROCEDURE myp2(IN beautyName VARCHAR(20))

BEGIN

  SELECT bo.*

  FROM boys bo

  RIGHT JOIN beauty b ON bo.id = b.boyfriend_id

  WHERE b.name=beautyName;

END $ 

3、创建带out模式的存储过程

案例1:根据女神名,返回对应的男神名

CREATE PROCEDURE myp5(IN beautyName VARCHAR(20),OUT boy Name VARCHAR(20))

BEGIN

  SELECT bo.boyName INTO boyName

  FROM boys bo

  INNER JOIN beauty b ON bo.id = b.boyfriend_id

  WHERE b.name=beautyName;

END $ 

调用

CALL myp5('小昭',@bName)$

SELECT @bName$

4、创建带inout模式参数的存储过程

案例1:传入a和b两个值,最终a和b都翻倍并返回

CREATE PROCEDURE myp6(INOUT a INT,INOUT b INT)

BEGIN 

  SET a=a*2;

  SET b=b*2;

END $

调用

SET @m=10$

SET @n=20$

CALL myp6(@m,@n)$

 三、删除存储过程

语法:drop procedure 存储过程名

DROP PROCEDURE p1;

DROP PROCEDURE p2,p3;

四、查看存储过程的信息

SHOW CREATE PROCEDURE myp2;

函数

含义:一组预先编译好的SQL语句的集合,理解成批处理语句

  • 提高代码的重用率
  • 简化操作
  • 减少了编译次数并且减少了和数据库服务器的连接次数,提高了效率

区别:

存储过程:可以有0个返回,也可以有多个返回

函数:有且仅有1个返回,适合做处理数据后返回一个结果

一、创建语法

CREATE FUNCTION 函数名(参数列表) RETURNS 返回类型

BEGIN

  函数体

END

注意:

  • 参数列表 包含两部分 参数名 参数类型
  • 函数体:肯定会有return语句,如果没有回报错,如果return语句没有放在函数体的最后也不会报错,但不建议
  • 函数体中仅有一句话,则可以省略begin end
  • 使用delimiter语句设置结束标记

二、调用语法

SELECT 函数名(参数列表)

案例1:(无参有返回)返回公司的员工个数:

CREATE FUNCTION myf1() RETURN INT

BEGIN

  DECLARE c INT DEFAULT 0;#定义变量

  SELECT COUNT(*) INTO c#赋值

  FROM employees;

  RETURN c;

END $

SELECT myf1() $

案例2:(有参有返回)根据员工名,返回它的工资

CREATE FUNCTION myf2(empName VARCHAR(20)) RETURN DOUBLE

BEGIN

  SET @sal=0; #定义用户变量

  SELECT salary INTO @sal #赋值

  FROM employees

  WHERE last_name = empName;

END $

SELECT myf2('k_ing') $

案例3:(有参有返回)根据部门名,返回该部门的平均工资

CREATE FUNCTION myf3(deptName VARCHAR(20)) RETURN DOUBLE

BEGIN

  DECLARE sal DOUBLE;

  SELECT AVG(salary) INTO sal

  FROM employees e

  JOIN department d ON e.department_id = d.department_id

  WHERE d.department_name = deptName;

  RETURN sal;

END $

SELECT myf3('IT') $

三、查看函数

SHOW CREATE FUNTION myf3;

原文地址:https://www.cnblogs.com/stu-jyj3621/p/14298837.html