MySQL基礎_儲存過程與函式
阿新 • • 發佈:2020-07-10
1. 儲存過程
含義:一組經過預先編譯的sql語句的集合,儲存過程思想上很簡單,就是資料庫 SQL 語言層面的程式碼封裝與重用。
好處:
- 儲存過程在建立的時候直接編譯,而sql語句每次使用都要編譯,提高執行效率
- 提高了sql語句的重用性
- 減少網路之間的資料傳輸,節省開銷
/* ✳1.建立儲存過程 語法: delimiter 新的結束標記 create procedure 儲存過程名(in|out|inout 引數名 引數型別,...) begin 儲存過程體; end 新的結束標記 注意: ①in、out、inout都可以在一個儲存過程中帶多個,且in可以省略 ②由於MySQL預設以";"為分隔符,如果我們沒有宣告新的分隔符,那麼編譯器會把儲存過程當成SQL語句進行處理,則儲存過程的編譯過 程會報錯,所以要事先用delimiter關鍵字申明當前段分隔符,這樣MySQL才會將";"當做儲存過程中的程式碼,不會執行這些程式碼,用 完了通過delimiter ;語句將分隔符還原。 ③引數前面的符號的意思 in:該引數只能作為輸入 (該引數不能做返回值) out:該引數只能作為輸出(該引數只能做返回值) inout:既能做輸入又能做輸出 ④儲存過程體的每一條sql語句都需要用分號結尾!!!!!!!!!!!! ⑤帶out/inout的引數由於會返回某個結果值,所以在呼叫時,需要將引數列表設定為一個變數,那麼返回結果就會賦值給該變數,我們 通過使用該變數,即能使用返回的結果。 ✳2.呼叫儲存過程 語法: call 儲存過程名(實參列表) 舉例: 呼叫in模式的引數: call 儲存過程名(‘值’); 呼叫out/inout模式的引數: set @變數名; call 儲存過程名(@變數名); select @變數名; ✳3.刪除儲存過程 drop procedure 儲存過程名; */ #示例:建立一個名為name_to_score的儲存過程,呼叫該儲存過程時,輸入學生姓名name,返回分數score,比如輸入張三,返回90。 delimiter // create procedure name_to_score(in NAME varchar(20),OUT score int) begin select s.score into score from students s where s.name=name; end // call name_to_score('張三',@score); select @score //
2. 函式
含義和好處與儲存過程類似。
/* ✳1.建立函式 語法: CREATE FUNCTION 函式名(引數名 引數型別,...) RETURNS 返回型別 BEGIN 函式體 END 注意: ①函式體中肯定需要有return語句; ②由於MySQL預設以";"為分隔符,如果我們沒有宣告新的分隔符,那麼編譯器會把儲存過程當成SQL語句進行處理,則儲存過程的編譯過 程會報錯,所以要事先用delimiter關鍵字申明當前段分隔符,這樣MySQL才會將";"當做儲存過程中的程式碼,不會執行這些程式碼,用 完了可以通過delimiter ;語句將分隔符還原。 ✳2.呼叫函式 SELECT 函式名(引數列表) ✳3.刪除函式 drop function 函式名; */ #示例:建立一個名為name_to_score的函式,函式功能是:輸入學生姓名name,返回分數score,比如輸入張三,返回90。 delimiter // create function name_to_score(name varchar(20)) returns int begin declare ss int default 0; select s.score into ss from students s where s.name=name; return ss; end // select name_to_score('張三') //
3. 函式和儲存過程的區別
關鍵字 | 呼叫語法 | 返回值 | 是否有return語句 | |
---|---|---|---|---|
函式 | function | select 函式(引數列表); | 通過return,有且只能有一個 | 有 |
儲存過程 | procedure | call 儲存過程(引數列表); | 通過out/inout,可以為零個、一個或多個 | 無 |