為什么使用自定義函數?
1.系統內置函數只能提供簡單的、對數據庫表字段的操作。
2.自定函數可以提高數據庫中代碼的可重用性,可以實現復雜功能,可以根據需要來獲取返回值。
為什么使用存儲過程?
1.存儲過程是SQL語句和控制語句的預編譯集合,以一個名稱存儲,並可以作為一個單位來處理。
2.procedure可實現復雜的操作,曾強SQL的功能具有很大的靈活性,可由Application調用執行,可以進行流程控制,可以接收和返回多個參數。
3.實現很大程度加快執行的速度
4.可以減少網絡流量
mysql自定義函數:
UDF(用戶自定義函數):
是對mysql擴展的一種途徑。
說明:
自定義函數只能有一個返回值,復合結構的函數體需要用BEGIN和END來包含。
語法:
CREATE FUNCTION f_name[(parameters..)]
RETURNS parameter_type
BEGIN
SQL STATEMENT
...
RETURN values
END
函數的調用:
SELECT f_name(parameters..);
函數應用舉例:
CREATE FUNCTION addUser //此函數實現向fx_user表插入一條記錄,並返回插入的字段ID.
(u_name VARCHAR(20),u_p VARCHAR(20),u_c INT UNSIGNED)
RETRUNS INT UNSIGNED
BEGIN
INSERT INTO fx_test (name,password,companyId) VALUES (u_name,u_p,u_c);
RETURN LAST_INSERT_ID();
END
mysql客戶端查看FUNCTION:
mysql客戶端調用此FUNCTION:
SELECT addUser('admin','adminpassword',2);
php調用函數:
在瀏覽器端,運行執行后(數據插入成功):
mysql存儲過程:
正常的SQL語句的執行過程是:
sql命令--》mysql引擎--》判斷語法是否正確?--》(編譯)生成mysql引擎可識別的命令--》生成執行結果--》結果返回客戶端。
存儲過程的執行過程是:
sql命令--》mysql引擎--》生成執行結果--》結果返回客戶端。
優勢:
其省略了語法分析和系統編譯的過程,那么SQL的命令執行將會快速很多,大大提高了執行效率。
定義:
PROCEDURE 是SQL語句和控制語句的預編譯集合,以一個名稱存儲並作為一個單元處理。
語法:
CREATE PROCEDURE procedure_name
[(
[IN|OUT] parameters... //形式參數,
)]
[charactristic..] PROCEDURE_BODY
說明:1.PROCEDURE的參數類型:[IN|OUT]
2.delimiter用來修改mysql的定界符
存儲過程的調用:
CALL procedure_name;
存儲過程應用舉例:(此存儲過程實現,刪除用戶,返回被刪除用戶的id,並且返回剩余用戶的數量)
DELIMITER //
CREATE PROCEDURE deleteTestANDreturn
(IN p_id INT UNSIGNED,OUT r_id INT UNSIGNED,OUT NUMS INT)
BEGIN
DELETE FROM fx_test WHERE id=p_id;
SELECT id FROM fx_test WHERE id=p_id INTO r_id;
SELECT COUNT(id) FROM fx_test INTO NUMS;
END
mysql客戶端查看PROCEDURE:
SHOW PROCEDURE status \G; //顯示所有存儲過程並且以網格的形式顯示
mysql客戶端調用此PROCEDURE:
CALL deleteTestANDreturn(1,@id,@nums);
SELECT @id,@nums; //顯示刪除的id , 剩余的總數;
php調用存儲過程:
在瀏覽器端,運行執行后(數據刪除成功):