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');