創建函數
DELIMITER $$
DROP FUNCTION IF EXISTS `test` $$
CREATE FUNCTION `test`(a int ,b int)
RETURNS int
BEGIN
IF (A>B) THEN
RETURN a+b;
ELSE
RETURN a-b;
END IF;
END
DELIMITER;
創建存儲過程
DELIMITER $$
DROP PROCEDURE IF EXISTS myProc $$
CREATE PROCEDURE myProc()
BEGIN
DECLARE v_sex int;
SELECT sex into v_sex from user where id=3; // 取出sex 給 v_sex 賦值,select sex into v_sex // SET vv=a+b; //賦值
if(v_sex==0) THEN
SELECT '男生';
ELSE
SELECT '女生';
END IF;
END
DELIMTER;
調用存儲過程 call myProc();
delimiter就是告訴mysql解釋器,該段命令是否已經結束了,是否可以執行了。
默認情況下,delimiter是分號;,遇到分號就執行。
后面的雙美元符號 就是告訴mysql,遇到雙美元符號再執行
show function status; // 查看自定義函數
show procedure status; // 查看自定義存儲過程
輸入輸出參數
DELIMITER $$
DROP PROCEDURE IF EXISTS myReslt $$
CREATE PROCEDURE myReslt (IN a INT , IN b INT, OUT c INT) // in 輸入參數,out輸出參數
BEGIN
SET c=a+b;
SELECT * FROM user WHERE id BETWEEN 2 AND c;
END
DELIMTER;
call myReslt (2,3,@c);
select @c;
存儲過程與自定義函數的區別:
存儲過程實現的過程要復雜一些,而函數的針對性較強;
存儲過程可以有多個返回值,而自定義函數只有一個返回值;
存儲過程一般獨立的來執行,而函數往往是作為其他SQL語句的一部分來使用;
存儲過程存在的必要性(好處):
存儲過程說白了就是把經常使用的SQL語句或業務邏輯封裝起來,預編譯保存在數據庫中,當需要的時候從數據庫中直接調用,省去了編譯的過程.
提高了運行速度;
同時降低網絡數據傳輸量(你覺得傳一堆SQL代碼快,還是傳一個存儲過程名字和幾個參數快