1.首先是导出几张表的数据、结构;可以用plsql工具,也可以用命令。
plsql工具:
命令:
导出数据库:
操作:运行:cmd 然后输入:
exp lw/lw@ORCL file=d:\lw.dmp tables=(tablename1,tablename1) owner=(lw);
2.导入数据库
操作:运行:cmd 然后输入:根据主外键顺序来导入数据,不然是导入不全的。
imp username/password@本地net服务名 file=xxx.dmp fromuser=energy touser=energy1 tables=(tablename) ignore=y;
ignore=y加上这个有表的情况下忽略,也就是出现相同记录的忽略,没有记录的插入。这样问题又来了相同记录需要更新怎么办?
3.更新数据库:
A.在本地建立一个用户test,记住表空间名称需要一样的。
imp username/password@本地net服务名 file=xxx.dmp fromuser=energy touser=test full=y;
直接全部导入数据库
B.在真正需要导入数据库里建立几个临时表,可以根据表结构sql来创建,只保留主键就行了,外键不用。
然后把用户test的表查询的数据全部复制,粘贴到临时表里:
写一个存储过程:
create or replace procedure CHECK_DATA
is
type sp_test1_cursor is ref cursor;
cur_m_energy sp_test1_cursor;
ENERGYNO_TEMP M_ENERGY_TEMP.ENERGYNO%type;
begin
open cur_m_energy for select
ENERGYNO
from M_ENERGY_TEMP ;
Loop
fetch cur_m_energy
into ENERGYNO_TEMP;
exit when cur_m_energy%NOTFOUND;
update TEST1 a
set a.ENERGYNAME = (select ENERGYNAME from M_ENERGY_TEMP t where t.energyno=ENERGYNO_TEMP ),
a.ENERGYUNIT=(select ENERGYUNIT from M_ENERGY_TEMP t where t.energyno=ENERGYNO_TEMP ),
a.ENERGYTYPE=(select ENERGYTYPE from M_ENERGY_TEMP t where t.energyno=ENERGYNO_TEMP ),
a.REMARK=(select REMARK from M_ENERGY_TEMP t where t.energyno=ENERGYNO_TEMP ),
a.STATUS=(select STATUS from M_ENERGY_TEMP t where t.energyno=ENERGYNO_TEMP ),
a.SORTNO=(select SORTNO from M_ENERGY_TEMP t where t.energyno=ENERGYNO_TEMP )
where a.ENERGYNO = ENERGYNO_TEMP;
commit;
end loop;
close cur_m_energy;
end CHECK_DATA;
sql窗口执行就可以了:call CHECK_DATA();
cmd窗口也可以:
sqlplus
输入账号,密码 执行存储过程
exec CHECK_DATA();