これまでで一番「情けなかったとき」はいつですか?

カーソルを使って、最終行レコードの判断はどうすればよいのでしょうか。
処理はオーソドックスなスタイルでコーディングしているとします。
「ループ処理内で、FETCH NEXTした際に、最終行か判断したい」という質問です。
EOFで最終行だと判断するのは一般的ですが、ループ内で通常行と最終行の切り分けをしたいのです。特に何かの制約や事情があるわけではありませんので、実現できればそれでOKです。
要するに、最終行レコードが、通常行レコードの処理とかぶらなければ、用件は満たせるのですが、あまり懲りたくもないのもあって、ちょっと実装イメージが思い浮かばず、困ってます。

ご回答お願いします。

A 回答 (3件)

#1,#2です。


@@CURSOR_ROWSが件数を返すのはSTATIC/KEYSETカーソルのみのはずです。
STATICは指定してますよね?
    • good
    • 0

動的カーソルという言葉はどの意味でつかわれているのでしょうか?


SQL Serverで動的カーソルと言えば、カーソル処理中もすべての更新が反映するカーソルのことですが。。。

でも、この手の処理にカーソルを使う発想がOracleっぽい気がしますので(SQL Serverでは普通カーソルは使わないケースです)、おそらくは「動的SQLをバインドしたカーソル」の意味でつかわれているのではないかと推測しました。
そうすると、サンプル以下の通りです。

DECLARE @FLD int
DECLARE @CNT int
DECLARE @sql varchar(MAX)
SET @sql = 'DECLARE C CURSOR STATIC FOR SELECT FLD FROM TBL'
EXEC (@sql)
OPEN C
SET @CNT=@@CURSOR_ROWS
FETCH NEXT FROM C INTO @FLD
WHILE (@@FETCH_STATUS=0)
BEGIN
SET @CNT=@CNT-1
IF (@CNT=0) PRINT 'LAST ROW:'+CONVERT(varchar,@FLD)
ELSE PRINT 'REGULAR ROW:'+CONVERT(varchar,@FLD)
FETCH NEXT FROM C INTO @FLD
END
CLOSE C
DEALLOCATE C

読み違えていればごめんなさい。

この回答への補足

やりたいことの意図は合ってるのですが、うまくいきませんでした。
SET @CNT=@@CURSOR_ROWSの部分で、カーソルで拾ったレコード数が保持されていることを期待しましたが、マイナス値で、絶対値としてもレコード数とは違うようです。
当方のコーディングがヘマってるかもしれませんが…
他に追われて、なかなか調査しきれてませんが、SET @CNT=@@CURSOR_ROWSという箇所では、レコード数が取得できると思ってよいでしょうか。でないと、デクリメントしても意味ないですしね。動的にバインドしても成り立ちますよね。この部分が少し気になってます。

補足日時:2010/06/08 23:50
    • good
    • 0

凝ったことは必要ないならば、単純に件数で判断しては?



DECLARE @FLD int
DECLARE @CNT int
DECLARE @C CURSOR
SET @C = CURSOR FAST_FORWARD FOR SELECT FLD FROM TBL
SET @CNT=@@ROWCOUNT
OPEN @C
FETCH NEXT FROM @C INTO @FLD
WHILE (@@FETCH_STATUS=0)
BEGIN
 SET @CNT=@CNT-1
 IF (@CNT=0) PRINT 'LAST ROW'
 ELSE    PRINT 'REGULAR ROW'
 FETCH NEXT FROM @C INTO @FLD
END

この回答への補足

要件が足りてました。ごめんなさい。
(1) カーソルは動的カーソルで行いたい
(2) 回答の例で付け加えで言いますと、@FLDを表示したい。

というイメージで、ご回答していただけたらうれしいです。
よろしくお願いします。

補足日時:2010/06/06 12:12
    • good
    • 1

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

関連するカテゴリからQ&Aを探す


おすすめ情報