先声明,需要用delphi来实现现在有两个表,table1和table2两个表
结构一样
我想将table1中的数据导入到table2中,数据量有几十万条,如果发现记录重复或其他错误,需要写日志文件。代码如下:
adoquery1.close;
adoquery1.sql.clear;
sqlStr := 'select * from '+oldTableName;
try
adoquery1.sql.add(sqlStr);
adoquery1.Prepared:=true;
adoquery1.Open;
adoquery1.Prepared:=false;
adoquery1.first; //移动到第一个记录
except
on E: Exception do
begin
AppendLineToFile(logFileName,'旧系统表或视图不存在:'+oldTableName+';'+newTableName+';'+E.Message+sqlStr);//写日志文件
continue;
end;
end;
//取得所有字段名字
sqlTable :='';
for i:=0 to adoquery1.FieldCount-2 do
begin
sqlTable := sqlTable + adoquery1.Fields[i].FieldName +','
end;
sqlTable := sqlTable + adoquery1.Fields[i].FieldName ; //逐条记录添加 while (not adoquery1.eof) do
begin
if stop_flag='true' then exit;
sqlStr:=' Insert into '+ newTableName +'('+ sqlTable+')values(';
for i:=0 to adoquery1.FieldCount-2 do
begin
s_value := adoquery1.Fields[i].AsString;
s_value:=StringReplace(s_value,s_old,s_new,[rfReplaceAll]) ;
sqlStr := sqlStr + ''''+s_value+''','
end;
s_value := adoquery1.Fields[i].AsString;
s_value:=StringReplace(s_value,s_old,s_new,[rfReplaceAll]) ;
sqlStr := sqlStr +''''+ s_value+''')';
adoquery2.close;
adoquery2.sql.clear;
adoquery2.sql.add(sqlStr);
try
adoquery2.Prepared:=true;
adoquery2.ExecSQL;
adoquery2.Prepared:=false;
except
on E: Exception do
begin
AppendLineToFile(logFileName,oldTableName+';'+newTableName+';'+E.Message+sqlStr);//写日志文件
end;
end; adoquery1.next; //移动到下一条记录
end;
各位有什么好的办法可以提高速度么???
用ExecSQL好像是执行后就直接commit了,
可不可以有一个办法让一次相当于commit1000条记录?
最重要的我要记录错误的日志文件!!!
帮忙了,一定给分
结构一样
我想将table1中的数据导入到table2中,数据量有几十万条,如果发现记录重复或其他错误,需要写日志文件。代码如下:
adoquery1.close;
adoquery1.sql.clear;
sqlStr := 'select * from '+oldTableName;
try
adoquery1.sql.add(sqlStr);
adoquery1.Prepared:=true;
adoquery1.Open;
adoquery1.Prepared:=false;
adoquery1.first; //移动到第一个记录
except
on E: Exception do
begin
AppendLineToFile(logFileName,'旧系统表或视图不存在:'+oldTableName+';'+newTableName+';'+E.Message+sqlStr);//写日志文件
continue;
end;
end;
//取得所有字段名字
sqlTable :='';
for i:=0 to adoquery1.FieldCount-2 do
begin
sqlTable := sqlTable + adoquery1.Fields[i].FieldName +','
end;
sqlTable := sqlTable + adoquery1.Fields[i].FieldName ; //逐条记录添加 while (not adoquery1.eof) do
begin
if stop_flag='true' then exit;
sqlStr:=' Insert into '+ newTableName +'('+ sqlTable+')values(';
for i:=0 to adoquery1.FieldCount-2 do
begin
s_value := adoquery1.Fields[i].AsString;
s_value:=StringReplace(s_value,s_old,s_new,[rfReplaceAll]) ;
sqlStr := sqlStr + ''''+s_value+''','
end;
s_value := adoquery1.Fields[i].AsString;
s_value:=StringReplace(s_value,s_old,s_new,[rfReplaceAll]) ;
sqlStr := sqlStr +''''+ s_value+''')';
adoquery2.close;
adoquery2.sql.clear;
adoquery2.sql.add(sqlStr);
try
adoquery2.Prepared:=true;
adoquery2.ExecSQL;
adoquery2.Prepared:=false;
except
on E: Exception do
begin
AppendLineToFile(logFileName,oldTableName+';'+newTableName+';'+E.Message+sqlStr);//写日志文件
end;
end; adoquery1.next; //移动到下一条记录
end;
各位有什么好的办法可以提高速度么???
用ExecSQL好像是执行后就直接commit了,
可不可以有一个办法让一次相当于commit1000条记录?
最重要的我要记录错误的日志文件!!!
帮忙了,一定给分
我的办法是一条一条度出来,然后写进去,如果两个表在一个数据库中,就直接写存储过程吧,如果是两个数据库,或者两个类型的数据库建议你还是通过逐条写入的办法,这样好象比较容易控制进度和错误日至
用游标依次读数据
偶在ORACLE里同一库导数据,加上数据检验转换
1000条/秒
什么主机,b4一下.楼主说一下用什么数据库?oracle的话也许我可以帮你.
不一定要用delphi的,也许换个方法会好很多.