前言

  日常開發中,可能會用到資料庫的自定義函式/儲存過程,本文記錄MySQL對自定義函式與儲存過程的建立、使用、刪除的使用

  

  通用語法

  事實上,可以認為儲存過程就是沒有返回值的函式,建立/使用/刪除都非常相似,在Navicat視覺化工具中,自定義函式/儲存過程都歸類為函式

  定義變數

-- 定義變數,以及賦預設值0
DECLARE c INT(2) DEFAULT(0);

  設定變數

-- 設定變數值
SET c = c + 1;

  流程控制

-- 流程控制,多條件使用 AND/OR
IF c < 0 OR c = 0 THEN
set c = 0;
ELSEIF c IS NULL THEN
set c = 0;
ELSE
set c = c;
END IF;

  迴圈語句

-- 迴圈語句
WHILE c <= 10 DO SET c = c + 1;
END WHILE;

  自定義函式

  建立

-- 建立函式
DROP FUNCTION IF EXISTS test_fun;
CREATE FUNCTION test_fun ( a INT(2), b INT(2) ) RETURNS INT(2) BEGIN
-- 定義變數,以及賦預設值
DECLARE c INT(2) DEFAULT(0);
DECLARE i INT(2) DEFAULT(1); -- 流程控制
IF a < 0 OR b < 0 THEN
set a = 0;
set b = 0;
ELSEIF a IS NULL AND b IS NULL THEN
set a = 0;
set b = 0;
ELSE
set a = a;
set b = b;
END IF; -- 設定變數值
SET c = a + b; -- 迴圈
WHILE i <= 10 DO
SET c = c + i; SET i = i + 1;
END WHILE; -- return返回值
RETURN c;
END;

  使用

-- 使用函式
SELECT test_fun ( 1, 2 );

  刪除

-- 刪除函式
DROP FUNCTION test_fun;

  儲存過程

  建立

-- 建立儲存過程
DROP PROCEDURE IF EXISTS test_pro;
CREATE PROCEDURE test_pro ( a INT(2), b INT(2) ) BEGIN
-- 定義變數,以及賦預設值
DECLARE c INT(2) DEFAULT(0); -- 流程控制
IF a < 0 OR b < 0 THEN
set a = 0;
set b = 0;
ELSEIF a IS NULL AND b IS NULL THEN
set a = 0;
set b = 0;
ELSE
set a = a;
set b = b;
END IF; -- 設定變數值
SET c = a + b; -- 關閉自動提交,mysql每次執行一條語句都預設自動提交,去掉自動提交可大大提高批量操作效能
SET autocommit = 0; -- 迴圈
WHILE c <= 10 DO
-- 執行SQL語句,獲取1-4隨機數
SELECT floor( 1 + rand() * 4 ); SET c = c + 1;
END WHILE; -- 開啟自動提交
SET autocommit = 1; -- 模擬返回值,儲存過程不能return
SELECT c;
END;

  使用

-- 使用儲存過程
CALL test_pro ( 1, 2 );

  刪除

-- 刪除儲存過程
DROP PROCEDURE test_pro;

  後記

  MySQL對自定義函式與儲存過程的建立、使用、刪除的使用暫時先記錄到這,後續再進行補充