我必須編寫一個存儲過程,在這裏給出月份和一個信用卡號,它爲本月前10天的每筆交易計算1%,爲2%計算交易在10到20之間,交易在20以上時爲3%。 我必須使用遊標。幫助,存儲過程和遊標
我寫了這個代碼,但我得到了一些錯誤,當我嘗試運行precedure
create procedure cardP
/* month ex 1,3,5 etc*/
@minas int,
@cardNo bigint
as
/* creating the cursor*/
DECLARE sinallages CURSOR
FOR SELECT cc_number,day([DateTime]),charged_amount FROM transactions
where [email protected] and month([DateTime])[email protected]
/* declaring local variables*/
declare @poso int,@karta bigint,@mera int,@pos float,@pos2 float,@pos3 float,
@count int,@counter int
open sinallages
set @count=(select count(cc_number) from transactions where [email protected] and month([DateTime])[email protected])
/* get 1st row*/
fetch sinallages into @karta,@mera,@poso
while (/*@@sqlstatus != 2*/@counter<@count)
begin
if day(@mera)<=10
set @pos [email protected]+ @poso * 0.01
else
if day(@mera)>10 and day(@mera)<=20
set @pos2 [email protected]+ @poso * 0.02
else
if day(@mera) > 20
set @pos3 [email protected]+ @poso * 0.03
fetch sinallages into @karta,@mera,@poso
set @[email protected]+1
end
close sinallages
return
當我調用過程我得到
EXEC cardP @minas = 5,@cardNo = 4929569752542450
Msg 16915, Level 16, State 1, Procedure cardP, Line 20
A cursor with the name 'sinallages' already exists.
Msg 16922, Level 16, State 1, Procedure cardP, Line 31
遊標提取:從數據類型的DAT隱式轉換不允許將etime轉換爲int。
謝謝:)我現在在存儲過程結束時取消分配遊標並刪除了day()。現在我想打印pos + pos2 + pos3。我使用打印pos + pos2 + pos3但它不打印任何東西。這是爲什麼 ??
................
set @[email protected]+1
end
print @[email protected][email protected]
close sinallages
return
DEALLOCATE sinallages;
它似乎像hte變量po,pos2,pos3是空的?? ??
我意識到這是家庭作業,你必須使用遊標,但你應該明白遊標不是你通常想要寫入生產代碼的東西。就我個人而言,除了想要成爲dbas的高級人士之外,我根本不會考慮教導遊標。請看看這個鏈接:http://wiki.lessthandot.com/index.php/Cursors_and_How_to_Avoid_Them – HLGEM 2010-12-14 14:30:18
我也想指出,如果你想要數學的準確性,float是一個糟糕的選擇。您可能爲了您自己的學習目的嘗試使用case語句而不是光標來重寫此語句。 – HLGEM 2010-12-14 14:31:55