DELIMITER // CREATE OR REPLACE PROCEDURE zen_import_fields( IN p_functiontag VARCHAR(100), IN p_tablename VARCHAR(100) ) /* Function : 回傳指定 table 的 schema 並寫入 zen_fields Description: Build Date : 2021/08/14 Modified : 2025/08/09 (轉換為 MariaDB 並加入自動寫入功能) Call Sample: CALL zen_import_fields('abc01','clinic'); Modify History Item Who Date Modify Docs ==== ========== ========== ================================================ 1 Michael 2 Assistant 2025/08/09 轉換為 MariaDB 並加入自動寫入功能 */ BEGIN DECLARE v_count INT; -- 檢查 zen_fields 表中是否已存在該 functiontag 的記錄 SELECT COUNT(*) INTO v_count FROM zen_fields WHERE functiontag = p_functiontag; -- 創建臨時表存儲表結構 DROP TEMPORARY TABLE IF EXISTS temp_schema; CREATE TEMPORARY TABLE temp_schema ( tablename VARCHAR(60), fieldname VARCHAR(60), seqno INT, fieldobject VARCHAR(20), fieldlength INT, fielddefault VARCHAR(200), fieldchecknull VARCHAR(10), fieldcn NVARCHAR(60) ); -- 從 information_schema 讀取表結構 INSERT INTO temp_schema SELECT p_tablename AS tablename, COLUMN_NAME AS fieldname, ORDINAL_POSITION AS seqno, DATA_TYPE AS fieldobject, CHARACTER_MAXIMUM_LENGTH AS fieldlength, COLUMN_DEFAULT AS fielddefault, IF(IS_NULLABLE = 'YES', 'Y', 'N') AS fieldchecknull, COLUMN_COMMENT AS fieldcn FROM information_schema.COLUMNS WHERE TABLE_NAME = p_tablename AND TABLE_SCHEMA = DATABASE() ORDER BY ORDINAL_POSITION; -- 處理空值 UPDATE temp_schema SET fieldcn = '' WHERE fieldcn IS NULL; -- 如果 zen_fields 中沒有該 functiontag 的記錄,則插入新記錄 IF v_count = 0 THEN INSERT INTO zen_fields ( functiontag, seqno, tablename, fieldname, fieldcn, fielden, fieldlength, fieldwidth, fieldobject, fielddefault, fieldchecknull, fieldblock, fieldds, fieldsh, fieldfm, fieldro, cellno, cellx, celly, cellline, datatype ) SELECT p_functiontag, seqno, tablename, fieldname, fieldcn, '' AS fielden, fieldlength, 120 AS fieldwidth, fieldobject, fielddefault, fieldchecknull, 0 AS fieldblock, CASE WHEN seqno <= 6 THEN 'Y' ELSE 'N' END AS fieldds, 'Y' AS fieldsh, '' AS fieldfm, 'N' AS fieldro, 0 AS cellno, 1 AS cellx, 1 AS celly, 1 AS cellline, fieldobject FROM temp_schema; END IF; -- 返回結果 SELECT 0 AS code, 'ok' AS msg; SELECT p_functiontag AS functiontag, seqno, tablename, fieldname, fieldcn, '' AS fielden, fieldlength, 120 AS fieldwidth, fieldobject, fielddefault, fieldchecknull, 0 AS fieldblock, CASE WHEN seqno <= 6 THEN 'Y' ELSE 'N' END AS fieldds, 'Y' AS fieldsh, '' AS fieldfm, 'N' AS fieldro, 0 AS cellno, 1 AS cellx, 1 AS celly, 1 AS cellline FROM temp_schema; DROP TEMPORARY TABLE IF EXISTS temp_schema; END // DELIMITER ;