变量,流程控制与游标
#有些变量既是全局变量,又是会话变量
#查看所有全局变量
SHOW GLOBAL VARIABLES;
#查看所有会话变量
SHOW SESSION VARIABLES;
#或
SHOW VARIABLES;
#查看满足条件的部分系统变量。
SHOW GLOBAL VARIABLES LIKE ‘%标识符%’;
#查看满足条件的部分会话变量
SHOW SESSION VARIABLES LIKE ‘%标识符%’;
SHOW GLOBAL VARIABLES LIKE ‘admin_%’;
#1.系统变量
#查看指定的系统变量的值
SELECT @@global.变量名;
#如
SELECT @@global.back_log;
#查看指定的会话变量的值
SELECT @@session.变量名;
#或者
SELECT @@变量名;
SELECT @@session.back_log;
#2.用户变量
#用户变量是用户自己定义的,作为 MySQL 编码规范,MySQL 中的用户变量以 一个“@” 开头。根据作用
#范围不同,又分为 会话用户变量 和 局部变量 。
#第十六章 变量,流程控制与游标
#变量:系统变量(全局系统变量 会话系统变量) vs 用户自定义变量
#查看所有全局变量
SHOW GLOBAL VARIABLES;
#查看所有会话变量
SHOW SESSION VARIABLES;
SHOW VARIABLES;
#查看满足条件的部分系统变量。
SHOW GLOBAL VARIABLES LIKE ‘%标识符%’;
#查看满足条件的部分会话变量
SHOW SESSION VARIABLES LIKE ‘%标识符%’;
#例如
SHOW GLOBAL VARIABLES LIKE ‘auto%’;
#查看指定系统变量
SELECT @@global.character_set_client;
SELECT @@global.back_log;
#查看指定的会话变量的值
SELECT @@session.autocommit;
#修改系统变量的值
#方式一:修改配置文件,进而修改mysql系统变量的值(该方法需要重启mysql服务)
#方式二:在mysql服务运行期间,使用set命令重新设置系统变量的值
#用户变量是用户自己定义的,作为 MySQL 编码规范,MySQL 中的用户变量以 一个“@” 开头。根据作用
#范围不同,又分为 会话用户变量 和 局部变量 。
#会话用户变量:作用域和会话变量一样,只对 当前连接 会话有效。@开头
#局部变量:只在 BEGIN 和 END 语句块中有效。局部变量只能在 存储过程和函数 中使用。
SET @m1=1;
SET @m2=2;
SET @sum=@m1+@m2;
SELECT @sum;
SELECT @count:=COUNT(*)FROM employees;
SELECT AVG(salary)INTO @avg_sal FROM employees;
SELECT @avg_sal;
#局部变量
#定义:可以使用 DECLARE 语句定义一个局部变量
#作用域:仅仅在定义它的 BEGIN … END 中有效
#位置:只能放在 BEGIN … END 中,而且只能放在第一句
#1.定义变量
#DECLARE 变量名 类型 [default 值]; # 如果没有DEFAULT子句,初始值为NULL
#举例:DECLARE myparam INT DEFAULT 100;
#2.变量赋值
#方式1:一般用于赋简单的值
#SET 变量名=值;
#SET 变量名:=值;
#方式2:一般用于赋表中的字段值
#SELECT 字段名或表达式 INTO 变量名 FROM 表;
#3.使用变量(查看、比较、运算等)
#举例1:声明局部变量,并分别赋值为employees表中employee_id为102的last_name和salary
DELIMITER //
CREATE PROCEDURE set_value()
BEGIN
DECLARE emp_name VARCHAR(25);
DECLARE sal DOUBLE(10,2);
SELECT last_name,salary INTO emp_name,sal
FROM employees
WHERE employee_id = 102;
SELECT emp_name,sal;
END //
DELIMITER ;
#调用
CALL set_value();
#举例2:声明两个变量,求和并打印 (分别使用会话用户变量、局部变量的方式实现)
#方式1:使用用户变量
SET @m=1;
SET @n=1;
SET @sum=@m+@n;
SELECT @sum;
#方式2:使用局部变量
DELIMITER //
CREATE PROCEDURE add_value()
BEGIN
#局部变量
DECLARE m INT DEFAULT 1;
DECLARE n INT DEFAULT 3;
DECLARE SUM INT;
SET SUM = m+n;
SELECT SUM;
END //
DELIMITER ;
#调用
CALL add_value();
#例3:创建存储过程“different_salary”查询某员工和他领导的薪资差距,并用IN参数emp_id接收员工
#id,用OUT参数dif_salary输出薪资差距结果。
#声明
DELIMITER //
CREATE PROCEDURE different_salary(IN emp_id INT,OUT dif_salary DOUBLE)
BEGIN
#声明局部变量
DECLARE emp_sal,mgr_sal DOUBLE DEFAULT 0.0;
DECLARE mgr_id INT;
SELECT salary INTO emp_sal FROM employees WHERE employee_id = emp_id;
SELECT manager_id INTO mgr_id FROM employees WHERE employee_id = emp_id;
SELECT salary INTO mgr_sal FROM employees WHERE employee_id = mgr_id;
SET dif_salary = mgr_sal - emp_sal;
END //
DELIMITER ;
#调用
SET @emp_id = 102;
CALL different_salary(@emp_id,@diff_sal);
#查看
SELECT @diff_sal;
#定义条件与处理程序
#定义条件 是事先定义程序执行过程中可能遇到的问题, 处理程序 定义了在遇到问题时应当采取的处理方
#式,并且保证存储过程或函数在遇到警告或错误时能继续执行。这样可以增强存储程序处理问题的能
#力,避免程序异常停止运行。
#说明:定义条件和处理程序在存储过程、存储函数中都是支持的。
#案例分析:创建一个名称为“UpdateDataNoCondition”的存储过程。代码如下:
DELIMITER //
CREATE PROCEDURE UpdateDataNoCondition()
BEGIN
SET @x = 1;
UPDATE employees SET email = NULL WHERE last_name = ‘Abel’;
SET @x = 2;
UPDATE employees SET email = ‘aabbel’ WHERE last_name = ‘Abel’;
SET @x = 3;
END //
DELIMITER ;
#调用存储过程:
CALL UpdateDataNoCondition();
SELECT @x,@proc_value;
#案例解决
#在存储过程中,定义处理程序,捕获sqlstate_value值,当遇到MySQL_error_code值为1048时,执行
#CONTINUE操作,并且将@proc_value的值设置为-1。
DELIMITER //
CREATE PROCEDURE UpdateDataNoCondition2()
BEGIN
#定义处理程序
DECLARE CONTINUE HANDLER FOR 1048 SET @proc_value = -1;
SET @x = 1;
UPDATE employees SET email = NULL WHERE last_name = ‘Abel’;
SET @x = 2;
UPDATE employees SET email = ‘aabbel’ WHERE last_name = ‘Abel’;
SET @x = 3;
END //
DELIMITER ;
CALL UpdateDataNoCondition2();
SELECT @x,@proc_value;