前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >MySQL存储过程+函数

MySQL存储过程+函数

原创
作者头像
程序员阿杜
修改2021-10-03 13:13:33
4.4K0
修改2021-10-03 13:13:33
举报
文章被收录于专栏:开源君开源君

存储过程和函数

文章已同步至GitHub开源项目: Java超神之路

变量

  • 系统变量
  • 全局变量
  • 会话变量
代码语言:txt
复制
查看所有变量
代码语言:txt
复制

SHOW GLOBAL/SESSION VARIVALES

代码语言:txt
复制

条件查询

代码语言:txt
复制

SHOW GLOBAL/SESSION LIKE '%char%'

代码语言:txt
复制

查看某个变量的值

代码语言:txt
复制

SELECT @@GLOBAL/SESSION.系统变量名

代码语言:txt
复制

设置值

代码语言:txt
复制

SET GLOBAL/SESSION.系统变量名 = 值;

代码语言:txt
复制
  • 自定义变量
  • 用户变量
代码语言:txt
复制
- 作用域: 针对于当前会话有效
代码语言:txt
复制
- 使用
代码语言:txt
复制
  ```sql
代码语言:txt
复制
  SET @用户变量名=值  #声明赋值1
代码语言:txt
复制
  SELECT 字段 INTO @变量名 #声明赋值2
代码语言:txt
复制
  SELECT @变量名 #查看
代码语言:txt
复制
  ```
  • 局部变量
代码语言:txt
复制
- 作用域:当前begin / end作用域有效
代码语言:txt
复制
- 使用
代码语言:txt
复制
  ```mysql
代码语言:txt
复制
  DECALARE 变量名 类型 ; #声明
代码语言:txt
复制
  SET 变量名=值;#赋值
代码语言:txt
复制
  SELECT 变量名; #查看
代码语言:txt
复制
  ```

存储过程

  • 概念

一组预先编译好的SQL语句集合。

  • 好处
  • 提高代码的通用性
  • 简化操作
  • 减少了编译次数和连接次数,提高效率
  • 语法
  • 创建
代码语言:txt
复制
```sql
代码语言:txt
复制
CREATE PROCEDURE 存储过程名(参数列表)
代码语言:txt
复制
BEGIN
代码语言:txt
复制
	SQL语句1;
代码语言:txt
复制
	SQL语句2;
代码语言:txt
复制
END
代码语言:txt
复制
```
代码语言:txt
复制
- 参数列表
  - 参数模式 IN,OUT,INOUT
  - 参数名
  - 参数类型
  • 使用
代码语言:txt
复制
```sql
代码语言:txt
复制
CALL 存储过程名(实参列表);
代码语言:txt
复制
```
  • 例子
  • 插入到book中五条记录
代码语言:txt
复制
```sql
代码语言:txt
复制
#定义
代码语言:txt
复制
CREATE PROCEDURE INSERT5()
代码语言:txt
复制
BEGIN
代码语言:txt
复制
    INSERT INTO book values (1,'计算机网络',45.9,'罗贯中',NOW());
代码语言:txt
复制
    INSERT INTO book values (2,'计算机网络',45.9,'罗贯中',NOW());
代码语言:txt
复制
    INSERT INTO book values (3,'计算机网络',45.9,'罗贯中',NOW());
代码语言:txt
复制
    INSERT INTO book values (4,'计算机网络',45.9,'罗贯中',NOW());
代码语言:txt
复制
    INSERT INTO book values (5,'计算机网络',45.9,'罗贯中',NOW());
代码语言:txt
复制
END;
代码语言:txt
复制
#调用
代码语言:txt
复制
CALL INSERT5();
代码语言:txt
复制
```
  • 根据工资查询员工
代码语言:txt
复制

#根据工资查询员工

CREATE PROCEDURE getBySalary(IN s double)

BEGIN

代码语言:txt
复制
  SELECT *
代码语言:txt
复制
      FROM employees
代码语言:txt
复制
          WHERE salary = s;

END;

#调用

CALL getBySAlary();

代码语言:txt
复制
  • 根据工资返回员工名
代码语言:txt
复制

#定义

CREATE PROCEDURE getNameBySalary(IN salary double,OUT name VARCHAR(20))

BEGIN

代码语言:txt
复制
  SELECT last_name INTO name
代码语言:txt
复制
      FROM employees
代码语言:txt
复制
          WHERE employees.salary = salary;

END;

#调用

SET @result;

CALL getNameBySalary(24000,@result);

SELECT @result;

代码语言:txt
复制

函数

有且仅有一个返回

  • 创建
代码语言:txt
复制

CREATE FUNCATION 函数名(参数名 参数类型,参数名 参数类型) RETURNS 返回类型

BEGIN

函数体

END

代码语言:txt
复制
  • 调用
代码语言:txt
复制

SELECT 函数名(参数列表);

代码语言:txt
复制

案例演示

  1. 无参有返回
代码语言:txt
复制
 返回公司的员工个数
代码语言:txt
复制
 ```sql
代码语言:txt
复制
 #定义
代码语言:txt
复制
 CREATE FUNCTION countEmp() RETURNS INT
代码语言:txt
复制
 BEGIN
代码语言:txt
复制
     DECLARE result INT;
代码语言:txt
复制
     SELECT COUNT(*) INTO result
代码语言:txt
复制
     FROM employees;
代码语言:txt
复制
     RETURN result;
代码语言:txt
复制
 END;
代码语言:txt
复制
 #调用
代码语言:txt
复制
 SELECT countEmp();
代码语言:txt
复制
 ```
  1. 有参有返回

根据员工名返回工资

代码语言:txt
复制

#定义

CREATE FUNCTION getSalaryByName(name VARCHAR(20)) RETURNS DOUBLE

BEGIN

代码语言:txt
复制
   DECLARE salary DOUBLE;
代码语言:txt
复制
   SELECT e.salary INTO salary
代码语言:txt
复制
   FROM employees e
代码语言:txt
复制
   WHERE e.last_name = name;
代码语言:txt
复制
   RETURN salary;

END;

#调用

SELECT getSalaryByName('K_ing');

代码语言:txt
复制
  • 查看函数定义语句
代码语言:txt
复制

SHOW CREATE FUNCTION 函数名;

代码语言:txt
复制

流程控制结构

分支结构

  1. IF(表达式 1,表达式2,表达式3) 如果表达式1成立,返回2,否则返回3
  2. CASE结构 如果ELSE省略 当都不匹配时 返回NULL
代码语言:txt
复制

#等值判断

CASE 表达式/值/字段

WHEN 常量1 THEN 语句1;

WHEN 常量2 THEN 语句2;

ELSE 默认语句;

END;

#区间判断

CASE

WHEN 条件 THEN 语句;

WHEN 条件 THEN 语句;

ELSE 默认语句;

END;

代码语言:txt
复制

案例: 创建函数,根据传入成绩,显示等级

代码语言:txt
复制

#定义

CREATE FUNCTION wage_scale(score DOUBLE) RETURNS varchar(10)

BEGIN

代码语言:txt
复制
   CASE
代码语言:txt
复制
       WHEN score>=90 THEN RETURN '优秀';
代码语言:txt
复制
       WHEN score>=80 THEN RETURN '良好';
代码语言:txt
复制
       WHEN score>=70 THEN RETURN '普通';
代码语言:txt
复制
       WHEN score>=60 THEN RETURN '及格';
代码语言:txt
复制
       ELSE RETURN '不及格';
代码语言:txt
复制
       END CASE;

END;

#调用

SELECT wage_scale(90);

代码语言:txt
复制

循环结构

WHILE
  • 语法
代码语言:txt
复制

标签名WHILE 循环条件 DO

循环体;

END WHILE标签名;

代码语言:txt
复制

案例:根据次数批量插入admin表数据

代码语言:txt
复制

#定义存储过程

CREATE PROCEDURE pro_while(IN count INT)

BEGIN

DECLARE i INT DEFAULT 1;

WHILE i <= count

代码语言:txt
复制
DO
代码语言:txt
复制
      INSERT INTO admin (username, password) VALUES (count, count);
代码语言:txt
复制
      SET i = i + 1;
代码语言:txt
复制
END WHILE;

end;

#调用

CALL pro_while(10);

#结果 admin表中插入10条数据

代码语言:txt
复制
LOOP 可以用来模拟简单的死循环
  • 语法
代码语言:txt
复制

标签名LOOP

循环体;

END LOOP 标签名

代码语言:txt
复制
REPEAT
  • 语法
代码语言:txt
复制

标签名REPEAT

循环体;

UNTIL 结束循环条件

END REPEAT 标签名

代码语言:txt
复制

案例

已知表content

字段

说明

id

自增主键

content

随机字符

创建存储过程,插入指定数量的随机字符。

代码语言:txt
复制
#建表
CREATE TABLE content(
    id INT PRIMARY KEY AUTO_INCREMENT,
    content VARCHAR(100)
);

#创建存储过程
CREATE PROCEDURE random_content(IN count INT)
BEGIN
    #定义变量
    DECLARE i INT DEFAULT 1;
    WHILE i <= count DO
        #循环体
        INSERT INTO content VALUES (null,random_bytes(100));
        SET i = i+1;
        END WHILE;
END;
#d
CALL random_content(100);

文章已同步至GitHub开源项目: Java超神之路 更多Java相关知识,欢迎访问!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 存储过程和函数
    • 变量
      • 存储过程
        • 函数
          • 案例演示
        • 流程控制结构
          • 分支结构
          • 循环结构
        • 案例
        相关产品与服务
        数据库
        云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档