From 57417b69f7252131578524f73e526b6327ed3e73 Mon Sep 17 00:00:00 2001 From: yang chen Date: Tue, 25 Nov 2025 18:28:58 +0800 Subject: [PATCH] =?UTF-8?q?feat(database):=20=E6=B7=BB=E5=8A=A0=E8=BE=BE?= =?UTF-8?q?=E6=A2=A6=E6=95=B0=E6=8D=AE=E5=BA=93=E5=AD=97=E6=AE=B5=E7=B1=BB?= =?UTF-8?q?=E5=9E=8B=E4=BF=AE=E6=94=B9=E5=AD=98=E5=82=A8=E8=BF=87=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 创建 MODIFY_COLUMN_TYPE 存储过程,支持安全修改表字段数据类型 - 实现 VARCHAR 转 TEXT 等无法直接修改场景的安全转换流程 - 包含输入参数校验、临时列操作、数据迁移及异常回滚机制 - 提供详细的执行日志输出与错误处理 - 增加使用示例注释,便于实际调用参考 --- SQL/202511/20251125/modify_column_type.sql | 55 ++++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 SQL/202511/20251125/modify_column_type.sql diff --git a/SQL/202511/20251125/modify_column_type.sql b/SQL/202511/20251125/modify_column_type.sql new file mode 100644 index 0000000..13b4224 --- /dev/null +++ b/SQL/202511/20251125/modify_column_type.sql @@ -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');