mysql:高級:存儲過程

存儲過程和函數

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;

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章