一、Oracle数据库操作
1、问题背景
由于项目的需要,原始的数据库设计对时间字段的处理是直接以varchar(2)的方式进行存储的,这样在没有特殊需求的时候可能在一些操作上会显得比较方便。由于项目的的扩展,现需要加入时区的概念。数据库的时间字段需要全部改为TimeStamp类型,而历史的数据则需要全部修改为TimeStamp类型。
2、实现思路
由于涉及的表的数量很大,单一的手动一张张的修改难免出现遗漏的问题,并且时间损耗太高。现给出如下解决方案:首先扫描对应的表空间下的所有字段,凡是列名中包含time的统一记录下来。以表名、字段名的方式保存到内存中,最后输出到excel文件中。生成好excel文件后,根据该文件,读出所有的表名,利用DBUnit的技术,将数据库中对应的表中的数据保存到xml文件中。第三步,扫描所有的xml文件,将对应的字段的值读出,由String类型修改为TimeStamp类型然后重新写入xml文件中;第四步,修改表结构,将原来的varchar字段修改为TimeStamp类型;第五步,将已经修改完成的备份数据(xml文件)重新导入数据库;
3、问题引入
在进行第五步的操作时,向数据库的表中插入数据时,会出现外键约束的问题。
4、解决方法
在Oracle中可以对表的外键约束进行启用和禁用的操作。
禁用外键约束
select 'alter table '||table_name||' disable constraint '||constraint_name||';'
from user_constraints
where constraint_type='R'
启用外键约束
select 'alter table '||table_name||' enable constraint '||constraint_name||';'
from user_constraints
where constraint_type='R'
删除外键约束
select 'alter table '||table_name||' drop constraint '||constraint_name||';'
from user_constraints
where constraint_type='R'
5、为简化调用,将上述实现的代码打成jar包,然后用bat文件调用jar文件。bat文件的格式如下:
@echo off
echo ************************
echo *** begin to run ******
java -jar D:/test.jar
echo *** run over ******
echo *** press any key ******
pause