1. 程式人生 > 實用技巧 >MySQL之儲存過程

MySQL之儲存過程

什麼是儲存過程

介紹:

  經過預先編譯並存儲在資料庫中的一段SQL語句的集合,理解成批處理語句。

好處:

  1. 提高了sql語句的重用性,減少了開發人員的壓力。

  2. 減少資料在資料庫和應用伺服器之間的傳輸。

  3. 提高了資料處理的效率。

分類:

  1. 無返回無參。

  2. 僅僅帶in型別,無返回有參。

  3. 僅僅帶out型別,有返回無參。

  4. 既帶in又帶out,有返回有參。

  5. inout,有返回有參。

提示:in、out、inout都可以在一個儲存過程中帶多個。

建立儲存過程

語法:

  CREATE PROCEDURE 儲存過程名(引數列表)

  BEGIN

    儲存過程體(一組合法的SQL

語句)

  END

引數列表:

  引數模式 引數名 引數型別(例如:in stuname varchar(20))

引數模式:

  in:該引數可以作為輸入,也就是該引數需要呼叫方傳入值。

  out:該引數可以作為輸出,也就是該引數可以作為返回值。

  inout:該引數既可以作為輸入又可以作為輸出,也就是該引數既需要傳入值,又可以返回值。

設定新的結束標記:  

  delimiter 新的結束標記(例如:delimiter $

程式碼示例:

delimiter $

CREATE PROCEDURE 儲存過程名(IN|OUT|INOUT 引數名  引數型別,...)
BEGIN
    sql語句1;
    sql語句2;

END $

提示:

如果儲存過程體僅僅只有一句話,begin end可以省略。

儲存過程體中的每條sql語句的結尾要求必須加分號。

呼叫儲存過程

語法:

  CALL 儲存過程名(實參列表);

示例程式碼:

/*
 * 1.空參列表
 */
#案例:插入到admin表中五條記錄。
DELIMITER $
CREATE PROCEDURE myp1()
BEGIN
    INSERT INTO admin(username,`password`) 
    VALUES('john1','0000'),('lily','0000'),('rose','0000'),('jack','0000'),('tom','0000');
END $ #呼叫 CALL myp1()$ /* * 2.建立帶in模式引數的儲存過程 */ #案例1:建立儲存過程,實現根據女神名查詢對應的男神資訊。 CREATE PROCEDURE myp2(IN beautyName VARCHAR(20)) BEGIN SELECT bo.* FROM boys bo RIGHT JOIN beauty b ON bo.id = b.boyfriend_id WHERE b.name = beautyName; END $ #呼叫 CALL myp2('柳巖')$ #案例2:建立儲存過程,實現使用者是否登入成功。 CREATE PROCEDURE myp3(IN username VARCHAR(20),IN PASSWORD VARCHAR(20)) BEGIN DECLARE result INT DEFAULT 0;#宣告並初始化 SELECT COUNT(*) INTO result#賦值 FROM admin WHERE admin.username = username AND admin.password = PASSWORD; SELECT IF(result>0,'成功','失敗');#使用 END $ #呼叫 CALL myp3('張飛','8888')$ /* * 3.建立out模式引數的儲存過程 */ #案例1:根據輸入的女神名,返回對應的男神名。 CREATE PROCEDURE myp6(IN beautyName VARCHAR(20),OUT boyName VARCHAR(20)) BEGIN SELECT bo.boyname INTO boyname FROM boys bo RIGHT JOIN beauty b ON b.boyfriend_id = bo.id WHERE b.name=beautyName ; END $ #案例2:根據輸入的女神名,返回對應的男神名和魅力值。 CREATE PROCEDURE myp7(IN beautyName VARCHAR(20),OUT boyName VARCHAR(20),OUT usercp INT) BEGIN SELECT boys.boyname ,boys.usercp INTO boyname,usercp FROM boys RIGHT JOIN beauty b ON b.boyfriend_id = boys.id WHERE b.name = beautyName; END $ #呼叫 CALL myp7('小昭',@name,@cp)$ SELECT @name,@cp$ /* * 4.建立帶inout模式引數的儲存過程 */ #案例1:傳入a和b兩個值,最終a和b都翻倍並返回。 CREATE PROCEDURE myp8(INOUT a INT ,INOUT b INT) BEGIN SET a=a*2; SET b=b*2; END $ #呼叫 SET @m=10$ SET @n=20$ CALL myp8(@m,@n)$ SELECT @m,@n$

刪除儲存過程

語法:

  DROP PROCEDURE 儲存過程名;

程式碼示例:

DROP PROCEDURE p1;

DROP PROCEDURE p2,p3;

檢視儲存過程的資訊

語法一:

  DESC 儲存過程名;

語法二:

  SHOW CREATE PROCEDURE 儲存過程名;

示例程式碼:

DESC myp2;

SHOW CREATE PROCEDURE  myp2;