MySQL儲存過程/儲存過程與自定義函式的區別
阿新 • • 發佈:2020-12-07
語法:
建立儲存過程:
CREATE[definer= {user|current_user}]PROCEDUREsp_name ([ proc_parameter [,proc_parameter ...]]) [ characteristics..] routime_body
其中:
proc_parameter : [IN|OUT|INOUT] parameter_name type
其中IN表示輸入引數,OUT表示輸出引數,INOUT表示既可以輸入也可以輸出;param_name表示引數名稱;type表示引數的型別
儲存過程體中可以使用自定義函式(UDF)中使用的複合結構/流程控制/SQL語句/自定義變數等等內容,詳情參閱
呼叫儲存過程:
CALLsp_name ([ proc_parameter [,proc_parameter ...]])
CALLsp_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程式碼快,還是傳一個儲存過程名字和幾個引數快???)