亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 數據庫 > MySQL > 正文

理解MySQL變量和條件

2024-07-24 13:08:57
字體:
來源:轉載
供稿:網友
這篇文章主要幫助大家深入理解MySQL變量和條件,感興趣的小伙伴們可以參考一下
 

一、概述 

 變量在存儲過程中會經常被使用,變量的使用方法是一個重要的知識點,特別是在定義條件這塊比較重要。

 mysql版本:5.6

二、變量定義和賦值 

#創建數據庫DROP DATABASE IF EXISTS Dpro;CREATE DATABASE DproCHARACTER 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);

declare定義變量

在存儲過程和函數中通過declare定義變量在BEGIN...END中,且在語句之前。并且可以通過重復定義多個變量

注意:declare定義的變量名不能帶‘@'符號,mysql在這點做的確實不夠直觀,往往變量名會被錯成參數或者字段名。

DECLARE var_name[,...] type [DEFAULT value]
例如:

DROP PROCEDURE IF EXISTS Pro_Employee;DELIMITER $$CREATE PROCEDURE Pro_Employee(IN pdepid VARCHAR(20),OUT pcount INT )READS SQL DATASQL SECURITY INVOKERBEGINDECLARE pname VARCHAR(20) DEFAULT '陳';SELECT COUNT(id) INTO pcount FROM Employee WHERE depid=pdepid;END$$DELIMITER ;

SET變量賦值

SET除了可以給已經定義好的變量賦值外,還可以指定賦值并定義新變量,且SET定義的變量名可以帶‘@'符號,SET語句的位置也是在BEGIN ....END之間的語句之前。

1.變量賦值

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 DATASQL SECURITY INVOKERBEGINDECLARE 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,變量,條件

2.通過賦值定義變量

DROP PROCEDURE IF EXISTS Pro_Employee;DELIMITER $$CREATE PROCEDURE Pro_Employee(IN pdepid VARCHAR(20),OUT pcount INT )READS SQL DATASQL SECURITY INVOKERBEGINDECLARE 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,變量,條件

SELECT ... INTO語句賦值

 通過select into語句可以將值賦予變量,也可以之間將該值賦值存儲過程的out參數,上面的存儲過程select into就是之間將值賦予out參數。

DROP PROCEDURE IF EXISTS Pro_Employee;DELIMITER $$CREATE PROCEDURE Pro_Employee(IN pdepid VARCHAR(20),OUT pcount INT )READS SQL DATASQL SECURITY INVOKERBEGINDECLARE 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);

這個存儲過程就是select into將值賦予變量;

 MySQL,變量,條件

表中并沒有depid=101 and name='陳'的記錄。

三、條件 

條件的作用一般用在對指定條件的處理,比如我們遇到主鍵重復報錯后該怎樣處理。

定義條件

 定義條件就是事先定義某種錯誤狀態或者sql狀態的名稱,然后就可以引用該條件名稱開做條件處理,定義條件一般用的比較少,一般會直接放在條件處理里面。

DECLARE condition_name CONDITION FOR condition_value condition_value:  SQLSTATE [VALUE] sqlstate_value | mysql_error_code

1.沒有定義條件:

DROP PROCEDURE IF EXISTS Pro_Employee_insert;DELIMITER $$CREATE PROCEDURE Pro_Employee_insert()MODIFIES SQL DATASQL SECURITY INVOKERBEGINSET @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,變量,條件

報主鍵重復的錯誤,其中1062是主鍵重復的錯誤代碼,23000是sql錯誤狀態

MySQL,變量,條件

2.定義處理條件

DROP PROCEDURE IF EXISTS Pro_Employee_insert;DELIMITER $$CREATE PROCEDURE Pro_Employee_insert()MODIFIES SQL DATASQL SECURITY INVOKERBEGIN#定義條件名稱,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;

在執行存儲過程的步驟中并沒有報錯,但是由于我定義的是exit,所以在遇到報錯sql就終止往下執行了。

MySQL,變量,條件

接下來看看continue的不同

DROP PROCEDURE IF EXISTS Pro_Employee_insert;DELIMITER $$CREATE PROCEDURE Pro_Employee_insert()MODIFIES SQL DATASQL SECURITY INVOKERBEGIN#定義條件名稱,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;

其中紅色標示的是和上面不同的地方,這里定義條件使用的是SQL狀態,也是主鍵重復的狀態;并且這里使用的是CONTINUE就是遇到錯誤繼續往下執行。

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

handler_type:遇到錯誤是繼續往下執行還是終止,目前UNDO還沒用到。

CONTINUE:繼續往下執行

EXIT:終止執行

condition_values:錯誤狀態

SQLSTATE [VALUE] sqlstate_value:就是前面講到的SQL錯誤狀態,例如主鍵重復狀態SQLSTATE '23000'

condition_name:上面講到的定義條件名稱;

SQLWARNING:是對所有以01開頭的SQLSTATE代碼的速記,例如:DECLARE CONTINUE HANDLER FOR SQLWARNING。

NOT FOUND:是對所有以02開頭的SQLSTATE代碼的速記。

SQLEXCEPTION:是對所有沒有被SQLWARNING或NOT FOUND捕獲的SQLSTATE代碼的速記。

mysql_error_code:是錯誤代碼,例如主鍵重復的錯誤代碼是1062,DECLARE CONTINUE HANDLER FOR 1062

 語句:

DROP PROCEDURE IF EXISTS Pro_Employee_insert;DELIMITER $$CREATE PROCEDURE Pro_Employee_insert()MODIFIES SQL DATASQL SECURITY INVOKERBEGIN#引用前面定義的條件名稱并做賦值處理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,變量,條件

通過SELECT @ID,@X可以知道存儲過程已經執行到了最后,但是因為存儲過程后面有做回滾操作整個語句進行了回滾,所以ID=7的符合條件的記錄也被回滾了。

總結 

變量的使用不僅僅只有這些,在光標中條件也是一個很好的功能,剛才測試的是continue如果使用EXIT的話語句執行完“SET @ID=2;”就不往下執行了,后面的IF也不被執行整個語句不會被回滾,但是使用CONTINE當出現錯誤后還是會往下執行如果后面的語句還有很多的話整個回滾的過程將會很長,在這里可以利用循環,當出現錯誤立刻退出循環執行后面的if回滾操作,在下一篇講循環語句會寫到,歡迎關注。



發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩激情第一页| 国产精品视频在线观看| 久久久久国产精品一区| 成人免费淫片aa视频免费| 亚洲最新在线视频| 亚洲成人中文字幕| 日韩欧美在线视频观看| 欧美在线激情视频| 久久久久久亚洲精品中文字幕| 成人黄色短视频在线观看| 国内精品免费午夜毛片| 亚洲欧美国产高清va在线播| 亚洲日本欧美中文幕| 欧美日韩一区免费| 亚洲激情在线观看视频免费| 亚洲视频在线观看| 91美女高潮出水| 国产亚洲日本欧美韩国| 色噜噜狠狠色综合网图区| 国产精品一区二区久久久| 91老司机在线| 欧美乱大交做爰xxxⅹ性3| 久久免费视频观看| 91天堂在线观看| 国产精品久久视频| 亚洲天堂第二页| 日本最新高清不卡中文字幕| 日韩最新在线视频| 久久久午夜视频| 日韩av综合网| y97精品国产97久久久久久| 亚洲视频在线免费观看| 国内精品国产三级国产在线专| 久久精品久久久久久| 中文字幕亚洲一区二区三区| 久久久精品免费视频| 亚洲精品乱码久久久久久按摩观| 亚洲欧美国产高清va在线播| 久久精品中文字幕免费mv| 国产精品免费看久久久香蕉| 精品性高朝久久久久久久| 亚洲综合精品一区二区| 国产精品99久久99久久久二8| 欧美性xxxxxx| 国产小视频国产精品| 欧美日韩国产中文精品字幕自在自线| 久久精品欧美视频| 成人av在线天堂| 亚洲欧美日韩一区二区在线| 欧美精品制服第一页| 俺去啦;欧美日韩| 精品久久久视频| 色99之美女主播在线视频| www.美女亚洲精品| 亚洲第一区第一页| 久热在线中文字幕色999舞| 在线免费看av不卡| 最近中文字幕mv在线一区二区三区四区| 茄子视频成人在线| 欧美一级片久久久久久久| 欧洲精品久久久| 日韩精品在线视频观看| 日韩精品免费在线视频| 欧美亚洲国产精品| 欧美午夜激情在线| 欧美激情国产日韩精品一区18| 亚洲成人xxx| 日韩在线视频一区| 国产999视频| 久久久久久久久久久久久久久久久久av| 国产精品午夜国产小视频| 91在线国产电影| 在线日韩日本国产亚洲| 亚洲国产日韩一区| 成人网在线视频| 黑人巨大精品欧美一区免费视频| 久久久久国产精品免费| 亚洲国产中文字幕久久网| 国产精品久久久av久久久| 国产网站欧美日韩免费精品在线观看| 国产精品 欧美在线| 亚洲欧美国产高清va在线播| 亚洲一区二区免费| 国产精品欧美激情在线播放| 久久777国产线看观看精品| 久久精品电影一区二区| 亚洲人av在线影院| 欧美精品激情在线观看| 亚洲免费视频观看| 亚洲第五色综合网| 欧美激情一区二区久久久| 日韩天堂在线视频| 国产99久久精品一区二区 夜夜躁日日躁| 2025国产精品视频| 久久99精品久久久久久青青91| 欧美日韩免费区域视频在线观看| 国产成人久久精品| 国产日韩中文字幕在线| 日韩大陆欧美高清视频区| 日韩一区二区精品视频| 91av在线影院| 亚洲欧美国产精品专区久久| 日韩国产在线播放| 性色av一区二区三区红粉影视| 性夜试看影院91社区| 欧美成人手机在线| 国产精品亚洲激情| 国产精品久久久久久久av大片| 国产最新精品视频| 中文字幕亚洲欧美日韩高清| 岛国视频午夜一区免费在线观看| 欧美在线一级视频| 国产精品美女视频网站| 欧美成人久久久| 成人免费在线网址| 欧美性xxxxx| 91青草视频久久| 91wwwcom在线观看| 亚洲天堂网站在线观看视频| yw.139尤物在线精品视频| 亚洲国语精品自产拍在线观看| 国产乱肥老妇国产一区二| 91免费高清视频| 欧美亚洲国产日本| 久久久久久网站| 一个人看的www久久| 亚洲男女自偷自拍图片另类| 亚洲福利视频免费观看| 97成人精品区在线播放| 午夜精品久久久久久久久久久久久| 成人免费视频97| 九九精品视频在线| 成人在线国产精品| 国产精品视频色| 国产精品欧美亚洲777777| 国产亚洲一区二区在线| 久久99久久99精品免观看粉嫩| 成人亚洲欧美一区二区三区| 日本伊人精品一区二区三区介绍| 国产香蕉一区二区三区在线视频| 日韩av一区二区在线| 蜜月aⅴ免费一区二区三区| 欧美亚洲成人xxx| 国产丝袜一区二区三区| 国产精品久久久久久五月尺| 国产精品九九久久久久久久| 亚洲精品视频免费在线观看| 日韩欧美亚洲范冰冰与中字| 成人免费黄色网| 久久久亚洲影院| 欧美黄网免费在线观看| 亚洲视频电影图片偷拍一区| 国产精品日韩av| 国产精品亚洲аv天堂网| 国产91在线播放九色快色| 57pao国产成人免费| 国产精品久久色| 精品视频偷偷看在线观看| 国产成人在线视频| 亚洲xxxx妇黄裸体| 欧美成人一区在线| 亚洲人成77777在线观看网| 亚洲综合在线小说| 国产精品91免费在线|