feat(database): 添加达梦数据库字段类型修改存储过程
- 创建 MODIFY_COLUMN_TYPE 存储过程,支持安全修改表字段数据类型 - 实现 VARCHAR 转 TEXT 等无法直接修改场景的安全转换流程 - 包含输入参数校验、临时列操作、数据迁移及异常回滚机制 - 提供详细的执行日志输出与错误处理 - 增加使用示例注释,便于实际调用参考
This commit is contained in:
55
SQL/202511/20251125/modify_column_type.sql
Normal file
55
SQL/202511/20251125/modify_column_type.sql
Normal 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');
|
||||
Reference in New Issue
Block a user