最近由于业务需要,要将一个老版本的系统升级到新版本。 两个版本之间表结构存在一些差异,为了原来系统运行的数据不丢失,需要做一个跨实例跨表的数据转移。(即升级)
这里记录一些用到的sql:
1.DBLink
-- Create database link
create database link DBLinkxxx
connect to userName identified by password
using '(DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 11.12.13.14)(PORT = 1521))(CONNECT_DATA =(SERVER = DEDICATED)(SERVICE_NAME = abc)))';
这里的 DBLinkxxx 是指创建的DBLink的名称
userName 是指链接目标的用户名 password是对应的密码
HOST = 11.12.13.14 是目标数据库IP地址
PORT = 1521 是端口
SERVICE_NAME = abc abc是目标数据库实例
2.表结构相同,只需要转移数据
insert into Table_A select * FROM userName.Table_B@DBLinkxxx;
Table_A是我们的新表, userName.Table_B 是用户下的Table_B表
@DBLinkxxx 是指使用上面的dblink链接两个数据库实例。
3.存在表结构差异,转移某些字段
insert into Table_A(ID,PROJECT_ID,EXEC_START_TIME,EXEC_END_TIME,EXEC_RESULT,MESSAGE) select ID,CYCLE_ID,START_TIME,END_TIME,EXECUTE_RESULT,MESSAGE FROM userName.Table_B@DBLinkxxx;
这个是要转移 B表中的 ID,CYCLE_ID,START_TIME,END_TIME,EXECUTE_RESULT,MESSAGE 6个字段到 A表中的ID,PROJECT_ID,EXEC_START_TIME,EXEC_END_TIME,EXEC_RESULT,MESSAGE字段中, 顺序是一一对应的。
4.匹配另一张表中的某一个数据,更新表中字段
update TABLE_A a set USERNAME = (select USERNAME from t_user where USER_ID = to_number(a.USERNAME));
这里业务需求是将用户ID改成用户名称,所以将table_a中的userName字段,匹配t_user表中的ID与Name的对应关系,全量修改为名称。
to_number(a.USERNAME) 这里用的是数字转换函数,将内容为数字的varchar格式转换为Number格式。 另外这里的a 对应前面的TABLE_A a,表名后加上a,表示我后面的sql中用a作为这个表的别名,可以让sql短一点。 其实这里就相当于Table_a.USERNAME。
5.替换函数 replace(field_name,'a','b')
update T_TEMPLATE set BASIC_INFO=replace(BBASIC_INFO,'9000000','kewen')
这里是将T_TEMPLATE表中BASIC_INFO字段里面,所有出现的9000000,替换为kewen。
replace(BBASIC_INFO,'9000000','kewen'),这里括号中第一个字段为需要修改的字段名,第二个是被替换的内容,第三个是替换后的内容。