存儲過程和函數
1、概述
事先經過編譯,存儲在數據庫中的一段SQL語句的集合。調用存儲過程和函數可以簡化應用開發人員的很多工作。減少數據在數據庫和應用服務器之間的傳輸。對於提高數據的處理的效率是有好處的。
# 函數 有返回值
# 過程 沒有返回值
2、創建存儲過程
create procedure procedure_name()
begin
--- SQL 語句
end ;
結束符。 example:delimiter &
>> delimiter >>
3、調用存儲過程
call pro_name() >>
4、查詢存儲過程
查詢過程列表
select name from mysql.proc where db= 'database_name' >>
查詢情況
show procedure status >>
查詢定義
show create procedure pro_name >>
↑ 可以加 \G
5、刪除存儲過程
drop procedure pro_name >>
6、語句
1、變量
* declare
通過declare可以定義一個局部變量。作用域begin -- end
* set
爲變量賦值
還可以使用select ... into.....賦值
2、if 條件判斷
if
seif
end if
3、傳遞參數
in
out
4、case
case
when 條件
then 結果
5、while
滿足條件就繼續
6、repeat
滿足條件退出循環
REPEAT
statement_list
unitl search_condition # 退出條件
END REPEAT
如果這樣運行是會報錯的,因爲循環是不接分號的。
7、loop
[ begin_label ]: LOOP
statement_list
END LOOP
要想退出就得藉助leave語句
8、遊標/光標
1、聲明遊標
declare cursor_name cursor for select_statement;
2、open 遊標
open cursor_name;
3、fetch 遊標
fetch cursor_name into var_name [, var_name ]
4、關閉遊標
close cursor_name;
7、 存儲函數
create function function_name(param type ...)
returns type # 聲明一個返回值的類型
begin
...
end;
存儲函數有返回值
存儲過程沒有返回值,但是任然可以返回。in out
其實我創建的時候是報錯了,原因是:
這是我們開啓了bin-log, 我們就必須指定我們的函數是否是
1 DETERMINISTIC 不確定的 deterministic
2 NO SQL 沒有SQl語句,當然也不會修改數據
3 READS SQL DATA 只是讀取數據,當然也不會修改數據 reads sql data
4 MODIFIES SQL DATA 要修改數據 modifies sql data
5 CONTAINS SQL 包含了SQL語句 conditions sql
解決方法:1、我運行了這個命令,信任子程序的創建者,禁止創建、修改子程序時對SUPER權限的要求
SET GLOBAL log_bin_trust_function_creators = 1;
2、你也可以在創建子程序(存儲過程、函數、觸發器)時,聲明爲DETERMINISTIC或NO SQL與READS SQL DATA中的一個,
CREATE DEFINER = CURRENT_USER PROCEDURE `NewProc`()
DETERMINISTIC
BEGIN
#Routine body goes here...
END;
調用函數的方法:之前調用procedure的時候用的是call(),如果你繼續使用,系統就會認爲你仍然調用的是存儲過程,所以調用函數的話,直接使用select語句就可以了。
刪除存儲函數
drop function function_name;