
カーソルを使って、最終行レコードの判断はどうすればよいのでしょうか。
処理はオーソドックスなスタイルでコーディングしているとします。
「ループ処理内で、FETCH NEXTした際に、最終行か判断したい」という質問です。
EOFで最終行だと判断するのは一般的ですが、ループ内で通常行と最終行の切り分けをしたいのです。特に何かの制約や事情があるわけではありませんので、実現できればそれでOKです。
要するに、最終行レコードが、通常行レコードの処理とかぶらなければ、用件は満たせるのですが、あまり懲りたくもないのもあって、ちょっと実装イメージが思い浮かばず、困ってます。
ご回答お願いします。
A 回答 (3件)
- 最新から表示
- 回答順に表示
No.2
- 回答日時:
動的カーソルという言葉はどの意味でつかわれているのでしょうか?
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という箇所では、レコード数が取得できると思ってよいでしょうか。でないと、デクリメントしても意味ないですしね。動的にバインドしても成り立ちますよね。この部分が少し気になってます。
No.1
- 回答日時:
凝ったことは必要ないならば、単純に件数で判断しては?
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を表示したい。
というイメージで、ご回答していただけたらうれしいです。
よろしくお願いします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
ストアドプロシージャ_カーソルのヒット件数
その他(データベース)
-
カーソル0件の時にエラーを発生させる
Oracle
-
SELECT INTOで一度に複数の変数へ代入をするにはどのようにすれがよいでしょうか?
PostgreSQL
-
-
4
テーブルの最後(最新)のレコードを抽出したい
MySQL
-
5
PL/SQLカーソルの2重FORループができません
Oracle
-
6
テーブルの存在チェックについて
Oracle
-
7
PL/SQLでSPOOLさせたいのですが、可能でしょうか?
Oracle
-
8
SQL>UPDATEと同時にその件数をCOUNTする方法
その他(データベース)
-
9
ソート(PL/SQL)
その他(データベース)
-
10
ストアドプロシジャからストアドプロシジャを呼ぶには?
Oracle
-
11
ストアド実行時のエラー「参照しているコレクションは初期化されていません」
Oracle
-
12
CASE文のエラーについて
Oracle
-
13
SQLServer sqlcmdが使えない
SQL Server
-
14
テーブルからのselectにおいてデータの有無により結果をわけたい
PostgreSQL
-
15
SQLローダーCSV取込で、囲み文字がデータ中に入っている場合について
Oracle
-
16
SIDとSERVICE_NAMEの違いとは?
Oracle
-
17
変数が選択リストにありません
Oracle
-
18
SQLで列名を変数にできないでしょうか
SQL Server
-
19
SQLのエラー(~付近に不適切な構文があります)
SQL Server
-
20
INSERT文でフィールドの1つだけを他のテーブルから取ってきた値を入れたい
その他(データベース)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
カーソル0件の時にエラーを発生...
-
わり算の結果が整数でも小数点...
-
データ型でFloatとreal の計算...
-
ストアドプロシージャ_カーソル...
-
クエリの実行時間の目安
-
カーソル宣言をIFで分けられま...
-
SQL-LOADERの逆のもの
-
処理件数を非表示にしたい
-
ACCESSで一括処理する方法
-
Accessで処理経過を表示したい...
-
カーソルオープンの処理について
-
カーソルを使って、最終行レコ...
-
フィルターかけた後、重複を除...
-
差し込み後、元データを変更し...
-
SQLで特定の項目の重複のみを排...
-
外部参照してるキーを主キーに...
-
エクセルで最後の文字だけ置き...
-
select文の書き方「半角カナ+...
-
JANコードとPOSコードは同じ?
-
SELECT 文 GROUP での1件目を...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
カーソル0件の時にエラーを発生...
-
処理件数を非表示にしたい
-
カーソルを使って、最終行レコ...
-
カーソル宣言をIFで分けられま...
-
データ型でFloatとreal の計算...
-
NVLとDECODEのスピード差
-
(x 行処理されました)を表示さ...
-
ストアドプロシージャ_カーソル...
-
カーソルオープンの処理について
-
Accessで処理経過を表示したい...
-
クエリの実行時間の目安
-
定型メールからデターベースに...
-
RDBとVSAMの比較
-
テーブルの項目が異なるテーブ...
-
わり算の結果が整数でも小数点...
-
PL/SQLを使用した、プログラミ...
-
動的SQLの処理件数
-
【Oracle9i Gold】SQL*LOADERは...
-
PL/SQL で continue ?
-
MERGEコマンドについて
おすすめ情報