關于MySQL的存儲過程與存儲函數
目錄
- 初識存儲過程
- 存儲過程語法
- 存儲過程調用
- 存儲函數的使用
- 語法
- 函數的調用
- 對比存儲函數和存儲過程
初識存儲過程
- 理解:
- 含義: 存儲過程(Stored Procedure)是在大型數據庫系統中,一組為了完成特定功能的SQL 語句集(這些SQL語句已經編譯過了),它存儲在數據庫中,一次編譯后永久有效,用戶通過指定存儲過程的名字并給出參數(如果該存儲過程帶有參數)來執行它。
- 執行過程:存儲過程預先存儲在MySQL服務器,當需要執行的時候,客戶端向服務器端發送執行的命令,服務器端就可以把預先存儲好的這一系列sql語句全部執行。
- 好處
- 簡化操作,提高sql語句復用性
- 減少網絡傳輸量(客戶端不需要把所有的SQL語句通過網絡發送給服務器端)
- 減少sql語句暴露在網上的風險,提高數據查詢的安全性
存儲過程和視圖與函數的對比
存儲過程可以直接操作底層數據表,視圖是虛擬表,存儲過程一旦創建出來,我們直接通過存儲過程名調用就可以了,就像用函數一樣,相對于函數,存儲過程是沒有返回值的
接下來看看存儲過程的分類,現在不懂沒關系,等文章后面內容看完再回過來看,其實分類和函數的分類差不多,就是根據有無參數和有無返回值來劃分。
- 存儲過程的分類
存儲過程的參數類型可以是IN,OUT,INOUT,根據這樣可以分類- ①沒有參數(無參無返回)
- ②僅僅帶IN類型(有參數無返回)
- ③僅僅帶OUT類型(無參數有返回)
- ④既有IN,又有OUT(有參有返回)
- ⑤帶INOUT(有參有返回)
IN,OUT,INOUT都可以在一個存儲過程中帶多個
存儲過程語法
CREATE PROCEDURE 存儲過程名(IN|OUT|INOUT 參數名 參數類型,...)[characteristics ...]BEGIN 存儲過程體END
類似于Java的語法
修飾符 返回類型 方法名(參數類型 參數名,...){ 方法體;}
接下來對參數類型前面的IN,OUT,INOUT進行說明
- IN:當前參數是輸入參數,如果沒有定義參數的話,默認就是參數類型是IN
- OUT:輸出參數
- INOUT:可以表示為輸入參數,也可以是輸出參數
characteristics表示創建存儲過程時指定的對存儲過程的約束條件,其取值信息如下:
LANGUAGE SQL| [NOT] DETERMINISTIC| { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }| SQL SECURITY { DEFINER | INVOKER }| COMMENT "string"
- LANGUAGE SQL:說明存儲過程執行體是由SQL語句組成的,當前系統支持的語言為SQL。
- [NOT] DETERMINISTIC:指明存儲過程執行的結果是否確定。DETERMINISTIC表示結果是確定的。每次執行存儲過程時,相同的輸入會得到相同的輸出。NOT DETERMINISTIC表示結果是不確定的,相同的輸入可能得到不同的輸出。如果沒有指定任意一個值,默認為NOT DETERMINISTIC。
- { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }:指明子程序使用SQL語句的限制。
- CONTAINS SQL表示當前存儲過程的子程序包含SQL語句,但是并不包含讀寫數據的SQL語句;
- NO SQL表示當前存儲過程的子程序中不包含任何SQL語句;
- READS SQL DATA表示當前存儲過程的子程序中包含讀數據的SQL語句;
- MODIFIES SQL DATA表示當前存儲過程的子程序中包含寫數據的SQL語句。
- 默認情況下,系統會指定為CONTAINS SQL。
- SQL SECURITY { DEFINER | INVOKER }:執行當前存儲過程的權限,即指明哪些用戶能夠執行當前存儲過程。
- DEFINER表示只有當前存儲過程的創建者或者定義者才能執行當前存儲過程;
- INVOKER表示擁有當前存儲過程的訪問權限的用戶能夠執行當前存儲過程。
- 如果沒有設置相關的值,則MySQL默認指定值為DEFINER。
- COMMENT 'string':注釋信息,可以用來描述存儲過程。
需要注意的地方:
- mysql默認以;作為語句結束的標識
- 為了避免與存儲過程中SQL語句結束符相沖突,需要使用DELIMITER改變存儲過程的結束符。
- 存儲過程定義完畢之后再使用“DELIMITER ;”恢復默認結束符。DELIMITER也可以指定其他符號作為結束符。
DELIMITER $CREATE PROCEDURE 存儲過程名(IN|OUT|INOUT 參數名 參數類型,...)[characteristics ...]BEGIN sql語句1; sql語句2;END $
存儲過程調用
準備工作
-- 準備工作,創建新數據庫 create database db15;use db15;create table empsas select * from atguigudb.employees;create table departmentsas select * from atguigudb.departments;select * from emps;
無參無返回
存儲過程的調用,用call+存儲過程名
OUT類型
IN類型
帶IN和OUT
帶INOUT
存儲函數的使用
語法
CREATE FUNCTION 函數名(參數名 參數類型,...) RETURNS 返回值類型[characteristics ...]BEGIN 函數體 #函數體中肯定有 RETURN 語句END
說明:
1、參數列表:指定參數為IN、OUT或INOUT只對PROCEDURE是合法的,FUNCTION中總是默認為IN參數。
2、RETURNS type 語句表示函數返回數據的類型;
RETURNS子句只能對FUNCTION做指定,對函數而言這是強制
的。它用來指定函數的返回類型,而且函數體必須包含一個RETURN value
語句。
3、characteristic 創建函數時指定的對函數的約束。取值與創建存儲過程時相同,這里不再贅述。
4、函數體也可以用BEGIN…END來表示SQL代碼的開始和結束。如果函數體只有一條語句,也可以省略BEGIN…END。
函數的調用
SELECT 函數名(實參列表)
注意:
若在創建存儲函數中報錯“you might want to use the less safe log_bin_trust_function_creators variable
”,有兩種處理方法:
方式1:加上必要的函數特性“[NOT] DETERMINISTIC”和“{CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA}”
方式2:
SET GLOBAL log_bin_trust_function_creators = 1;
對比存儲函數和存儲過程
關鍵字調用語法返回值應用場景存儲過程PROCEDURECALL 存儲過程()理解為有0個或多個一般用于更新存儲函數FUNCTIONSELECT 函數()只能是一個一般用于查詢結果為一個值并返回時此外,存儲函數可以放在查詢語句中使用,存儲過程不行。反之,存儲過程的功能更加強大,包括能夠執行對表的操作(比如創建表,刪除表等)和事務操作,這些功能是存儲函數不具備的。
到此這篇關于關于MySQL的存儲過程與存儲函數的文章就介紹到這了,更多相關MySQL存儲過程與存儲函數內容請搜索以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持!
相關文章:
