《Mysql实例理解MySQL变量和条件》要点:
本文介绍了Mysql实例理解MySQL变量和条件,希望对您有用。如果有疑问,可以联系我们。
MYSQL应用一、概述
MYSQL应用 变量在存储过程中会经常被使用,变量的使用办法是一个重要的知识点,特别是在定义条件这块比较重要.
MYSQL应用 mysql版本:5.6
MYSQL应用二、变量定义和赋值
MYSQL应用
#创建数据库
DROP DATABASE IF EXISTS Dpro;
CREATE DATABASE Dpro
CHARACTER SET utf8
;
USE Dpro;
#创建部分表
DROP TABLE IF EXISTS Employee;
CREATE TABLE Employee
(id INT NOT NULL PRIMARY KEY COMMENT '主键',
name VARCHAR(20) NOT NULL COMMENT '人名',
depid INT NOT NULL COMMENT '部分id'
);
INSERT INTO Employee(id,name,depid) VALUES(1,'陈',100),(2,'王',101),(3,'张',101),(4,'李',102),(5,'郭',103);
MYSQL应用declare定义变量
MYSQL应用在存储过程和函数中通过declare定义变量在BEGIN...END中,且在语句之前.而且可以通过重复定义多个变量
MYSQL应用注意:declare定义的变量名不克不及带‘@'符号,mysql在这点做的确实不够直观,往往变量名会被错成参数或者字段名.
MYSQL应用DECLARE var_name[,...] type [DEFAULT value]
例如:
MYSQL应用
DROP PROCEDURE IF EXISTS Pro_Employee;
DELIMITER $$
CREATE PROCEDURE Pro_Employee(IN pdepid VARCHAR(20),OUT pcount INT )
READS SQL DATA
SQL SECURITY INVOKER
BEGIN
DECLARE pname VARCHAR(20) DEFAULT '陈';
SELECT COUNT(id) INTO pcount FROM Employee WHERE depid=pdepid;
END$$
DELIMITER ;
MYSQL应用SET变量赋值
MYSQL应用SET除了可以给已经定义好的变量赋值外,还可以指定赋值并定义新变量,且SET定义的变量名可以带‘@'符号,SET语句的位置也是在BEGIN ....END之间的语句之前.
MYSQL应用1.变量赋值
MYSQL应用
SET var_name = expr [, var_name = expr] ...
DROP PROCEDURE IF EXISTS Pro_Employee;
DELIMITER $$
CREATE PROCEDURE Pro_Employee(IN pdepid VARCHAR(20),OUT pcount INT )
READS SQL DATA
SQL SECURITY INVOKER
BEGIN
DECLARE pname VARCHAR(20) DEFAULT '陈';
SET pname='王';
SELECT COUNT(id) INTO pcount FROM Employee WHERE depid=pdepid AND name=pname;
END$$
DELIMITER ;
CALL Pro_Employee(101,@pcount);
SELECT @pcount;
MYSQL应用
MYSQL应用2.通过赋值定义变量
MYSQL应用
DROP PROCEDURE IF EXISTS Pro_Employee;
DELIMITER $$
CREATE PROCEDURE Pro_Employee(IN pdepid VARCHAR(20),OUT pcount INT )
READS SQL DATA
SQL SECURITY INVOKER
BEGIN
DECLARE pname VARCHAR(20) DEFAULT '陈';
SET pname='王';
SET @ID=1;
SELECT COUNT(id) INTO pcount FROM Employee WHERE depid=pdepid AND name=pname;
SELECT @ID;
END$$
DELIMITER ;
CALL Pro_Employee(101,@pcount);
MYSQL应用
MYSQL应用SELECT ... INTO语句赋值
MYSQL应用 通过select into语句可以将值赋予变量,也可以之间将该值赋值存储过程的out参数,上面的存储过程select into便是之间将值赋予out参数.
MYSQL应用
DROP PROCEDURE IF EXISTS Pro_Employee;
DELIMITER $$
CREATE PROCEDURE Pro_Employee(IN pdepid VARCHAR(20),OUT pcount INT )
READS SQL DATA
SQL SECURITY INVOKER
BEGIN
DECLARE pname VARCHAR(20) DEFAULT '陈';
DECLARE Pid INT;
SELECT COUNT(id) INTO Pid FROM Employee WHERE depid=pdepid AND name=pname;
SELECT Pid;
END$$
DELIMITER ;
CALL Pro_Employee(101,@pcount);
MYSQL应用这个存储过程便是select into将值赋予变量;
MYSQL应用
MYSQL应用表中并没有depid=101 and name='陈'的记录.
MYSQL应用三、条件
MYSQL应用条件的作用一般用在对指定条件的处理,好比我们遇到主键重复报错后该怎样处理.
MYSQL应用定义条件
MYSQL应用 定义条件就是事先定义某种错误状态或者sql状态的名称,然后就可以引用该条件名称开做条件处理,定义条件一般用的比拟少,一般会直接放在条件处理里面.
MYSQL应用
DECLARE condition_name CONDITION FOR condition_value
condition_value:
SQLSTATE [VALUE] sqlstate_value
| mysql_error_code
MYSQL应用1.没有定义条件:
MYSQL应用
DROP PROCEDURE IF EXISTS Pro_Employee_insert;
DELIMITER $$
CREATE PROCEDURE Pro_Employee_insert()
MODIFIES SQL DATA
SQL SECURITY INVOKER
BEGIN
SET @ID=1;
INSERT INTO Employee(id,name,depid) VALUES(1,'陈',100);
SET @ID=2;
INSERT INTO Employee(id,name,depid) VALUES(6,'陈',100);
SET @ID=3;
END$$
DELIMITER ;
#执行存储过程
CALL Pro_Employee_insert();
#查询变量值
SELECT @ID,@X;
MYSQL应用
MYSQL应用报主键重复的差错,其中1062是主键重复的差错代码,23000是sql差错状态
MYSQL应用
MYSQL应用2.定义处理条件
MYSQL应用
DROP PROCEDURE IF EXISTS Pro_Employee_insert;
DELIMITER $$
CREATE PROCEDURE Pro_Employee_insert()
MODIFIES SQL DATA
SQL SECURITY INVOKER
BEGIN
#定义条件名称,
DECLARE reprimary CONDITION FOR 1062;
#引用前面定义的条件名称并做赋值处理
DECLARE EXIT HANDLER FOR reprimary SET @x=1;
SET @ID=1;
INSERT INTO Employee(id,name,depid) VALUES(1,'陈',100);
SET @ID=2;
INSERT INTO Employee(id,name,depid) VALUES(6,'陈',100);
SET @ID=3;
END$$
DELIMITER ;
CALL Pro_Employee_insert();
SELECT @ID,@X;
MYSQL应用在执行存储过程的步调中并没有报错,但是由于我定义的是exit,所以在遇到报错sql就终止往下执行了.
MYSQL应用
MYSQL应用接下来看看continue的分歧
MYSQL应用
DROP PROCEDURE IF EXISTS Pro_Employee_insert;
DELIMITER $$
CREATE PROCEDURE Pro_Employee_insert()
MODIFIES SQL DATA
SQL SECURITY INVOKER
BEGIN
#定义条件名称,
DECLARE reprimary CONDITION FOR SQLSTATE '23000';
#引用前面定义的条件名称并做赋值处理
DECLARE CONTINUE HANDLER FOR reprimary SET @x=1;
SET @ID=1;
INSERT INTO Employee(id,name,depid) VALUES(1,'陈',100);
SET @ID=2;
INSERT INTO Employee(id,name,depid) VALUES(6,'陈',100);
SET @ID=3;
END$$
DELIMITER ;
CALL Pro_Employee_insert();
SELECT @ID,@X;
MYSQL应用其中红色标示的是和上面不同的地方,这里定义条件使用的是SQL状态,也是主键重复的状态;并且这里使用的是CONTINUE便是遇到错误继续往下执行.
MYSQL应用
MYSQL应用 条件处理
MYSQL应用条件处理便是之间定义语句的错误的处理,省去了前面定义条件名称的步骤.
MYSQL应用
DECLARE handler_type HANDLER FOR condition_value[,...] sp_statement
handler_type:
CONTINUE| EXIT| UNDO
condition_value:
SQLSTATE [VALUE] sqlstate_value
| condition_name
| SQLWARNING
| NOT FOUND
| SQLEXCEPTION
| mysql_error_code
MYSQL应用handler_type:遇到差错是继续往下执行还是终止,目前UNDO还没用到.
MYSQL应用CONTINUE:继续往下执行
MYSQL应用EXIT:终止执行
MYSQL应用condition_values:差错状态
MYSQL应用SQLSTATE [VALUE] sqlstate_value:便是前面讲到的SQL错误状态,例如主键重复状态SQLSTATE '23000'
MYSQL应用condition_name:上面讲到的定义条件名称;
MYSQL应用SQLWARNING:是对所有以01开头的SQLSTATE代码的速记,例如:DECLARE CONTINUE HANDLER FOR SQLWARNING.
MYSQL应用NOT FOUND:是对所有以02开头的SQLSTATE代码的速记.
MYSQL应用SQLEXCEPTION:是对所有没有被SQLWARNING或NOT FOUND捕捉的SQLSTATE代码的速记.
MYSQL应用mysql_error_code:是差错代码,例如主键重复的差错代码是1062,DECLARE CONTINUE HANDLER FOR 1062
MYSQL应用 语句:
MYSQL应用
DROP PROCEDURE IF EXISTS Pro_Employee_insert;
DELIMITER $$
CREATE PROCEDURE Pro_Employee_insert()
MODIFIES SQL DATA
SQL SECURITY INVOKER
BEGIN
#引用前面定义的条件名称并做赋值处理
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET @x=2;
#开始事务必需在DECLARE之后
START TRANSACTION ;
SET @ID=1;
INSERT INTO Employee(id,name,depid) VALUES(7,'陈',100);
SET @ID=2;
INSERT INTO Employee(id,name,depid) VALUES(6,'陈',100);
SET @ID=3;
IF @x=2 THEN
ROLLBACK;
ELSE
COMMIT;
END IF;
END$$
DELIMITER ;
#执行存储过程
CALL Pro_Employee_insert();
#查询
SELECT @ID,@X;
MYSQL应用
MYSQL应用通过SELECT @ID,@X可以知道存储过程已经执行到了最后,但是因为存储过程后面有做回滚操作整个语句进行了回滚,所以ID=7的符合条件的记录也被回滚了.
MYSQL应用总结
MYSQL应用变量的使用不仅仅只有这些,在光标中条件也是一个很好的功能,刚才测试的是continue如果使用EXIT的话语句执行完“SET @ID=2;”就不往下执行了,后面的IF也不被执行整个语句不会被回滚,但是使用CONTINE当出现差错后还是会往下执行如果后面的语句还有很多的话整个回滚的过程将会很长,在这里可以利用循环,当出现差错立刻退出循环执行后面的if回滚操作,在下一篇讲循环语句会写到,欢迎关注.
维易PHP培训学院每天发布《Mysql实例理解MySQL变量和条件》等实战技能,PHP、MYSQL、LINUX、APP、JS,CSS全面培养人才。
转载请注明本页网址:
http://www.vephp.com/jiaocheng/8043.html