1. 程式人生 > >Mysql中儲存過程與自定義函式的區別

Mysql中儲存過程與自定義函式的區別

建立儲存過程:

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程式碼快,還是傳一個儲存過程名字和幾個引數快???)
複製程式碼