美文网首页MySQL
30-存储过程-变量

30-存储过程-变量

作者: 紫荆秋雪_文 | 来源:发表于2022-09-08 10:25 被阅读0次

一、系统变量

1、系统变量分类

  • 1、系统变量由系统定义,不是用户定义,属于 服务器 层面。启动 MySQL 服务,生成 MySQL 服务实例期间,MySQL 将为 MySQL 服务器内存中的系统变量赋值,这些系统变量定义了当前 MySQL 服务实例的属性、特征。这些系统变量的值要么是 编译MySQL时参数 的默认值,要么是配置文件(如:my.ini 等)中的参数值
  • 2、系统变量分为全局系统变量(需要添加global关键字)以及绘话系统变量(需要添加session关键字),有时也把全局系统变量简称为全局变量,有时也把会话系统变量称为local变量如果不写,默认会话级别。静态变量(在MySQL服务实例运行期间他们的值不能使用 set 动态修改)属于特殊的全局系统变量
  • 3、每个MySQL客户机成功连接MySQL服务器后,都会产生与之对应的会话。会话期间,MySQL服务实例会在MySQL服务器内存中生成与该会话对应的会话系统变量,这些会话系统变量的初始值是全局系统变量值的复制。 image.png
  • 4、全局系统变量针对所有会话(连接)有效,但不能跨重启
  • 5、会话系统变量仅针对于当前会话(连接)有效。会话期间,当前会话对某个会话系统变量值的修
    改,不会影响其他会话同一个会话系统变量的值
  • 6、会话1对某个全局系统变量值的修改会导致会话2中同一个全局系统变量值的修改
  • 在MySQL中有些系统变量只能是全局的,例如 max_connections 用于限制服务器的最大连接数;有些系
    统变量作用域既可以是全局又可以是会话,例如 character_set_client 用于设置客户端的字符集;有些系
    统变量的作用域只能是当前会话,例如 pseudo_thread_id 用于标记当前会话的 MySQL 连接 ID

2、查看系统变量

  • 1、查看所有全局变量
SHOW GLOBAL VARIABLES;
  • 2、查看所有会话变量
SHOW SESSION VARIABLES ;
或
SHOW VARIABLES ;
  • 3、带条件搜索变量
SHOW GLOBAL VARIABLES LIKE 'admin_%';

3、查看指定系统变量

MySQL 编码规范,MySQL 中的系统变量以两个@开头:
1、“@@global”仅用于标记全局系统变量
2、“@@session”仅用于标记会话系统变量
3、“@@”首先标记会话系统变量,如果会话系统变量不存在,则标记全局系统变量

SELECT @@global.admin_port;
SELECT @@session.变量名;
SELECT @@变量名;
SELECT @@admin_port

4、修改系统变量的值

有些时候,数据库管理员需要修改系统变量的默认值,以便修改当前会话或者MySQL服务实例的属性、
特征。具体方法

方式1:修改MySQL 配置文件 ,继而修改MySQL系统变量的值(该方法需要重启MySQL服务)

方式2:在MySQL服务运行期间,使用“set”命令重新设置系统变量的值

#为某个系统变量赋值 
#方式1: 
SET @@global.变量名=变量值; 
#方式2: 
SET GLOBAL 变量名=变量值; 

#为某个会话变量赋值 
#方式1: 
SET @@session.变量名=变量值; 
#方式2: 
SET SESSION 变量名=变量值;
SELECT @@global.autocommit; 
SET GLOBAL autocommit=0;

SELECT @@session.tx_isolation; 
SET @@session.tx_isolation='read-uncommitted';

SET GLOBAL max_connections = 1000; 
SELECT @@global.max_connections;

二、用户变量

用户变量是用户自己定义的,作为 MySQL 编码规范,MySQL 中的用户变量以 一个“@” 开头。根据作用
范围不同,又分为 会话用户变量 和 局部变量 。
1、会话用户变量:作用域和会话变量一样,只对 当前连接 会话有效。
2、局部变量:只在 BEGIN 和 END 语句块中有效。局部变量只能在 存储过程和函数 中使用。

1、会话用户变量

  • 定义
#方式1:“=”或“:=” 
SET @用户变量 = 值;
SET @用户变量 := 值;

#方式2:“:=” 或 INTO关键字
SELECT @用户变量 := 表达式 [FROM 等子句]; 
SELECT 表达式 INTO @用户变量 [FROM 等子句];
  • 举例
SET @a = 1; 
SELECT @a; 
SELECT @num := COUNT(*) FROM employees; 
SELECT @num; 
SELECT AVG(salary) INTO @avgsalary FROM employees; 
SELECT @avgsalary; 
SELECT @big; #查看某个未声明的变量时,将得到NULL值

2、局部变量

  • 定义:使用 DECLARE 语句定义一个局部变量
  • 作用域:仅仅在定义它的 BEGIN ... END 中有效
  • 位置:只能放在 BEGIN ... END 中,而且只能放在第一句
DELIMITER $
CREATE PROCEDURE test()
BEGIN
    # 声明局部变量
    DECLARE age INT DEFAULT 1;
    DECLARE salary DOUBLE DEFAULT 0;

    # 局部变量赋值
    SET age = 10;
    SET salary = 100;

    SELECT age, salary;
END $
DELIMITER ;
  • 变量赋值
方式1:一般用于赋简单的值
SET 变量名=值; 
SET 变量名:=值;

方式2:一般用于赋表中的字段值
SELECT 字段名或表达式 INTO 变量名 FROM 表;
  • 使用变量
SELECT 局部变量名

三、实战

实战1、声明局部变量,并分别赋值为employees表中employee_id为102的last_name和salary

DELIMITER $
CREATE PROCEDURE fetch_employee_info_by_eid(IN emp_id INT)
BEGIN
    DECLARE _name VARCHAR(25);
    DECLARE _salary DOUBLE;
    SELECT name INTO _name FROM emp WHERE id = emp_id;
    SELECT salary INTO _salary FROM emp WHERE id = emp_id;
#     SELECT salary INTO _salary, salary INTO _salary FROM emp WHERE id = emp_id;

    SELECT _name, _salary;
END $
DELIMITER ;
  • 调用
CALL fetch_employee_info_by_eid(101);

实战2:创建存储过程“different_salary”查询某员工和他领导的薪资差距,并用IN参数emp_id接收员工id,用OUT参数dif_salary输出薪资差距结果

DELIMITER $
CREATE PROCEDURE different_salary(IN emp_id INT, OUT dif_salary DOUBLE)
BEGIN
    DECLARE self_salary, mgr_salary DOUBLE DEFAULT 0;
    SELECT salary INTO self_salary FROM employees WHERE employee_id = emp_id;
    SELECT mgr.salary
    INTO mgr_salary
    FROM employees mgr
             JOIN employees emp
                  ON mgr.employee_id = emp.manager_id
    WHERE emp.employee_id = emp_id;

    SET dif_salary = mgr_salary - self_salary;
END $
DELIMITER ;
  • 调用
SET @id = 101;
SET @salary = 0;
CALL different_salary(@id, @salary);
  • 查看
SELECT @salary;

相关文章

  • 30-存储过程-变量

    一、系统变量 1、系统变量分类 1、系统变量由系统定义,不是用户定义,属于 服务器 层面。启动 MySQL ...

  • 8、存储过程

    8、存储过程 8.1、删除存储过程 8.2、创建存储过程 8.3、创建使用局部变量的存储过程 [^]: 局部变量 ...

  • mysql 存储过程书写

    1.存储过程定义: 2.删除存储过程: 2.存储过程定义变量和引用变量: 3.调用存储过程

  • 存储过程和函数、流程控制结构备忘录

    [TOC] 存储过程和函数 变量 系统变量 全局变量 会话变量 自定义变量 用户变量 局部变量 存储过程 创建语法...

  • MySQL 存储过程

    1、局部变量 在存储过程体中可以声明局部变量,用来存储存储过程体中临时结果。 使用说明:局部变量只能在存储过程体的...

  • mysql 变量存储过程

    此存储过程为批量存储数据

  • 变量、函数、存储过程

    一、变量 1.1全局变量 mysql全局变量,全局变量影响服务器整体操作,当服务启动时,它将所有全局变量初始化为默...

  • 2020-09-04-MySQL(变量 存储过程)

    1,变量2.存储过程

  • mysql 存储过程

    创建存储过程之前.... 变量 创建 赋值 >@ @符号标识后面跟的一个变量 创建存储过程 固定格式 设置结束标志...

  • MySQL 获取游标结果报错:1193-Unknown syst

    MySQL执行以下存储过程 报错: 错误原因:存储过程中使用的变量done未声明。 解决方案:先对done变量进行...

网友评论

    本文标题:30-存储过程-变量

    本文链接:https://www.haomeiwen.com/subject/mfygnrtx.html