DELIMITER // CREATE OR REPLACE FUNCTION udf_myfavor( p_moduleid VARCHAR(100), p_userid VARCHAR(20), p_ver_type VARCHAR(10), p_ip VARCHAR(100), p_db2 VARCHAR(100) ) RETURNS LONGTEXT DETERMINISTIC /* function : 將傳入的字串, 依 @split 固定切割為 2筆資料, 仍傳回 table, 這是特殊的用法 description: 呼叫範例 SELECT udf_myfavor('eip','admin','beta','','') build date : 2023/11/01 modify history item who date modify docs ==== ========== ========== ================================================ 1 michael 2023/11/01 新增 */ BEGIN DECLARE v_ret_menu LONGTEXT; DECLARE v_imax2 INT; DECLARE v_y2 INT; DECLARE v_comma VARCHAR(1); DECLARE v_id2 VARCHAR(100); DECLARE v_name2 VARCHAR(100); DECLARE v_isLocalMenu VARCHAR(1); DECLARE v_crlf VARCHAR(2); -- 創建臨時表來存儲數據 DROP TEMPORARY TABLE IF EXISTS temp_menu_favor; CREATE TEMPORARY TABLE temp_menu_favor ( menuid VARCHAR(100), caption VARCHAR(100), isLocalMenu VARCHAR(1), rowid INT AUTO_INCREMENT PRIMARY KEY ) ENGINE=MEMORY; -- 插入數據到臨時表 INSERT INTO temp_menu_favor (menuid, caption, isLocalMenu) SELECT a.functiontag, b.caption, IFNULL(b.isLocalMenu, 'N') FROM sys_myfavor a LEFT JOIN sys_menutable b ON a.functiontag = b.menuid WHERE module = p_moduleid AND userid = p_userid; SET v_ret_menu = ''; SET v_crlf = CHAR(10); -- 內層迴圈 SELECT IFNULL(MAX(rowid), 0) INTO v_imax2 FROM temp_menu_favor; SELECT IFNULL(MIN(rowid), 0) INTO v_y2 FROM temp_menu_favor; WHILE v_y2 <= v_imax2 AND v_imax2 > 0 DO IF v_y2 = v_imax2 THEN SET v_comma = ''; ELSE SET v_comma = ','; END IF; SELECT menuid, caption, isLocalMenu INTO v_id2, v_name2, v_isLocalMenu FROM temp_menu_favor WHERE rowid = v_y2; IF v_isLocalMenu = 'Y' THEN -- 本地端 json 程式 SET v_ret_menu = CONCAT( v_ret_menu, ' {', v_crlf, ' "label": "', v_name2, '",', v_crlf, ' "url": "/', p_moduleid, '/', v_id2, '",', v_crlf, ' "schemaApi": "get:/pages/', v_id2, '.json"', v_crlf, ' }', v_comma, v_crlf ); ELSE -- 真正的動態載入 code(test ok, but wait to use) SET v_ret_menu = CONCAT( v_ret_menu, ' {', v_crlf, ' "label": "', v_name2, '",', v_crlf, ' "url": "/', p_moduleid, '/', v_id2, '",', v_crlf, ' "schemaApi": {', v_crlf, ' "method": "post",', v_crlf, ' "url": "', p_ip, '/xapi/v2/', p_db2, '/zen_showsource/0/",', v_crlf, ' "data": {', v_crlf, ' "para01": "', v_id2, '",', v_crlf, ' "para02": "', p_ver_type, '",', v_crlf, ' "para03": "', p_ip, '"', v_crlf, ' },', v_crlf, ' "dataType": "form"', v_crlf, ' }', v_crlf, ' }', v_comma, v_crlf ); END IF; SET v_y2 = v_y2 + 1; END WHILE; IF v_ret_menu <> '' THEN SET v_ret_menu = CONCAT( ' {', v_crlf, ' "children": [', v_crlf, ' {', v_crlf, ' "label": "我的最愛",', v_crlf, ' "url": "/sys",', v_crlf, ' "icon": "fa fa-heart-o",', v_crlf, ' "children": [', v_crlf, v_ret_menu, ' ]', v_crlf, ' }', v_crlf, ' ]', v_crlf, ' },', v_crlf ); END IF; -- 清理臨時表 DROP TEMPORARY TABLE IF EXISTS temp_menu_favor; RETURN v_ret_menu; END // DELIMITER ;