oracle字段类型转换的处理

Oracle的CLOB类型数据处理: http://donald-draper.iteye.com/admin/blogs/2335296
Oracle中表列由VARCHAR2类型改成CLOB : http://blog.csdn.net/jssg_tzw/article/details/40829867
mysql中把一个表的数据批量导入另一个表中: http://blog.csdn.net/evan_endian/article/details/8652528
Oracle中表列由VARCHAR2类型改成CLOB文章中方式是,
假设要将test的表中col字段(VARCHAR2),改为CLOB,
以下所有测试在navicat环境下:表名带引号,在SQLPLUS,则不用,注意区分
首先将添加temp字段
alter table "test" add  "temp" CLOB;
UPDATE "test"  SET "temp" = "col";

当表字段顺序无关时,则删除指定的列,
alter table "test" drop column "col";

然后修改temp字段为col
alter table "test" RENAME COLUMN "temp" TO "col";

这种方案,是在字段顺序无关,当与顺序有关,且col字段为主键不能为null,这时怎么办呢?


假设原表为product,product含有一个字段为fallTime(DATE),且为主键,不为空,现需要将fallTime字段改为
varchar类型;
如果直接导出SQL脚本,修改表结构,及数据,任务繁琐,同时SQL脚本中的,记录往往是分条insert
实例如下:
insert into product ....;
insert into product ....;
.....
这种脚本跑的相当慢,有人建议,将insert放在Begin和commit之间一次提交,
而不是insert一条记录,要commit一次;还有人建议修改为,如下形式:
insert into product values XXX,YYY,......
这两种方式我没用,你可以试试;


如果用临时字段转换,因为要修改字段fallTime的类型,而fallTime又是主键,不能直接修改fallTime字段类型
,这是因为修改fallTime字段,fallTime列值必须为null,而fallTime又是主键,又不能为空,这个如何是好?

下面将介绍一种方案:
首先将导出product结构,包括主键,索引,表注释和字段注释等信息,修改表结构,将fallTime的DATE类型修改为
varchar,根据修改后的表结构信息创建test表,注意test表中的fallTime字段为varchar
1.在test表中添加临时转化字段:
alter table "test" add  "temp" varchar2(10);


2.然后将product的数据导入到test中:
INSERT INTO "test" SELECT t.*,"TO_CHAR"(t.fallTime,'YYYY-MM-DD') FROM product t;


3.如果fallTime可以为null则执行下面语句:
UPDATE "test"  SET "fallTime" = NULL;
UPDATE "test"  SET "fallTime" = "temp";

不能为空则执行下面语句:
UPDATE "test"  SET "fallTime" = "temp";


4.然后删除product,删除test的temp列:
alter table "test" drop column "temp";


5.重名test为product即可。
其中1,2的另一种方法:
先保证表结构相同,先插入数据
INSERT INTO "test" SELECT t.* FROM product t;

在添加列
alter table "test" add  "temp" varchar2(10);

再更新列
UPDATE product SET "temp" = "TO_CHAR"(fallTime,'YYYY-MM-DD');

总结:
针对列顺序无关的,则直接新建临时字段,删除先前字段,重名临时字段即可;对于字段顺序有关,且字段不能为空的,copy表结构,并修改需要更改的字段的类型,新建临时字段,将需要转换的字段数据插入到临时字段,然后将临时字段,update and set到需要更改类型字段,删除临时字段,修改表名,即可。

猜你喜欢

转载自donald-draper.iteye.com/blog/2335441
今日推荐