語法:
創建存儲過程:
CREATE [definer = {user|current_user}] PROCEDURE sp_name ([ proc_parameter [,proc_parameter ...]]) [ characteristics..] routime_body
其中:
proc_parameter : [IN|OUT|INOUT] parameter_name type
其中IN表示輸入參數,OUT表示輸出參數,INOUT表示既可以輸入也可以輸出;param_name表示參數名稱;type表示參數的類型
存儲過程體中可以使用自定義函數(UDF)中使用的復合結構/流程控制/SQL語句/自定義變量等等內容,詳情參閱 MySQL自定義函數用法詳解-復合結構自定義變量/流程控制
調用存儲過程:
CALL sp_name ([ proc_parameter [,proc_parameter ...]])
CALL sp_name
說明:當無參時,可以省略"()",當有參數時,不可省略"()"
存儲過程修改:
ALTER語句修改存儲過程只能修改存儲過程的注釋等無關緊要的東西,不能修改存儲過程體,所以要修改存儲過程,方法就是刪除重建!
刪除存儲過程:
DROP PROCEDURE [IF EXISTS] sp_name
示例:
創建無參存儲過程:
delimiter // CREATE PROCEDURE showTime() BEGIN SELECT now(); END// delimiter ; CALL showTime;
作用:顯示當前時間,沒什么實際意義
創建含參存儲過程:
只有一個IN參數
delimiter // CREATE PROCEDURE seleById(IN uid SMALLINT UNSIGNED) BEGIN SELECT * FROM son WHERE id = uid; END// delimiter ; call seleById(2);
包含IN參數和OUT參數
delimiter // CREATE PROCEDURE deleteById(IN uid SMALLINT UNSIGNED, OUT num SMALLINT UNSIGNED) BEGIN DELETE FROM son WHERE id = uid; SELETE row_count() into num; END// delimiter ; call seleById(2,@changeLine); SELETE @changeLine;
說明:創建存儲過程deleteById,包含一個IN參數和一個OUT參數.調用時,傳入刪除的ID和保存被修改的行數值的用戶變量@changeLine,select @changeLine;輸出被影響行數.
存儲過程與自定義函數的區別:
存儲過程實現的過程要復雜一些,而函數的針對性較強;
存儲過程可以有多個返回值,而自定義函數只有一個返回值;
存儲過程一般獨立的來執行,而函數往往是作為其他SQL語句的一部分來使用;
存儲過程存在的必要性(好處):
存儲過程說白了就是把經常使用的SQL語句或業務邏輯封裝起來,預編譯保存在數據庫中,當需要的時候從數據庫中直接調用,省去了編譯的過程.
提高了運行速度;
同時降低網絡數據傳輸量(你覺得傳一堆SQL代碼快,還是傳一個存儲過程名字和幾個參數快???)