線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1551
推到 Plurk!
推到 Facebook!

12萬左右的數據,插入另外表老死,如何處理為好

缺席
diashad
一般會員


發表:20
回覆:10
積分:6
註冊:2006-08-10

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-10-09 21:45:22 IP:202.173.xxx.xxx 訂閱
大家好.
有如下問題,兩臺一樣的oracle server A和B,分別有相同的表TABEL1,我要將A.TABLE1中有,B.TABLE1中沒有的數據插入到B.TABLE1中.
我用ADO QUERY 取A.TABLE1,再查詢B.TABLE1中有沒有,沒有就插入,循環至結束,但是每次12萬的數據一運行就死.
不知要如何處理,才有更好的效果..

LABEL6.Caption:=ADOQUERY1.FIELDBYNAME('MACHINE_ID').AsString;
q_smt.CLOSE;
q_smt.sql.Clear;
q_smt.sql.Add('select * from VT_DB.PCB_INFO WHERE TEST_MACHINE_ID=:V1'); //7 and to_char(end_date,''yyyy-mm-dd hh24:mi:ss'')>:D1 AND to_char(end_date,''yyyy-mm-dd hh24:mi:ss'')<=:D2');
// q_smt.sql.Add('select * from VT_DB.PCB_INFO ');
//if date1='' then q_smt.Params[0].AsString:=LABEL2.Caption else q_smt.Params[0].AsString:=date1;
q_smt.Parameters.ParamValues['V1']:=STRTOINT(LABEL6.Caption);
q_smt.open;
if q_smt.recordcount<>0 then
begin
addmsg(LABEL6.CAPTION 'PCB_INFO:' inttostr(q_smt.recordcount) ' records');
addmsg('開始時間' datetimetostr(now));
listbox1.Items.Add('Traslating') ;
ProgressBar1.Max:=q_smt.RecordCount;
ProgressBar1.Min:=0;
m:=1;
M2:=1;
while not q_smt.Eof do
begin
ProgressBar1.Position:=m;
q_CA.close;
q_CA.sql.Clear;
q_CA.sql.Add('SELECT TEST_MACHINE_ID FROM vt_db.RESULT_IMAGE_INFO WHERE ');
q_CA.sql.Add('TEST_MACHINE_ID=:V1 AND SAVED_MACHINE_ID=:V2 AND PROGRAM_NAME_ID=:V3 ');
q_CA.sql.Add(' AND REVISION_NO=:V4 AND SERIAL_NO=:V5 AND LOAD_COUNT=:V6 AND PCB_NO=:v7 ');
q_CA.Parameters.ParamValues['V1']:=q_smt.fieldbyname('TEST_MACHINE_ID').AsInteger;
q_CA.Parameters.ParamValues['V2']:=q_smt.fieldbyname('SAVED_MACHINE_ID').AsInteger;
q_CA.Parameters.ParamValues['V3']:=q_smt.fieldbyname('PROGRAM_NAME_ID').AsInteger;
q_CA.Parameters.ParamValues['V4']:=q_smt.fieldbyname('REVISION_NO').AsInteger;
q_CA.Parameters.ParamValues['V5']:=q_smt.fieldbyname('SERIAL_NO').AsInteger;
q_CA.Parameters.ParamValues['V6']:=q_smt.fieldbyname('LOAD_COUNT').AsInteger;
q_CA.Parameters.ParamValues['V7']:=q_smt.fieldbyname('PCB_NO').AsInteger;
Q_CA.OPEN;
IF Q_CA.RecordCount=0 THEN
BEGIN
q_CA.close;
q_CA.sql.Clear;
q_CA.sql.Add('insert into vt_db.PCB_INFO values(:v1,:v2,:v3,:v4,:v5,:v6,:v7,:v8,:v9,:v10,:v11,:v12,:v13,:v14,:v15,:v16,:v17,:v18,:v19,:v20');
q_CA.SQL.Add(',:V21,:V22,:V23,:V24,:V25,:V26,:V27,:V28,:V29,:V30,:V31,:V32,:V33)') ;
q_CA.Parameters.ParamValues['V1']:=q_smt.fieldbyname('TEST_MACHINE_ID').AsInteger;
q_CA.Parameters.ParamValues['V2']:=q_smt.fieldbyname('SAVED_MACHINE_ID').AsInteger;
q_CA.Parameters.ParamValues['V3']:=q_smt.fieldbyname('PROGRAM_NAME_ID').AsInteger;
q_CA.Parameters.ParamValues['V4']:=q_smt.fieldbyname('REVISION_NO').AsInteger;
q_CA.Parameters.ParamValues['V5']:=q_smt.fieldbyname('SERIAL_NO').AsInteger;
q_CA.Parameters.ParamValues['V6']:=q_smt.fieldbyname('LOAD_COUNT').AsInteger;
q_CA.Parameters.ParamValues['V7']:=q_smt.fieldbyname('PCB_NO').AsInteger;
q_CA.Parameters.ParamValues['V8']:=q_smt.fieldbyname('PERSON_TESTER').AsString;
q_CA.Parameters.ParamValues['V9']:=q_smt.fieldbyname('TEST_TIME').AsInteger;
// showmessage(FormatDateTime('yyyy/mm/dd hh:mm:ss',q_smt.fieldbyname('END_DATE').AsDatetime));
q_CA.Parameters.ParamValues['V10']:=q_smt.fieldbyname('END_DATE').AsDatetime;
q_CA.Parameters.ParamValues['V11']:=q_smt.fieldbyname('PERSON_REVISOR').AsInteger;
q_CA.Parameters.ParamValues['V12']:=q_smt.fieldbyname('REVISE_TIME').AsInteger;
q_CA.Parameters.ParamValues['V13']:=q_smt.fieldbyname('REVISE_END_DATE').AsDatetime;
q_CA.Parameters.ParamValues['V14']:=q_smt.fieldbyname('INSERT_WAIT_TIME').AsInteger;
q_CA.Parameters.ParamValues['V15']:=q_smt.fieldbyname('EJECT_WAIT_TIME').AsInteger;
q_CA.Parameters.ParamValues['V16']:=q_smt.fieldbyname('STOP_TIME').AsInteger;
q_CA.Parameters.ParamValues['V17']:=q_smt.fieldbyname('TEST_RESULT').AsString;
q_CA.Parameters.ParamValues['V18']:=q_smt.fieldbyname('REVISE_RESULT').AsString;
q_CA.Parameters.ParamValues['V19']:=q_smt.fieldbyname('OVERLOOK_FAULT').AsString;
q_CA.Parameters.ParamValues['V20']:=q_smt.fieldbyname('ROT_COUNT').AsString;
q_CA.Parameters.ParamValues['V21']:=q_smt.fieldbyname('BARCODE').AsString;
q_CA.Parameters.ParamValues['V22']:=q_smt.fieldbyname('RACK_BARCODE').AsString;
q_CA.Parameters.ParamValues['V23']:=q_smt.fieldbyname('RACK_SERIAL').AsString;
q_CA.Parameters.ParamValues['V24']:=q_smt.fieldbyname('FAULT_RATE').AsInteger;
q_CA.Parameters.ParamValues['V25']:=q_smt.fieldbyname('COMPONENT_TOTAL').AsInteger;
q_CA.Parameters.ParamValues['V26']:=q_smt.fieldbyname('PIN_TOTAL').AsInteger;
q_CA.Parameters.ParamValues['V27']:=q_smt.fieldbyname('LAND_TOTAL').AsInteger;
q_CA.Parameters.ParamValues['V28']:=q_smt.fieldbyname('OUT_COMPONENT_TOTAL').AsInteger;
q_CA.Parameters.ParamValues['V29']:=q_smt.fieldbyname('VISUAL_FAULT_FLAG').AsString;
q_CA.Parameters.ParamValues['V30']:=q_smt.fieldbyname('LOT_CHANGED_COUNT').AsInteger;
q_CA.Parameters.ParamValues['V31']:=q_smt.fieldbyname('NUMBERING_CONDITIONS').AsString;
q_CA.Parameters.ParamValues['V32']:=q_smt.fieldbyname('REVISOR_MACHINE_ID').AsInteger;
q_CA.Parameters.ParamValues['V33']:=q_smt.fieldbyname('MACHINE_DETERMINATION').AsString;
// SHOWMESSAGE(SQL.TEXT) ;
q_CA.execsql;
M2:=M2 1;
END;
m:=m 1;
q_smt.NEXT;
end;
addmsg('VT_db_PCB_INFO : OK');
addmsg('結束時間' datetimetostr(now));
addmsg(LABEL6.CAPTION ' ' 'VT_db_PCB_INFO 實際轉入 :' INTTOSTR(M2) '記錄OK');

end;
------
x
編輯記錄
taishyang 重新編輯於 2007-10-11 10:12:10, 註解 無‧
syntax
尊榮會員


發表:26
回覆:1139
積分:1258
註冊:2002-04-23

發送簡訊給我
#2 引用回覆 回覆 發表時間:2007-10-10 12:21:17 IP:61.64.xxx.xxx 訂閱
這表示你的程式邏輯能力需要加強修練,你缺乏「山不轉路轉」的能力
程式請你自己寫,應該不會很難,以下是邏輯:
  1. 讀取 BTable1 的索引(Primary),存成 Data1:"xxx","xxx","xxx"... 的格式
  2. 讀取 A.Table1 的索引(Primary) 使用以下 SQL 語法
    select 索引 from A.Table1 where 索引 not in (Data1:"xxx", "xxx", "xxx"... 剛剛由 1. 取得的資料);
    可以取得 A 有 B 沒有的部分 Data2:"yyy","yyy","yyy"...
  3. 然後再將 Data2:"yyy","yyy","yyy"... 依據適當的筆數加以分割,例如 1000 筆
    然後依據分個數量,一一上傳到 B
  4. Select * from A.Table1 where 索引 in (分割部分的 Data2:"yyy","yyy","yyy"... )
    open 後馬上轉指定另一資料庫
    並馬上 Update,不清除,可省去一一assign 才去 Update 的時間
select 索引 from A.Table1 where 索引 not in (Data1:"xxx", "xxx", "xxx"... 剛剛由 1. 取得的資料); 在 MySQL 4.0 以上 測試過,可用,其他資料庫,請自行變換成類似語法

以上法則,保證不死雞,不無反應
系統時間:2024-05-04 11:43:00
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!