DELIMITER $$
DROP FUNCTION IF EXISTS `onlineFunction`$$
CREATE FUNCTION `onlineFunction`(rrrr VARCHAR(50))
RETURNS VARCHAR(255)
BEGIN
IF (rrrr = 'online') THEN
RETURN '上線';
END IF;
END$$
DELIMITER ;
| 語句 | 作用 | 注意事項 |
|---|---|---|
DELIMITER $$ | 重新定義語句結束符 | 避免函數體內分號與默認結束符衝突;結束時需恢復 DELIMITER ; |
DROP FUNCTION IF EXISTS | 刪除同名函數 | 防止 ERROR 1304: FUNCTION already exists |
CREATE FUNCTION name(params) RETURNS type | 定義函數簽名 | 參數不可帶 IN/OUT/INOUT,僅支持輸入參數 |
BEGIN ... END | 函數體邊界 | 複合語句塊,內部可聲明變量、流程控制 |
IF ... THEN ... END IF | 條件分支 | 支持 ELSEIF、ELSE;每分支以分號結束 |
RETURN value | 返回結果並結束函數 | 函數必須有 RETURN,且類型匹配 RETURNS 聲明 |
原因: 未設置 DELIMITER,函數體內分號被誤認為創建語句結束。
修正: 必須在 CREATE FUNCTION 前設置 DELIMITER $$,結束後恢復。
修正: 使用 DROP FUNCTION IF EXISTS `func_name` 先清理。
啟用二進制日志(主從復制環境)時,創建函數/觸發器需要 SUPER 權限,否則報錯:
ERROR 1419 (HY000): You do not have the SUPER privilege and binary logging is enabled
(you *might* want to use the less safe log_bin_trust_function_creators variable)
-- 臨時生效(重啟失效)
SET GLOBAL log_bin_trust_function_creators = 1;
-- 永久生效:my.cnf [mysqld] 區段添加
log_bin_trust_function_creators = 1
# my.cnf 註釋掉
# log-bin=mysql-bin
# binlog_format=mixed
DECLARE var_name TYPE [DEFAULT value];
SET var_name = expr;
SELECT col INTO var_name FROM table WHERE ...;
-- IF-ELSEIF-ELSE
IF condition THEN
statements;
ELSEIF condition THEN
statements;
ELSE
statements;
END IF;
-- CASE
CASE expr
WHEN value1 THEN statements;
WHEN value2 THEN statements;
ELSE statements;
END CASE;
-- LOOP / REPEAT / WHILE
WHILE condition DO
statements;
END WHILE;
DECLARE cur CURSOR FOR SELECT col FROM table;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
OPEN cur;
FETCH cur INTO var;
CLOSE cur;
fn_ 前綴區分用戶函數與內置函數DETERMINISTIC 關鍵字,利於查詢緩存優化SQL SECURITY DEFINER(默認,以創建者權限執行)vs INVOKER(以調用者權限執行)SELECT fn_name(params) 驗證邏輯正確性