MySQL

30-存储过程-变量

2022-09-08  本文已影响0人  紫荆秋雪_文

一、系统变量

1、系统变量分类

2、查看系统变量

SHOW GLOBAL VARIABLES;
SHOW SESSION VARIABLES ;
或
SHOW VARIABLES ;
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、局部变量

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;
上一篇 下一篇

猜你喜欢

热点阅读