MySql存儲過程及MySql常用流程控制語法


/*
該代碼是創建了一個名叫"p4"的存儲過程並設置了s1,s2,s3兩個int型一個varchar型參數,還可以是其他數據類型,內部創建了x1,x2兩個變量

DELIMITER是修改分隔符的
DELIMITER $$的意思是把默認分隔符";"換成"$$",這樣分段寫的存儲過程就能整個被執行,而不是被當成多條sql語句單獨執行
創建完過程再將分隔符改回成";"

兩種創建變量並賦值的方式
SET @變量名 = 值;
SELECT 值 INTO @變量名;
使用變量前必須先運行該變量賦值語句
過程內部還可以通過 "DECLARE 變量名 類型(字符串型要加范圍) DEFAULT 值;" 來創建變量,但如此創建的變量只能在該過程內部訪問

存儲過程只有三種類型參數 IN,OUT,INOUT
調用過程時過程有幾個參數傳幾個參數,只是IN型的參數可以傳的是變量,可以是常量,而OUT和INOUT型的參數傳的必須是變量
傳給out,inout參數的變量值會隨着在過程中改變在外部也改變,而給in參數的變量外部值則不受過程內變量值改變的影響
*/
DELIMITER $$

DROP PROCEDURE IF EXISTS `p4`$$

CREATE PROCEDURE `p4`(IN s1 INT,OUT s2 INT,INOUT s3 VARCHAR(10))
BEGIN
DECLARE x1 VARCHAR(10) DEFAULT 'this is x1'; 
DECLARE x2 VARCHAR(10) DEFAULT 'this is x2'; 
SET s1 = 11;
SET s2 = 22;
SET s3 = 'iss3';

/*
if語法
*/
IF s1 = 11 AND s2 = 12 THEN
SELECT s1,s2;
END IF;

IF s3 = 's3' OR s1 = s2 THEN
SELECT s3;
ELSE 
SELECT s1,s2,s3;
END IF;

/*
case語法
*/
CASE s3
WHEN 's1' THEN
SELECT 'this is s1';
WHEN 's2' THEN
SELECT 'this is s2';
ELSE
SELECT 'this is s3';
END CASE;

/*
while循環
*/
WHILE s1>1 DO
SET s1=s1-1;
END WHILE; 
SELECT s1;

/*
repeat循環語句
與while不同的是while滿足條件就執行,repeat始終執行直到滿足條件終止
*/
REPEAT  
SET s1 = s1-1; 
UNTIL s1=1  
END REPEAT; 
SELECT s1;


/*
LOOP循環
LOOP沒有循環條件,會不停的循環直到遇到 "LEAVE ZiDingYi;" "ZiDingYi"是自定義的LOOP標記
*/
ZiDingYi:LOOP
SET s1 = s1+1;
IF s1 = 5 THEN
LEAVE ZiDingYi;
END IF;
END LOOP;
SELECT s1;


END$$

DELIMITER ;


SET @p_in=1; 
SET @p_out=2;
SET @p_inout = 's3';
SELECT 'Hello World1' INTO @p_4;

/*調用存儲過程*/
CALL p4(@p_in,@p_out,@p_inout);
SELECT @p_in,@p_out,@p_inout,@p_4;


/*
存儲過程如果只有一個語句則語句不用 begin...end包圍
存儲過程中可以直接使用外部定義的變量
存儲過程中用set和select定義的變量就是全局的,執行該過程后內部用set和select定義的變量外部可以訪問,其他過程也可以直接使用
*/
CREATE PROCEDURE p1()   SET @var='p1';  
CREATE PROCEDURE p2() SELECT CONCAT('Last procedure was ',@var);  
CALL p1();  
CALL p2(); 
SELECT @var;

CREATE PROCEDURE p3() SELECT CONCAT(@p3_var,' World');
SET @p3_var='Hello';
CALL p3();

/*刪除存儲過程*/
DROP PROCEDURE p4;
/*或者*/
DROP PROCEDURE IF EXISTS `p4`

/*查看該數據庫下有哪些存儲過程 test為數據庫名*/
SELECT NAME FROM mysql.proc WHERE db='test';
/*或者*/
SHOW PROCEDURE STATUS WHERE db='test';

/*查看存儲過程詳細信息,包括創建語句*/
SHOW CREATE PROCEDURE p4;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM