第八章 MySQL存儲過程

MySQL存儲過程.png

一、存儲過程

1.定義

存儲過程是SQL語句和控制語句的預編譯集合,以一個名稱存儲并作為一個單元處理

2.存儲過程的優(yōu)點

  • 增強SQL語句的功能和靈活性
  • 實現(xiàn)較快的執(zhí)行速度
  • 減少網(wǎng)絡流量

3.創(chuàng)建存儲過程

CREATE
[DEFINER = {user|CURRENT_USER}]
PROCEDURE sp_name([proc_parameter[,...]])
[characteristic ...] routine_body

proc_parameter:
[IN|OUT|INOUT] param_name type

4.參數(shù)

  • IN,表示該參數(shù)的值必須在調用存儲過程時指定
  • OUT,表示該參數(shù)的值可以被存儲過程改變,并且可以返回
  • INOUT,表示該參數(shù)在調用時指定,并且可以被改變和返回

5.特性

COMMENT 'string'
|{CONTAINS SQL| NO SQL| READS SQL DATA| MODIFIES SQL DATA
|SQL SECURITY{DEFINER| INVOKER}}

  • COMMENT:注釋
  • CONTAINS SQL:包含SQL語句,但不包含讀或寫數(shù)據(jù)的語句
  • NO SQL:不包含SQL語句
  • READS SQL DATA:包含讀數(shù)據(jù)的語句
  • MODIFIES SQL DATA:包含寫數(shù)據(jù)的語句
  • SQL SECURITY{DEFINER| INVOKER}指明誰有權限來執(zhí)行

6.過程體

  • 過程體由合法SQL語句構成
  • 過程體可以是任意SQL語句
  • 過程體如果為復合結構則使用BEGIN...END語句
  • 復合結構可以包含聲明,循環(huán),控制結構

二、MySQL創(chuàng)建存儲過程

1.MySQL創(chuàng)建不帶參數(shù)的存儲過程

創(chuàng)建

example:

CREATE PROCEDURE sp1() SELECT VERSION();
調用存儲過程
CALL sp_name([parameter[,...]])
CALL sp_name[()]

example:

CALL sp1;
/*Result
+------------+
| VERSION()  |
+------------+
| 5.7.17-log |
+------------+
*/

2.MySQL創(chuàng)建帶有IN參數(shù)的存儲過程

example:

DELIMITER //
CREATE PROCEDURE removeUserById(IN p_id INT UNSIGNED)
BEGIN
DELETE FROM users WHERE id = p_id;
END
//
DELIMITER ;
CALL removeUserById(3);
SELECT * FROM users;
/* Result
+----+------+----------------------------------+------+------+
| id | name | password                         | age  | sex  |
+----+------+----------------------------------+------+------+
|  1 | A    | 202cb962ac59075b964b07152d234b70 |   25 |    1 |
|  2 | B    | 250cf8b51c773f3f8dc8b4be867a9a02 |   24 |    1 |
|  4 | D    | 38b3eff8baf56627478ec76a704e9b52 |   25 |    1 |
|  5 | E    | ec8956637a99787bd197eacd77acce5e |   27 |    0 |
|  6 | F    | 6974ce5ac660610b44d9b9fed0ff9548 |   21 |    1 |
|  7 | G    | c9e1074f5b3f9fc8ea15d152add07294 |   20 |    0 |
|  8 | H    | 65b9eea6e1cc6bb9f0cd2a47751a186f |   23 |    1 |
|  9 | J    | f0935e4cd5920aa6c7c996a5ee53a70f |   18 |    1 |
| 10 | K    | a97da629b098b75c294dffdc3e463904 |   30 |    0 |
| 11 | L    | a3c65c2974270fd093ee8a9bf8ae7d0b |    8 |    0 |
| 12 | M    | 2723d092b63885e0d7c260cc007e8b9d |   12 |    1 |
| 13 | N    | 3644a684f98ea8fe223c713b77189a77 |   27 |    1 |
| 14 | P    | 94f6d7e04a4d452035300f18b984988c |   26 |    0 |
| 15 | Q    | 18d8042386b79e2c279fd162df0205c8 |   25 |    0 |
| 16 | R    | cee631121c2ec9232f3a2f028ad5c89b |   23 |    0 |
| 17 | S    | d490d7b4576290fa60eb31b5fc917ad1 |   25 |    1 |
+----+------+----------------------------------+------+------+
*/

3.MySQL創(chuàng)建帶有IN和OUT類型參數(shù)的存儲過程

example:

DELIMITER //
CREATE PROCEDURE removeUserANDReturnUserNums(IN p_id INT UNSIGNED, OUT userNums INT UNSIGNED)
BEGIN
DELETE FROM users WHERE id = p_id;
SELECT count(id) FROM users INTO userNums;
END
//
DELIMITER ;
CALL removeUserANDReturnUserNums(17, @nums);
SELECT @nums;
/*Result
+-------+
| @nums |
+-------+
|    15 |
+-------+
*/

4.創(chuàng)建帶有多個OUT類型參數(shù)的存儲過程

example:

DELIMITER //
CREATE PROCEDURE removeUserByAgeAndReturnInfos(IN p_age SMALLINT UNSIGNED, OUT deleteUsers SMALLINT UNSIGNED, OUT userCounts SMALLINT UNSIGNED)
BEGIN
DELETE FROM users WHERE age = p_age;
SELECT ROW_COUNT() INTO deleteUsers;
SELECT COUNT(id) FROM users INTO userCounts;
END
//
DELIMITER ;
CAll removeUserByAgeAndReturnInfos(20, @a, @b);
SELECT @a, @b;
/*Result
+------+------+
| @a   | @b   |
+------+------+
|    1 |   14 |
+------+------+
*/

5.MySQL存儲過程與自定義函數(shù)的區(qū)別

  • 存儲過程實現(xiàn)的功能要復雜一些;而函數(shù)的針對性更強
  • 存儲過程可以返回多個值;函數(shù)只能有一個返回值
  • 存儲過程一般獨立的來執(zhí)行;而函數(shù)可以作為其他SQL語句的組成部分來出現(xiàn)。

6.修改存儲過程

ALTER PROCEDURE sp_name [characteristic ...]
COMMENT 'string'
|{CONTAINS SQL| NO SQL| READS SQL DATA| MODIFIES SQL DATA
|SQL SECURITY{DEFINER| INVOKER}}

7.刪除存儲過程

DROP PROCEDURE [IF EXISTS] sp_name;

三、小結

  1. 存儲過程:是SQL語句和控制語句的預編譯集合,以一個名稱存儲并作為一個單元處理。
  2. 參數(shù):輸入類型 輸出類型 輸入&&輸出
  3. 創(chuàng)建:CREATE ...... PROCEDURE ......
  4. 注意事項
  • 創(chuàng)建存儲過程或者自定義函數(shù)時需要通過DELIMITER語句修改界定符。
  • 如果函數(shù)體或過程體有多個語句,需要包含在BEGIN......END語句塊中。
  • 存儲過程通過call來調用。
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • 課程回顧 自定義函數(shù):簡稱UDF;是對MySQL擴展的一種途徑 創(chuàng)建自定義函數(shù):CREATE FUNCTION.....
    齊天大圣李圣杰閱讀 757評論 0 0
  • MYSQL 基礎知識 1 MySQL數(shù)據(jù)庫概要 2 簡單MySQL環(huán)境 3 數(shù)據(jù)的存儲和獲取 4 MySQL基本操...
    Kingtester閱讀 8,060評論 5 115
  • 自行創(chuàng)建一個員工信息表info,里面記錄著員工姓名,年齡,地址以及工資,下面的實驗要使用。 mysql> crea...
    張偉科閱讀 1,489評論 0 2
  • 任務需求:定時執(zhí)行的任務,調用存儲過程,進行數(shù)據(jù)遷移。 存儲過程相關總結:(存儲過程的創(chuàng)建 不能伴隨有if exi...
    時待吾閱讀 3,209評論 0 4
  • 當一個大型系統(tǒng)在建立時,會發(fā)現(xiàn),很多的SQL操作是有重疊的,個別計算是相同的,比如:業(yè)務系統(tǒng)中,計算一張工單的計算...
    JackFrost_fuzhu閱讀 3,517評論 0 27

友情鏈接更多精彩內容