0

月とクレジット カード番号を指定するストアド プロシージャを作成する必要があり、月の最初の 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のままのようです??

4

4 に答える 4

3

DEALLOCATE の使用を提案する人もいます。これに関する問題は、一部のエラー状況では呼び出されないことです。その後、同じ接続を使用してこのストアド プロシージャを呼び出そうとしても、カーソルは引き続き割り当てられます。

代わりに、カーソルを LOCAL として宣言することをお勧めします。つまり、ストアド プロシージャが終了すると (通常かどうかに関係なく)、自動的に割り当てが解除されます。

于 2010-12-14T14:24:30.093 に答える
1

close sinallages 

あなたは電話する必要があります

deallocate sinallages 

DEALLOCATE(Transact-SQL)をご覧ください

于 2010-12-14T13:29:51.377 に答える
1

はい、カーソルを閉じた後、カーソルの割り当てを解除する必要があります。また、カーソルを閉じる前にクエリでエラーが発生した場合は、カーソルが開いたままになっている可能性があるため、プロシージャを再度実行する前にCLOSEandを実行することをお勧めします。DEALLOCATE2 番目のエラーではDAY()、 type の変数に対して関数を使用していINTます。 更新:問題を修正したので、ロジックに従って各 @pos 変数を追加すると、そのうちの 1 つが常に null になるため、次のように追加する必要があります: Print isnull(@pos1,0)+isnull(@ pos2,0)+isnull(@pos3,0)if day(@mera)<=10if @mera<=10

于 2010-12-14T13:35:36.587 に答える
0

カーソルを閉じた後、カーソルの位置を変更する必要があります。

DEALLOCATE sinallages

http://msdn.microsoft.com/en-us/library/ms188782.aspx

于 2010-12-14T13:30:53.193 に答える