SQL> desc ng_store_sales
名稱 空? 型別
-------------------------------- -------- -----------------------
BUYER_UID VARCHAR2(6)
STORE_NO NUMBER(5)
SALE_AMOUNT NUMBER
SALE_AMOUNT_BUYER NUMBER
MONTH NUMBER(2)
YEAR NUMBER(4)
游標如下:
real tsales;
string tbuyer;
declare buy cursor for
select buyer_uid,sum(sale_amount)
from ng_store_sales
where year= :lsyear and month= :lsmonth
group by buyer_uid
;
open buy ;
do while sqlca.sqlcode=0;
fetch buy into :tbuyer,:tsales;
update ng_store_sales set SALE_AMOUNT_BUYER= :tsales
where buyer_uid=:tbuyer and year= :lsyear and month= :lsmonth ;
fetch buy into :tbuyer,:tsales;
loop;
close buy;
commit;
按buyer_uid匯總ng_store_sales表里sale_amount欄位資料,更新sale_amount_buyer欄位
SQL> select buyer_uid,sum(sale_amount)
2 from ng_store_sales group by buyer_uid;
BUYER_ SUM(SALE_AMOUNT)
------ ----------------
F1 1570627.17
F2 3445516.92
F3 763568.04
F4 715882.3
F5 5093196.31
執行游標后的,結果如下面:
select distinct buyer_uid,sale_amount_buyer from ng_store_sales;
BUYER_ SALE_AMOUNT_BUYER
------ -----------------
F1 1570627.13
F2 3445517
F3 0
F4 715882.313
F5 0
為何資料只更新一半?
uj5u.com熱心網友回復:
year= :lsyear and month= :lsmonth更新時還有year和month條件,最后查詢時,又沒有這兩個條件,結果當然可能不同
uj5u.com熱心網友回復:
1、建議:你這個完全無需游標來實作,游標實作這樣的功能非常慢,你可以直接使用一句更新陳述句進行更新2、問題:你這個cursor執行程序完全可能出現sql問題,open cursor時,sqlcode為0,但是你fetch時可恩呢個sqlcode就不是0。當然你更新陳述句可能也不成功!
open buy ;
do while sqlca.sqlcode=0;
fetch buy into :tbuyer,:tsales;
if sqlca.sqlcode <> 0 then
rollback using sqlca;
messageBox("提示","失敗",stopSign!)
return
end if
update ng_store_sales set SALE_AMOUNT_BUYER= :tsales
where buyer_uid=:tbuyer and year= :lsyear and month= :lsmonth ;
if sqlca.sqlcode <> 0 then
rollback using sqlca;
messageBox("提示","失敗",stopSign!)
return
end if
fetch buy into :tbuyer,:tsales;
loop;
close buy;
uj5u.com熱心網友回復:
對于您的第一個建議是可以,
對于您的第二個,好象不對
uj5u.com熱心網友回復:
查詢是沒加這兩個條件,是因為表里就一個月的資料,所以查詢沒加,跟這個無關的,不過,還是謝謝你
uj5u.com熱心網友回復:
客氣!1、你select也加了,update也加了,都是同一個條件,一條陳述句更新絕對沒問題
2、對于第二個,至于為什么要加判斷,琢磨下吧
uj5u.com熱心網友回復:
如果是復雜的計算更新,一條陳述句更新可能不行吧,要么就用觸發器?
對于第二個,本來還能執行,加上你那個判斷,根本執行不了, 忘了說了,資料庫是oracle 8i
uj5u.com熱心網友回復:
針對你這個問題,不是針對所有的問題;如果加個判斷不能執行說明陳述句有問題,如果沒問題至少也說明ORACLE和MSSQL不同
uj5u.com熱心網友回復:
找到原因了,謝謝各位的熱情有兩句的位子顛倒了
do while ...
fetch ...
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/85284.html
標籤:數據庫相關
上一篇:PB下可以編程為SQL2000資料庫增加或洗掉用戶名嗎,如SA
下一篇:formula one控制元件
