存儲過程 fun_convert 演示:接收逗號分隔字符串參數,循環解析每段,查詢公司表獲取代碼,拼接返回結果字符串。展示變量聲明、循環、動態 SQL、字符串操作、游標替代方案。
CREATE DEFINER=`root`@`%` PROCEDURE `fun_convert`(IN `para` VARCHAR(2000))
BEGIN
DECLARE `result` VARCHAR(2000) DEFAULT '';
DECLARE `cnt` INT DEFAULT 0;
DECLARE `i` INT DEFAULT 1;
DECLARE `id` VARCHAR(50);
DECLARE `c_id` VARCHAR(50);
SET `cnt` = LENGTH(`para`) - LENGTH(REPLACE(`para`, ',', '')) + 1;
WHILE `i` <= `cnt` DO
SET `id` = SUBSTRING_INDEX(SUBSTRING_INDEX(`para`, ',', `i`), ',', -1);
SELECT `code` INTO `c_id` FROM `company` WHERE `id` = `id`;
SET `result` = CONCAT(`result`, `c_id`, ',');
SET `i` = `i` + 1;
END WHILE;
SELECT TRIM(TRAILING ',' FROM `result`) AS `converted`;
END
CALL `fun_convert`('1001,1002,1003');
-- 返回:'C001,C002,C003'
DECLARE 變量必須在 BEGIN 後、首條語句前。SUBSTRING_INDEX(str, delim, count):正數從左、負數從右截取第 N 段。SELECT ... INTO var:單行結果賦值給變量。CONCAT 字符串拼接,TRIM(TRAILING ',' FROM ...) 去尾隨逗號。JOIN + GROUP_CONCAT 單條 SQL 完成:SELECT GROUP_CONCAT(c.code ORDER BY FIND_IN_SET(c.id, '1001,1002,1003')) FROM company c WHERE FIND_IN_SET(c.id, '1001,1002,1003')JSON 數組(8.0+),JSON_TABLE 展開關聯查詢。SELECT,N+1 問題嚴重。存儲過程適合「邏輯封裝、權限隔離、減少網絡往返」,但複雜集合操作首選單條 SQL。