(016)mysql 技巧 * 自定義函數與存儲過程

自定義函數

語法:

create function 函數名([參數列表]) returns 數據類型
begin
    sql語句;
    return 值;
end;

例1:無參數函數

-- 最簡單的僅有一條sql的函數
CREATE FUNCTION f1() 
RETURNS VARCHAR(30)
RETURN DATE_FORMAT(NOW(),'%Y年%m月%d日 %H點%i分%s秒')

select f1(); -- 調用函數

例2:帶參數函數

-- 帶參數函數(參數需要聲明類型)
CREATE FUNCTION f2(a INT,b INT)
RETURNS INT
RETURN a + b;

select f2(1,2); -- 調用函數

例3:sql 語句體

-- sql 語句體
CREATE FUNCTION f3(name VARCHAR(30))
RETURNS INT
BEGIN
	INSERT INTO user(username) VALUES (name );
	RETURN LAST_INSERT_ID();
END

select f3('atong'); -- 調用函數
-- 多個語句需要執行時使用 begin/end 形成聚合體

其它

  • 參數可以零個或多個,return 值只能一個
  • 可在 sql 語句中調用 select * from user where id=f2(1,2);
  • 查看函數創建語句:show create function 函數名;
  • 查看所有函數:show function status [like 'pattern'];
  • 刪除函數:drop function 函數名;

存儲過程(Stored Procedure)

通常的,我們編寫好的SQL語句提交給MySQL服務器之後,MySQL服務器將經歷以下過程:

MySQL引擎檢查語法是否標準 -> sql 無錯誤時編譯該語句 -> 執行編譯後的語句 -> 返回結果

存儲過程是爲了完成特定功能的SQL語句集,經編譯創建並保存在數據庫中,調用存儲過程時可省去了 檢測語法及編譯 過程直接執行語句,從而提高效率。

例1:無參數的存儲過程:

-- 最簡單的僅有一條sql的存儲過程
CREATE PROCEDURE a() 
SELECT VERSION();

CALL a(); -- 調用存儲過程

例2: 帶參數的存儲過程

-- 帶參數的存儲過程
CREATE PROCEDURE removeUserById(uid INT)
BEGIN
    DELETE FROM `user` WHERE `id` = uid;
END

CALL removeUserById(1); -- 執行存儲過程

MySQL存儲過程的參數用在存儲過程的定義,共有三種參數類型,IN,OUT,INOUT,形式如:

CREATEPROCEDURE 存儲過程名([[IN |OUT |INOUT ] 參數名 數據類形...])
  • IN 輸入參數:表示調用者向過程傳入值(傳入值可以是字面量或變量)
  • OUT 輸出參數:表示過程向調用者傳出值(可以返回多個值)(傳出值只能是變量)
  • INOUT 輸入輸出參數:既表示調用者向過程傳入值,又表示過程向調用者傳出值(值只能是變量)

例3:IN/OUT 修飾參數

 -- IN uid 參數爲傳入參數,OUT nums 參數爲傳出參數
 -- OUT 可以多個,即存儲過程可返回多個值
CREATE PROCEDURE test(IN uid INT,OUT nums INT)
BEGIN
  DELETE FROM `user` WHERE id = uid;
  SELECT COUNT(uid) FROM `user` INTO nums;
end

-- 調用
CALL test(7,@param); -- @param 相當於傳入變量去接受數據
SELECT @param;

mysql 變量

-- into
SELECT 'Hello World' into @x;
SELECT @x; 

-- set
SET @y='Goodbye Cruel World';  
SELECT @y; 

更多:https://www.runoob.com/w3cnote/mysql-stored-procedure.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章