DELIMITER // CREATE PROCEDURE zen_parse_sp( IN actiontype VARCHAR(10), -- fields/parain IN sp_name VARCHAR(200), IN functiontag VARCHAR(200) ) /* function : 想辦法取得 sp 最後回傳的欄位名稱列表 description: 有跨 db 的語法, 記得測試完後要移除 build date : 2021/12/02 call sample: CALL zen_parse_sp('gexrpt_opor02'); modify history item who date modify docs ==== ========== ========== ================================================ 1 michael 2021/12/02 新增 */ BEGIN DECLARE sql_text TEXT; DECLARE data_text TEXT; DECLARE pos INT; DECLARE ret2_col VARCHAR(100); DECLARE ret2_fieldobject VARCHAR(100); DECLARE ret2_related_provider VARCHAR(100); DECLARE ret2_default_value VARCHAR(100); DECLARE ret2_celly SMALLINT; DECLARE ret2_seqno INT; DECLARE ret2_rowid INT; SELECT text INTO sql_text FROM information_schema.routines WHERE routine_name = sp_name AND routine_type = 'PROCEDURE'; -- 回傳的欄位 IF actiontype = 'fields' THEN SELECT 0 AS code, 'ok' AS msg; CREATE TEMPORARY TABLE ret2 AS SELECT functiontag, column_name AS fieldname, column_name AS fieldcn, CASE WHEN LOCATE('date', data_type) > 0 THEN 'static-date' ELSE 'static' END AS fieldobject, ordinal_position AS seqno FROM information_schema.columns WHERE table_schema = DATABASE() AND table_name = sp_name; SELECT * FROM ret2; -- 傳入的參數 ELSEIF actiontype = 'parain' THEN -- 取得 () 內的資料 SET pos = LOCATE('/*', sql_text); IF pos > 0 THEN SET sql_text = SUBSTRING(sql_text, 1, pos - 5); END IF; SET pos = LOCATE('as', sql_text); IF pos > 0 THEN SET sql_text = SUBSTRING(sql_text, 1, pos - 5); END IF; SET pos = LOCATE('(', sql_text); SET data_text = SUBSTRING(sql_text, pos + 1, LENGTH(sql_text)); CREATE TEMPORARY TABLE ret2 ( col VARCHAR(100), fieldobject VARCHAR(100), related_provider VARCHAR(100), default_value VARCHAR(100), celly SMALLINT, rowid INT AUTO_INCREMENT, PRIMARY KEY (rowid) ); -- 開始分析(, 分隔) INSERT INTO ret2 (col) SELECT col FROM gf_split(data_text, ','); UPDATE ret2 SET col = SUBSTRING(col, LOCATE('@', col), LENGTH(col)); UPDATE ret2 SET col = SUBSTRING(col, 1, LOCATE(' ', col) - 1); -- 想辦法給定一些 default UPDATE ret2 SET fieldobject = 'input-text', default_value = '*'; UPDATE ret2 SET fieldobject = 'input-date', default_value = 'today' WHERE LOCATE('date', col) > 0; UPDATE ret2 SET fieldobject = 'picker', related_provider = 'basm61' WHERE LOCATE('cust', col) > 0; UPDATE ret2 SET fieldobject = 'picker', related_provider = 'basm51' WHERE LOCATE('product', col) > 0; UPDATE ret2 SET fieldobject = 'picker', related_provider = 'basm67' WHERE LOCATE('person', col) > 0; -- 如果第一個 para 是 token SELECT COUNT(*) INTO pos FROM ret2 WHERE rowid = 1 AND LOCATE('token', col) > 0; IF pos > 0 THEN UPDATE ret2 SET default_value = '${ls:token}' WHERE LOCATE('token', col) > 0; END IF; SELECT 0 AS code, 'ok' AS msg; SELECT functiontag, col AS fcaption, 1 AS celly, rowid - pos AS seqno, fieldobject, related_provider, default_value FROM ret2; END IF; END // DELIMITER ;