1. 程式人生 > 實用技巧 >MySQL基礎_儲存過程與函式

MySQL基礎_儲存過程與函式

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,可以為零個、一個或多個