程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> 懂得MySQL變量和前提

懂得MySQL變量和前提

編輯:MySQL綜合教程

懂得MySQL變量和前提。本站提示廣大學習愛好者:(懂得MySQL變量和前提)文章只能為提供參考,不一定能成為您想要的結果。以下是懂得MySQL變量和前提正文


1、概述 

 變量在存儲進程中會常常被應用,變量的應用辦法是一個主要的常識點,特殊是在界說前提這塊比擬主要。

 mysql版本:5.6

2、變量界說和賦值 

#創立數據庫
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);

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 DATA
SQL SECURITY INVOKER
BEGIN
DECLARE 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 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;

 

2.經由過程賦值界說變量

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);


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 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);

這個存儲進程就是select into將值付與變量;

 

表中並沒有depid=101 and name='陳'的記載。

3、前提 

前提的感化普通用在對指定前提的處置,好比我們碰到主鍵反復報錯後該如何處置。

界說前提

 界說前提就是事前界說某種毛病狀況或許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 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;

報主鍵反復的毛病,個中1062是主鍵反復的毛病代碼,23000是sql毛病狀況

2.界說處置前提

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;

在履行存儲進程的步調中並沒有報錯,然則因為我界說的是exit,所以在碰到報錯sql就終止往下履行了。

接上去看看continue的分歧

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;

個中白色標示的是和下面分歧的處所,這裡界說前提應用的是SQL狀況,也是主鍵反復的狀況;而且這裡應用的是CONTINUE就是碰到毛病持續往下履行。

 前提處置

前提處置就是之間界說語句的毛病的處置,省去了後面界說前提稱號的步調。

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 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;

經由過程SELECT @ID,@X可以曉得存儲進程曾經履行到了最初,然則由於存儲進程前面有做回滾操作全部語句停止了回滾,所以ID=7的相符前提的記載也被回滾了。

總結 

變量的應用不只僅只要這些,在光標中前提也是一個很好的功效,適才測試的是continue假如應用EXIT的話語句履行完“SET @ID=2;”就不往下履行了,前面的IF也不被履行全部語句不會被回滾,然則應用CONTINE當湧現毛病後照樣會往下履行假如前面的語句還有許多的話全部回滾的進程將會很長,在這裡可以應用輪回,當湧現毛病連忙加入輪回履行前面的if回滾操作,鄙人一篇講輪回語句會寫到,迎接存眷。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved