Files
Omni_app.db/get_tableschema.txt
T
2026-02-06 23:26:59 +08:00

99 lines
3.5 KiB
Plaintext

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 ;