《Mysql實(shí)例理解MySQL變量和條件》要點(diǎn):
本文介紹了Mysql實(shí)例理解MySQL變量和條件,希望對您有用。如果有疑問,可以聯(lián)系我們。
MYSQL應(yīng)用一、概述?
MYSQL應(yīng)用?變量在存儲過程中會經(jīng)常被使用,變量的使用辦法是一個(gè)重要的知識點(diǎn),特別是在定義條件這塊比較重要.
MYSQL應(yīng)用?mysql版本:5.6
MYSQL應(yīng)用二、變量定義和賦值?
MYSQL應(yīng)用
#創(chuàng)建數(shù)據(jù)庫
DROP DATABASE IF EXISTS Dpro;
CREATE DATABASE Dpro
CHARACTER SET utf8
;
USE Dpro;
#創(chuàng)建部分表
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應(yīng)用declare定義變量
MYSQL應(yīng)用在存儲過程和函數(shù)中通過declare定義變量在BEGIN...END中,且在語句之前.而且可以通過重復(fù)定義多個(gè)變量
MYSQL應(yīng)用注意:declare定義的變量名不克不及帶‘@'符號,mysql在這點(diǎn)做的確實(shí)不夠直觀,往往變量名會被錯成參數(shù)或者字段名.
MYSQL應(yīng)用DECLARE var_name[,...] type [DEFAULT value]
例如:
MYSQL應(yīng)用
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應(yīng)用SET變量賦值
MYSQL應(yīng)用SET除了可以給已經(jīng)定義好的變量賦值外,還可以指定賦值并定義新變量,且SET定義的變量名可以帶‘@'符號,SET語句的位置也是在BEGIN ....END之間的語句之前.
MYSQL應(yīng)用1.變量賦值
MYSQL應(yīng)用
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應(yīng)用
MYSQL應(yīng)用2.通過賦值定義變量
MYSQL應(yīng)用
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應(yīng)用
MYSQL應(yīng)用SELECT ... INTO語句賦值
MYSQL應(yīng)用?通過select into語句可以將值賦予變量,也可以之間將該值賦值存儲過程的out參數(shù),上面的存儲過程select into便是之間將值賦予out參數(shù).
MYSQL應(yīng)用
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應(yīng)用這個(gè)存儲過程便是select into將值賦予變量;
MYSQL應(yīng)用?
MYSQL應(yīng)用表中并沒有depid=101 and name='陳'的記錄.
MYSQL應(yīng)用三、條件?
MYSQL應(yīng)用條件的作用一般用在對指定條件的處理,好比我們遇到主鍵重復(fù)報(bào)錯后該怎樣處理.
MYSQL應(yīng)用定義條件
MYSQL應(yīng)用?定義條件就是事先定義某種錯誤狀態(tài)或者sql狀態(tài)的名稱,然后就可以引用該條件名稱開做條件處理,定義條件一般用的比擬少,一般會直接放在條件處理里面.
MYSQL應(yīng)用
DECLARE condition_name CONDITION FOR condition_value
condition_value:
SQLSTATE [VALUE] sqlstate_value
| mysql_error_code
MYSQL應(yīng)用1.沒有定義條件:
MYSQL應(yīng)用
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 ;
#執(zhí)行存儲過程
CALL Pro_Employee_insert();
#查詢變量值
SELECT @ID,@X;
MYSQL應(yīng)用
MYSQL應(yīng)用報(bào)主鍵重復(fù)的差錯,其中1062是主鍵重復(fù)的差錯代碼,23000是sql差錯狀態(tài)
MYSQL應(yīng)用
MYSQL應(yīng)用2.定義處理?xiàng)l件
MYSQL應(yīng)用
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應(yīng)用在執(zhí)行存儲過程的步調(diào)中并沒有報(bào)錯,但是由于我定義的是exit,所以在遇到報(bào)錯sql就終止往下執(zhí)行了.
MYSQL應(yīng)用
MYSQL應(yīng)用接下來看看continue的分歧
MYSQL應(yīng)用
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應(yīng)用其中紅色標(biāo)示的是和上面不同的地方,這里定義條件使用的是SQL狀態(tài),也是主鍵重復(fù)的狀態(tài);并且這里使用的是CONTINUE便是遇到錯誤繼續(xù)往下執(zhí)行.
MYSQL應(yīng)用
MYSQL應(yīng)用?條件處理
MYSQL應(yīng)用條件處理便是之間定義語句的錯誤的處理,省去了前面定義條件名稱的步驟.
MYSQL應(yīng)用
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應(yīng)用handler_type:遇到差錯是繼續(xù)往下執(zhí)行還是終止,目前UNDO還沒用到.
MYSQL應(yīng)用CONTINUE:繼續(xù)往下執(zhí)行
MYSQL應(yīng)用EXIT:終止執(zhí)行
MYSQL應(yīng)用condition_values:差錯狀態(tài)
MYSQL應(yīng)用SQLSTATE [VALUE] sqlstate_value:便是前面講到的SQL錯誤狀態(tài),例如主鍵重復(fù)狀態(tài)SQLSTATE '23000'
MYSQL應(yīng)用condition_name:上面講到的定義條件名稱;
MYSQL應(yīng)用SQLWARNING:是對所有以01開頭的SQLSTATE代碼的速記,例如:DECLARE CONTINUE HANDLER FOR SQLWARNING.
MYSQL應(yīng)用NOT FOUND:是對所有以02開頭的SQLSTATE代碼的速記.
MYSQL應(yīng)用SQLEXCEPTION:是對所有沒有被SQLWARNING或NOT FOUND捕捉的SQLSTATE代碼的速記.
MYSQL應(yīng)用mysql_error_code:是差錯代碼,例如主鍵重復(fù)的差錯代碼是1062,DECLARE CONTINUE HANDLER FOR 1062
MYSQL應(yīng)用?語句:
MYSQL應(yīng)用
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;
#開始事務(wù)必需在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 ;
#執(zhí)行存儲過程
CALL Pro_Employee_insert();
#查詢
SELECT @ID,@X;
MYSQL應(yīng)用
MYSQL應(yīng)用通過SELECT @ID,@X可以知道存儲過程已經(jīng)執(zhí)行到了最后,但是因?yàn)榇鎯^程后面有做回滾操作整個(gè)語句進(jìn)行了回滾,所以ID=7的符合條件的記錄也被回滾了.
MYSQL應(yīng)用總結(jié)?
MYSQL應(yīng)用變量的使用不僅僅只有這些,在光標(biāo)中條件也是一個(gè)很好的功能,剛才測試的是continue如果使用EXIT的話語句執(zhí)行完“SET @ID=2;”就不往下執(zhí)行了,后面的IF也不被執(zhí)行整個(gè)語句不會被回滾,但是使用CONTINE當(dāng)出現(xiàn)差錯后還是會往下執(zhí)行如果后面的語句還有很多的話整個(gè)回滾的過程將會很長,在這里可以利用循環(huán),當(dāng)出現(xiàn)差錯立刻退出循環(huán)執(zhí)行后面的if回滾操作,在下一篇講循環(huán)語句會寫到,歡迎關(guān)注.
維易PHP培訓(xùn)學(xué)院每天發(fā)布《Mysql實(shí)例理解MySQL變量和條件》等實(shí)戰(zhàn)技能,PHP、MYSQL、LINUX、APP、JS,CSS全面培養(yǎng)人才。
轉(zhuǎn)載請注明本頁網(wǎng)址:
http://www.fzlkiss.com/jiaocheng/8043.html