Oracle对数据库字段类型的可重复提交脚本

本文介绍了一种在Oracle数据库中安全地调整字段类型的方案。通过创建临时字段转移数据的方法,在不丢失现有数据的前提下更改了字段的数据类型。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

DECLARE
	cnt integer; 
	tempCnt integer;
	tempCnt2 integer;
BEGIN
	SELECT COUNT(0)
	INTO cnt
	FROM user_tab_columns a
	WHERE a.Table_name = upper('gdt_apply_intermediary')
		AND a.COLUMN_NAME = upper('INTERMEDIARYCOSTS')
		AND a.DATA_TYPE = upper('number')
		AND a.DATA_SCALE = 2;
		
	SELECT COUNT(0)
	INTO tempCnt
	FROM user_tab_columns a
	WHERE a.Table_name = upper('gdt_apply_intermediary')
		AND a.COLUMN_NAME = upper('INTERMEDIARYCOSTS_1');
		
	IF cnt = 0 THEN 
		IF tempCnt = 1 THEN 
			EXECUTE IMMEDIATE 'SELECT COUNT(0) FROM dual WHERE EXISTS (SELECT NULL FROM gdt_apply_intermediary a WHERE a.INTERMEDIARYCOSTS_1 IS NOT NULL)' INTO tempCnt2;
			IF tempCnt2 = 0 THEN
				EXECUTE IMMEDIATE 'ALTER TABLE gdt_apply_intermediary DROP COLUMN INTERMEDIARYCOSTS_1';
				EXECUTE IMMEDIATE 'ALTER TABLE gdt_apply_intermediary ADD (INTERMEDIARYCOSTS_1 integer)';
			END IF;
		ELSE
			tempCnt2 := 0;
			EXECUTE IMMEDIATE 'ALTER TABLE gdt_apply_intermediary ADD (INTERMEDIARYCOSTS_1 integer)';
		END IF;
		
		IF tempCnt2 = 0 THEN
			EXECUTE IMMEDIATE 'UPDATE gdt_apply_intermediary SET INTERMEDIARYCOSTS_1 = INTERMEDIARYCOSTS';
		END IF;
		
		EXECUTE IMMEDIATE 'update gdt_apply_intermediary set INTERMEDIARYCOSTS = null';
		EXECUTE IMMEDIATE 'ALTER TABLE gdt_apply_intermediary MODIFY (INTERMEDIARYCOSTS number(16,2))';
	END IF;
	SELECT COUNT(0)
	INTO tempCnt
	FROM user_tab_columns a
	WHERE a.Table_name = upper('gdt_apply_intermediary')
		AND a.COLUMN_NAME = upper('INTERMEDIARYCOSTS_1');
	IF tempCnt = 1 THEN
		EXECUTE IMMEDIATE 'UPDATE gdt_apply_intermediary SET INTERMEDIARYCOSTS = INTERMEDIARYCOSTS_1';
		EXECUTE IMMEDIATE 'ALTER TABLE gdt_apply_intermediary DROP COLUMN INTERMEDIARYCOSTS_1';
	END IF;
END;
/

相关逻辑:

cnt表示是该字段类型事都已经修改过了,

tempCnt表示是否有临时字段

tmpCnt表示临时字段中是否有值

 

首先判断该字段是否已经修改过,如果没有:

判断是否有临时字段

如果没有临时字段

新建临时字段

如果有临时字段

判断临时字段中是否有值

如果有不做操作

如果没有就记录tmpCnt2 = 0

如果没有临时字段

创建临时字段 并记录tmpCnt2 = 0

如果tmpCnt2 = 0;

复制原字段到临时字段

 

修改字段为需要的类型

复制临时表中的数据过来

删除临时表

(大概是这个意思,这样逻辑是因为字段中有数据就不可以修改字段类型)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值