feat(database): 添加达梦数据库字段类型修改存储过程

- 创建 MODIFY_COLUMN_TYPE 存储过程,支持安全修改表字段数据类型
- 实现 VARCHAR 转 TEXT 等无法直接修改场景的安全转换流程
- 包含输入参数校验、临时列操作、数据迁移及异常回滚机制
- 提供详细的执行日志输出与错误处理
- 增加使用示例注释,便于实际调用参考
This commit is contained in:
2025-11-25 18:28:58 +08:00
parent d5c4c33ce6
commit 57417b69f7

View File

@@ -0,0 +1,55 @@
-- 达梦数据库字段类型修改函数
-- 功能安全修改表字段的数据类型适用于VARCHAR转TEXT等无法直接修改的情况
CREATE OR REPLACE PROCEDURE MODIFY_COLUMN_TYPE(
IN_SCHEMA_NAME VARCHAR(128),
IN_TABLE_NAME VARCHAR(128),
IN_COLUMN_NAME VARCHAR(128),
IN_NEW_DATA_TYPE VARCHAR(128)
)
AS
V_TEMP_COLUMN_NAME VARCHAR(128);
V_SQL VARCHAR(4000);
BEGIN
-- 验证输入参数
IF IN_SCHEMA_NAME IS NULL OR IN_TABLE_NAME IS NULL OR IN_COLUMN_NAME IS NULL OR IN_NEW_DATA_TYPE IS NULL THEN
RAISE_APPLICATION_ERROR(-20001, '所有参数都不能为空');
END IF;
-- 生成临时列名
V_TEMP_COLUMN_NAME := IN_COLUMN_NAME || '_TEMP';
-- 第一步:添加临时列
V_SQL := 'ALTER TABLE "' || IN_SCHEMA_NAME || '"."' || IN_TABLE_NAME ||
'" ADD "' || V_TEMP_COLUMN_NAME || '" ' || IN_NEW_DATA_TYPE;
EXECUTE IMMEDIATE V_SQL;
-- 第二步:将原列数据复制到临时列
V_SQL := 'UPDATE "' || IN_SCHEMA_NAME || '"."' || IN_TABLE_NAME ||
'" SET "' || V_TEMP_COLUMN_NAME || '" = TRIM("' || IN_COLUMN_NAME || '")';
EXECUTE IMMEDIATE V_SQL;
-- 第三步:删除原列
V_SQL := 'ALTER TABLE "' || IN_SCHEMA_NAME || '"."' || IN_TABLE_NAME ||
'" DROP COLUMN "' || IN_COLUMN_NAME || '"';
EXECUTE IMMEDIATE V_SQL;
-- 第四步:将临时列重命名为原列名
V_SQL := 'ALTER TABLE "' || IN_SCHEMA_NAME || '"."' || IN_TABLE_NAME ||
'" RENAME COLUMN "' || V_TEMP_COLUMN_NAME || '" TO "' || IN_COLUMN_NAME || '"';
EXECUTE IMMEDIATE V_SQL;
-- 提交事务
COMMIT;
DBMS_OUTPUT.PUT_LINE('字段类型修改成功:' || IN_SCHEMA_NAME || '.' || IN_TABLE_NAME || '.' || IN_COLUMN_NAME);
EXCEPTION
WHEN OTHERS THEN
ROLLBACK;
RAISE_APPLICATION_ERROR(-20002, '修改字段类型失败:' || SQLERRM);
END;
/
-- 使用示例将模式名为TEST_SCHEMA表名为USER_TABLE中的NAME字段从VARCHAR改为TEXT类型
-- CALL MODIFY_COLUMN_TYPE('TEST_SCHEMA', 'USER_TABLE', 'NAME', 'TEXT');