CREATE FUNCTION function_name (param1 TYPE, param2 TYPE, ...)
RETURNS return_type
[DETERMINISTIC | NOT DETERMINISTIC]
[READS SQL DATA | MODIFIES SQL DATA]
BEGIN
-- 函數邏輯
RETURN value;
END
DELIMITER $$
CREATE FUNCTION myReplace(
in_string VARCHAR(255),
in_find_str VARCHAR(20),
in_repl_str VARCHAR(20)
) RETURNS VARCHAR(255)
DETERMINISTIC
BEGIN
DECLARE l_new_string VARCHAR(255);
DECLARE l_find_pos INT;
SET l_find_pos = INSTR(in_string, in_find_str);
IF (l_find_pos > 0) THEN
SET l_new_string = INSERT(in_string, l_find_pos, LENGTH(in_find_str), in_repl_str);
ELSE
SET l_new_string = in_string;
END IF;
RETURN l_new_string;
END$$
DELIMITER ;
-- 測試
SELECT myReplace('ABC', 'A', 'Z'); -- 回傳 'ZBC'
-- 移除函數
DROP FUNCTION myReplace;
; 被誤判。DECLARE var TYPE [DEFAULT value]; 僅能在 BEGIN...END 區塊開頭。IF...THEN...ELSE...END IF、CASE、LOOP/WHILE/REPEAT。CREATE PROCEDURE get_stats(
IN p_product_id INT,
OUT p_total_stock INT,
OUT p_avg_price DECIMAL(10,2)
)
BEGIN
SELECT SUM(stock), AVG(price)
INTO p_total_stock, p_avg_price
FROM product_stock
WHERE product_id = p_product_id;
END;
-- 呼叫
CALL get_stats(1001, @total, @avg);
SELECT @total, @avg;
函數只能回傳單一標量值,需回傳多值或結果集請改用預存程序(
OUT參數)或直接SELECT。
CREATE FUNCTION HelloWorld() RETURNS VARCHAR(20) RETURN 'Hello World!'; SELECT HelloWorld(); -- Hello World!