月とクレジット カード番号を指定するストアド プロシージャを作成する必要があり、月の最初の 10 日間に行われたトランザクションごとに 1%、10 日から 20 日間のトランザクションに対して 2%、3% を計算します。 20を超えるトランザクションの場合。カーソルを使用する必要があります。
私はこのコードを書きましたが、手順を実行しようとするといくつかのエラーが発生します
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 cc_number=@cardNo and month([DateTime])=@minas
/* 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 cc_number=@cardNo and month([DateTime])=@minas )
/* get 1st row*/
fetch sinallages into @karta,@mera,@poso
while (/*@@sqlstatus != 2*/@counter<@count)
begin
if day(@mera)<=10
set @pos =@poso+ @poso * 0.01
else
if day(@mera)>10 and day(@mera)<=20
set @pos2 =@poso+ @poso * 0.02
else
if day(@mera) > 20
set @pos3 =@poso+ @poso * 0.03
fetch sinallages into @karta,@mera,@poso
set @counter=@counter+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
カーソル フェッチ: データ型 datetime から int への暗黙的な変換は許可されていません。
ありがとう:)ストアドプロシージャの最後でカーソルの割り当てを解除し、day()を削除しました。今、私はpos + pos2 + pos3を印刷したいと思います。print pos+pos2+pos3 を使用していますが、何も印刷されません。何故ですか ??
................
set @counter=@counter+1
end
print @pos+@pos2+@pos3
close sinallages
return
DEALLOCATE sinallages;
変数po、pos2、pos3がnullのままのようです??