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

如何將SQL撈出的資料作區間Append

答題得分者是:pedro
rany
一般會員


發表:15
回覆:26
積分:8
註冊:2007-05-05

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-07-17 15:47:43 IP:220.132.xxx.xxx 訂閱

腦筋打結了,請教各位大大.....麻煩囉!!

我下SQL撈出某月份的資料,然後用while Not Query.Eof do 針對每一筆資料作判斷後Append。
但是,因為資料量很大,擔心執行過程中會有突發狀況產生導致程式中斷,所以想請問我要如何修改我的程式讓所有的資料可以針對每一天的資料作StartTransaction並可以利用Label在Form上,隨著執行時顯示目前執行的日期呢?(環境:D7,BDE,Oracle,WinXP)

[code delphi]

QueryA.Close;
QueryA.Sql.Clear;
QueryA.Sql.Add('SELECT *FROM A......');
QueryA.Open;
if Not QueryA.IsEmpty then
begin
DataBase.StartTransaction;
while Not QueryA.Eof do
begin
QueryB.Close;
QueryB.Sql.Clear;
QueryB.Sql.Add('SELECT *FROM B......');
QueryB.Open;
if QueryB.IsEmpty then
begin
QueryC.Append;
.....
QueryC.Post;
end;
QueryA.Next;
end;

try
DataBase.Commit;
except
DataBase.Rollback;

end else ShowMessage('無資料!!');

[/code]

編輯記錄
rany 重新編輯於 2008-07-17 15:53:23, 註解 無‧
rany 重新編輯於 2008-07-17 16:00:17, 註解 Sorry!!~這個問題好像要發表在"Delphi 新手問題 / 作業研討 "。‧
pedro
尊榮會員


發表:152
回覆:1187
積分:892
註冊:2002-06-12

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-07-17 16:29:19 IP:60.248.xxx.xxx 未訂閱
試看看下列這樣流程,ADOQueryC的Connection需設成ADOConnection1(ADOQuery,ADOConnection對應如你所述Query及DataBase)
[code delphi]
ADOConnection1.BeginTrans;
try
QueryA.open
while not QueryA.eof do
begin
QueryB.open
while not QueryB.eof do
begin
ADOQueryC.SQL='Insert xxxxxxxx';
ADOQueryC.ExecSQL;
end;
//顯示日期
end;
ADOConnection1.CommitTrans;
except
ADOConnection1.RollbackTrans;
end;
[/code]
===================引 用 rany 文 章===================
我下SQL撈出某月份的資料,然後用while Not Query.Eof do 針對每一筆資料作判斷後Append。
的資料作StartTransaction並可以利用Label在Form上,隨著執行時顯示目前執行的日期呢?(環境:D7,BDE,Oracle,WinXP)

QueryA.Close;
QueryA.Sql.Clear;
QueryA.Sql.Add('SELECT *FROM A......');
QueryA.Open;
if Not QueryA.IsEmpty then
begin
DataBase.StartTransaction;
while Not QueryA.Eof do
begin
QueryB.Close;
QueryB.Sql.Clear;
QueryB.Sql.Add('SELECT *FROM B......');
QueryB.Open;
if QueryB.IsEmpty then
begin
QueryC.Append;
.....
QueryC.Post;
end;
QueryA.Next;
end;

try
DataBase.Commit;
except
DataBase.Rollback;
rany
一般會員


發表:15
回覆:26
積分:8
註冊:2007-05-05

發送簡訊給我
#3 引用回覆 回覆 發表時間:2008-07-17 17:30:02 IP:220.132.xxx.xxx 訂閱
pedro大大的意思是每新增一筆就Commit,對嗎?
把程式改成下面這樣是不是也雷同??

QueryA.Close;
QueryA.Sql.Clear;
QueryA.Sql.Add('SELECT *FROM A......');
QueryA.Open;
if Not QueryA.IsEmpty then
begin
while Not QueryA.Eof do
begin
DataBase.StartTransaction;
QueryB.Close;
QueryB.Sql.Clear;
QueryB.Sql.Add('SELECT *FROM B......');
QueryB.Open;
if QueryB.IsEmpty then
begin
QueryC.Append;
..... //這中間還很多判斷,所以下Insert語法的模式不適合
QueryC.Post;
end;
try
DataBase.Commit;
except
DataBase.Rollback;
QueryA.Next;
end;
end else ShowMessage('無資料!!');
pedro
尊榮會員


發表:152
回覆:1187
積分:892
註冊:2002-06-12

發送簡訊給我
#4 引用回覆 回覆 發表時間:2008-07-17 17:37:11 IP:60.248.xxx.xxx 未訂閱
非也..非也..請再把上面流程看仔細
st33chen
尊榮會員


發表:15
回覆:591
積分:1201
註冊:2005-09-30

發送簡訊給我
#5 引用回覆 回覆 發表時間:2008-07-18 08:51:51 IP:122.116.xxx.xxx 訂閱
好像可以用 

insert into tableb (fld1, fld2, ..., fldn)
select afld1, afld2, ..., afldn
from tablea
where .......

一個 statement 解決掉
------
IS IT WHAT IT IS
我是 李慕白 請倒著唸.
又想把老話拿出來說, 請用台語發音 : 專家專家全是ROBOT CAR (滷肉腳啦);
都已接手這麼久了, 績效還是那麼爛, 講話還那麼大聲.
pedro
尊榮會員


發表:152
回覆:1187
積分:892
註冊:2002-06-12

發送簡訊給我
#6 引用回覆 回覆 發表時間:2008-07-18 09:14:30 IP:60.248.xxx.xxx 未訂閱
開題的大大有提到一行"撈出某月份的資料,然後用while Not Query.Eof do 針對每一筆資料作判斷後Append。"

===================引 用 st33chen 文 章===================
好像可以用
insert into tableb (fld1, fld2, ..., fldn)
一個 statement 解決掉
rany
一般會員


發表:15
回覆:26
積分:8
註冊:2007-05-05

發送簡訊給我
#7 引用回覆 回覆 發表時間:2008-07-18 09:27:05 IP:220.132.xxx.xxx 訂閱
pedro大大,如果改這樣哩??

[code delphi]

QueryA.Close;
QueryA.Sql.Clear;
QueryA.Sql.Add('SELECT *FROM A......');
QueryA.Open;
if not QueryA.IsEmpty then
begin
QueryA.First;
DM.dbServer.StartTransaction;
try
while Not QueryA.Eof do
begin
//判斷是否重複條件****
QueryB.Close;
QueryB.Sql.Clear;
QueryB.Sql.Add('SELECT *FROM B......');
QueryB.Open;
if QueryB.IsEmpty then
begin
QueryC.Append;
//.......其他判斷條件
QueryC.Post;
end;
labDate.Caption:='目前執行日期';
DM.qryDay.Next;
end;
DM.dbServer.Commit;
except
DM.dbServer.Rollback;
end;
end;

[/code]
編輯記錄
rany 重新編輯於 2008-07-18 09:28:23, 註解 無‧
rany 重新編輯於 2008-07-18 09:38:46, 註解 無‧
rany 重新編輯於 2008-07-18 09:42:00, 註解 無‧
pedro
尊榮會員


發表:152
回覆:1187
積分:892
註冊:2002-06-12

發送簡訊給我
#8 引用回覆 回覆 發表時間:2008-07-18 12:13:21 IP:60.248.xxx.xxx 未訂閱
流程上大概沒錯,我沒有你的環境,只能用猜的
QueryC的database是設成dbServer麼?
===================引 用 rany 文 章===================
pedro大大,如果改這樣哩??
DM.dbServer.StartTransaction;
QueryC.Append;
QueryC.Post;
DM.dbServer.Commit;
except
DM.dbServer.Rollback;
end;
st33chen
尊榮會員


發表:15
回覆:591
積分:1201
註冊:2005-09-30

發送簡訊給我
#9 引用回覆 回覆 發表時間:2008-07-19 19:41:17 IP:122.116.xxx.xxx 訂閱
想辦法把判斷寫成欄位, 或寫個 stored functions 來做這些判斷
才是發揮 sql 整批處理的優點
會把問題簡單化

===================引 用 pedro 文 章===================
開題的大大有提到一行"撈出某月份的資料,然後用while Not Query.Eof do 針對每一筆資料作判斷後Append。"

===================引 用 st33chen 文 章===================
好像可以用
insert into tableb (fld1, fld2, ..., fldn)
一個 statement 解決掉
------
IS IT WHAT IT IS
我是 李慕白 請倒著唸.
又想把老話拿出來說, 請用台語發音 : 專家專家全是ROBOT CAR (滷肉腳啦);
都已接手這麼久了, 績效還是那麼爛, 講話還那麼大聲.
pedro
尊榮會員


發表:152
回覆:1187
積分:892
註冊:2002-06-12

發送簡訊給我
#10 引用回覆 回覆 發表時間:2008-07-19 22:06:46 IP:221.120.xxx.xxx 未訂閱
如果有開規則檔那是最好不過了,用cursor搭配transation

請發問者說明這段批次處理會用在什麼案例?
也許st33chen 大大可分享另一種實作方法?

===================引 用 st33chen 文 章===================
想辦法把判斷寫成欄位, 或寫個 stored functions 來做這些判斷
才是發揮 sql 整批處理的優點
會把問題簡單化
rany
一般會員


發表:15
回覆:26
積分:8
註冊:2007-05-05

發送簡訊給我
#11 引用回覆 回覆 發表時間:2008-07-21 09:14:39 IP:220.132.xxx.xxx 訂閱
最後謝謝pedro & pedro,謝謝您們大力相挺呦!!....
因為不想大規模的修改,所以答題得分就給pedro 大大囉

pedro:QueryC的database是設成dbServer麼?
Re:Yes,因為我都習慣發問時用元件原本的Name,但是這個沒改過來(還有DM.
qryDay=QueryB)

st33chen:想辦法把判斷寫成欄位, 或寫個 stored functions 來做這些判斷
Re:對於 stored functions 不太懂說,
以及pedro 說的規則檔也???!!!....等有時間會再來爬文~~

pedro:請發問者說明這段批次處理會用在什麼案例?
Re:這只是筆對及結合倆個Table間的資料,再Append到另一個總和的Table去,其實沒有什麼特別的,只不過資料量很大,大約每一個月要60幾萬多筆的問題。
系統時間:2024-05-04 16:57:19
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!