MySQL學習——操作存盤程序
摘要:本文主要學習了使用DDL陳述句操作存盤程序的方法,
了解存盤程序
是什么
存盤程序是一組為了完成特定功能的SQL陳述句集合,
使用存盤程序的目的是將常用或復雜的作業預先用SQL陳述句寫好并用一個指定名稱存盤起來,這個程序經編譯和優化后存盤在資料庫服務器中,因此稱為存盤程序,
優點
1)封裝性
存盤程序被創建后,可以在程式中被多次呼叫,而不必重新撰寫該存盤程序的SQL陳述句,并且資料庫專業人員可以隨時對存盤程序進行修改,而不會影響到呼叫它的應用程式源代碼,
2)可增強SQL陳述句的功能和靈活性
存盤程序可以用流程控制陳述句撰寫,有很強的靈活性,可以完成復雜的判斷和較復雜的運算,
3)可減少網路流量
由于存盤程序是在服務器端運行的,且執行速度快,因此當客戶計算機上呼叫該存盤程序時,網路中傳送的只是該呼叫陳述句,從而可降低網路負載,
4)高性能
存盤程序執行一次后,產生的二進制代碼就駐留在緩沖區,在以后的呼叫中,只需要從緩沖區中執行二進制代碼即可,從而提高了系統的效率和性能,
5)提高資料庫的安全性和資料的完整性
使用存盤程序可以完成所有資料庫操作,并且可以通過編程的方式控制資料庫資訊訪問的權限,
創建存盤程序
語法
1 create procedure 存盤程序名([引數]) 存盤程序體
說明
1)存盤程序名
存盤程序的名稱,默認在當前資料庫中創建,若需要在特定資料庫中創建存盤程序,則要在名稱前面加上資料庫的名稱,即 資料庫名.存盤程序名 ,需要注意的是,名稱應當盡量避免選取與MySQL內置函式相同的名稱,否則會發生錯誤,
2)引數
存盤程序的引數串列,格式如下:
1 [in|out|inout] 引數名 引數型別
MySQL存盤程序支持三種型別的引數,即輸入引數、輸出引數和輸入/輸出引數,分別用in、out和inout三個關鍵字標識,其中,輸入引數可以傳遞給一個存盤程序,輸出引數用于存盤程序需要回傳一個操作結果的情形,而輸入/輸出引數既可以充當輸入引數也可以充當輸出引數,需要注意的是,引數的取名不要與資料表的列名相同,否則盡管不會回傳出錯資訊,但是存盤程序的SQL陳述句會將引數名看作列名,從而引發不可預知的結果,
當有多個引數時,引數串列中彼此間用逗號分隔,存盤程序可以沒有引數(此時存盤程序的名稱后仍需加上一對括號),也可以有1個或多個引數,
3)存盤程序體
存盤程序的主體部分,包含在程序呼叫的時候必須執行的SQL陳述句,這個部分以關鍵字begin開始,以關鍵字end結束,若存盤程序體中只有一條SQL陳述句,則可以省略begin和end,
delimiter命令
在MySQL中,服務器處理SQL陳述句默認是以分號作為陳述句結束標志的,然而,在創建存盤程序時,存盤程序體可能包含有多條SQL陳述句,這些SQL陳述句如果仍以分號作為陳述句結束符,那么MySQL服務器在處理時會以遇到的第一條SQL陳述句結尾處的分號作為整個程式的結束符,而不再去處理存盤程序體中后面的SQL陳述句,這樣顯然不行,
為解決這個問題,通常可使用delimiter命令將結束命令修改為其他字符,
當使用delimiter命令時,應該避免使用反斜杠“\”字符,因為它是MySQL的轉義字符,
實體
創建不帶引數的存盤程序:
1 mysql> delimiter // 2 mysql> create procedure showScore() 3 -> begin 4 -> select * from score; 5 -> end // 6 Query OK, 0 rows affected (0.00 sec) 7 8 mysql>
創建帶有引數的存盤程序:
1 mysql> delimiter // 2 mysql> create procedure showStuScore(in stu varchar(20)) 3 -> begin 4 -> select * from score where student = stu; 5 -> end // 6 Query OK, 0 rows affected (0.00 sec) 7 8 mysql>
使用存盤程序
語法
1 call 存盤程序名稱([引數]);
實體
1 mysql> call showScore(); 2 +----+---------+-----------+-------+ 3 | id | student | course | grade | 4 +----+---------+-----------+-------+ 5 | 2 | 張三 | 英語 | 53 | 6 | 3 | 李四 | 計算機 | 48 | 7 | 4 | 李四 | 中文 | 38 | 8 | 5 | 王五 | 中文 | 95 | 9 | 6 | 趙六 | 計算機 | 70 | 10 | 7 | 趙六 | 英語 | 92 | 11 | 8 | 趙六 | 中文 | 73 | 12 | 9 | 孫七 | 英語 | 94 | 13 | 10 | 周八 | 計算機 | 90 | 14 | 11 | 周八 | 英語 | 85 | 15 | 12 | 吳九 | 計算機 | 90 | 16 | 13 | 吳九 | 中文 | 55 | 17 +----+---------+-----------+-------+ 18 12 rows in set (0.00 sec) 19 20 Query OK, 0 rows affected (0.00 sec) 21 22 mysql>
查看存盤程序
查看所有存盤程序
1 mysql> show procedure status; 2 +------+--------------+-----------+----------------+---------------------+---------------------+---------------+---------+----------------------+----------------------+--------------------+ 3 | Db | Name | Type | Definer | Modified | Created | Security_type | Comment | character_set_client | collation_connection | Database Collation | 4 +------+--------------+-----------+----------------+---------------------+---------------------+---------------+---------+----------------------+----------------------+--------------------+ 5 | demo | showScore | PROCEDURE | root@localhost | 2019-09-09 21:03:42 | 2019-09-09 21:03:42 | DEFINER | | utf8 | utf8_general_ci | gb2312_chinese_ci | 6 | demo | showStuScore | PROCEDURE | root@localhost | 2019-09-09 21:06:10 | 2019-09-09 21:06:10 | DEFINER | | utf8 | utf8_general_ci | gb2312_chinese_ci | 7 +------+--------------+-----------+----------------+---------------------+---------------------+---------------+---------+----------------------+----------------------+--------------------+ 8 2 rows in set (0.00 sec) 9 10 mysql>
查看存盤程序的創建陳述句
1 mysql> show create procedure showScore; 2 +-----------+--------------------------------------------+------------------------------------------------------------+----------------------+----------------------+--------------------+ 3 | Procedure | sql_mode | Create Procedure | character_set_client | collation_connection | Database Collation | 4 +-----------+--------------------------------------------+------------------------------------------------------------+----------------------+----------------------+--------------------+ 5 | showScore | STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION | CREATE DEFINER=`root`@`localhost` PROCEDURE `showScore`() 6 begin 7 select * from score; 8 end | utf8 | utf8_general_ci | gb2312_chinese_ci | 9 +-----------+--------------------------------------------+------------------------------------------------------------+----------------------+----------------------+--------------------+ 10 1 row in set (0.00 sec) 11 12 mysql>
修改存盤程序
可以通過先洗掉存盤程序,然后重新創建存盤程序的方法實作修改的操作,
洗掉存盤程序
語法
1 drop procedure 存盤程序名稱
實體
1 mysql> drop procedure showScore; 2 Query OK, 0 rows affected (0.00 sec) 3 4 mysql>
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/125646.html
標籤:MySQL
