DELIMITER // CREATE OR REPLACE PROCEDURE get_tableschema( IN p_data NVARCHAR(100) ) /* Function : 查詢檔案結構 description: build date : 2023/08/23 Modify history item who date modify docs ==== ========== ========== ================================================ 1 Michael 2023/08/23 2 Michael 2025/07/20 改寫為 MariaDB 並最佳化(ChatGPT+DeepSeek) 3 Assistant 2025/08/09 加入自動從information_schema讀取結構功能 */ BEGIN DECLARE v_count INT; -- 檢查gex_filestru是否有資料 SELECT COUNT(*) INTO v_count FROM gex_filestru; -- 如果沒資料, 就從information_schema讀取並寫入 IF v_count = 0 THEN -- 先清空表(以防萬一) TRUNCATE TABLE gex_filestru; -- 從information_schema讀取所有表結構並插入到gex_filestru INSERT INTO gex_filestru ( Table_name, table_description, seqno, field_name, field_desc, field_type, field_len, field_dec, table_pk, table_index, field_isnull, field_default ) SELECT t.TABLE_NAME AS Table_name, '' AS table_description, -- 初始為空,可手動補充 c.ORDINAL_POSITION AS seqno, c.COLUMN_NAME AS field_name, '' AS field_desc, -- 初始為空,可手動補充 c.DATA_TYPE AS field_type, -- c.CHARACTER_MAXIMUM_LENGTH AS field_len, case when c.CHARACTER_MAXIMUM_LENGTH > 9999 then 9999 else c.CHARACTER_MAXIMUM_LENGTH end AS field_len, c.NUMERIC_SCALE AS field_dec, IF(kcu.COLUMN_NAME IS NOT NULL, 'Y', 'N') AS table_pk, 'N' AS table_index, -- 初始為N,可根據實際索引調整 IF(c.IS_NULLABLE = 'YES', 'Y', 'N') AS field_isnull, c.COLUMN_DEFAULT AS field_default FROM information_schema.TABLES t JOIN information_schema.COLUMNS c ON t.TABLE_NAME = c.TABLE_NAME AND t.TABLE_SCHEMA = c.TABLE_SCHEMA LEFT JOIN information_schema.KEY_COLUMN_USAGE kcu ON c.TABLE_NAME = kcu.TABLE_NAME AND c.COLUMN_NAME = kcu.COLUMN_NAME AND c.TABLE_SCHEMA = kcu.TABLE_SCHEMA AND kcu.CONSTRAINT_NAME = 'PRIMARY' WHERE t.TABLE_SCHEMA = DATABASE() AND t.TABLE_TYPE = 'BASE TABLE'; -- 更新表描述為表注釋(如果有) UPDATE gex_filestru f JOIN information_schema.TABLES t ON f.Table_name = t.TABLE_NAME SET f.table_description = t.TABLE_COMMENT WHERE t.TABLE_SCHEMA = DATABASE(); -- 更新字段描述為列注釋(如果有) UPDATE gex_filestru f JOIN information_schema.COLUMNS c ON f.Table_name = c.TABLE_NAME AND f.field_name = c.COLUMN_NAME SET f.field_desc = c.COLUMN_COMMENT WHERE c.TABLE_SCHEMA = DATABASE(); END IF; -- 设置默认返回值 SELECT 0 AS code, 'ok' AS msg; -- 查询表结构 IF p_data = '*' THEN SELECT Table_name, table_description, seqno, field_name, field_desc, field_type, field_len, field_dec, table_pk, table_index, field_isnull, field_default FROM gex_filestru ORDER BY table_name, seqno; ELSE SELECT Table_name, table_description, seqno, field_name, field_desc, field_type, field_len, field_dec, table_pk, table_index, field_isnull, field_default FROM gex_filestru WHERE table_name LIKE CONCAT('%', p_data, '%') OR table_description LIKE CONCAT('%', p_data, '%') OR field_name LIKE CONCAT('%', p_data, '%') OR field_desc LIKE CONCAT('%', p_data, '%') ORDER BY table_name, seqno; END IF; END // DELIMITER ;