こんにちは!ヒロポンです!
SQLってWEB系のフレームワークを使っていたりすると、あまり意識することないと思いますが、、、
私は会社でSQLServerを使ってDBを管理しています。
なのでゴリゴリでSQL文書きます。
DBとアプリ側で処理を分ける際に、悩むこともあります。
ですがアプリ側で出来ればSQL処理は書きたくないところ。
そんなときに出会ったのが、SQLServerでのカーソルってやつなんですね!
SQLのカーソルの存在意義って?
私なりに理解をしたSQLでのカーソルの存在意義等を書いていきます。
そもそもカーソルとは、DBの行を1行ずつ変数に入れて、任意の処理をして、最後の行まで回すという処理です。
プログラムでいうところの、For eachににていますね!
このカーソルのおいしさ!存在意義なのですが、1行ずつInsertしたい時に使うのかなーーと思います。
具体的には、テーブルAからテーブルB,C,Dを作成する際などに使うと存在意義があるのかなーーと思います。
現在私が思うカーソルの存在意義はInsert文くらいです。。。それ以外にご存じの方は教えていただけますでしょうか。。。。
SQLServerでのカーソルの使い方と書き方
では早速本編!SQLServerでのカーソルの使い方と書き方に入っていきましょう!
カーソルの基本的な流れ
カーソルの基本的な流れは以下の通りです。
- カーソル宣言
- カーソルOpen
- カーソルの1行目を取り出し、上記変数に入れる
- 最終行まで処理をして、クローズ
カーソルの具体的な構文
以下のテーブルを例に、具体的な構文を見てみましょう。
テーブル名:customer
CustomerName | age | address |
鈴木 | 20 | 東京 |
斎藤 | 30 | 神奈川 |
田中 | 25 | 東京 |
佐藤 | 26 | 千葉 |
カーソルで使う変数の宣言
declare
@CurName nvarchar(20),
@CurAge int,
@address nvarchar(20)
カーソルの宣言
declare curデータ cursor local for
select CustomerName,age,address
from customer
カーソルのオープン
open curデータ
カーソルの値を変数に入れる
fetch next from curデータ
into @CurName,@CurAge,@address
最終行までループ
while(@@fetch_status = 0)
BEGIN
-- ここに特定の処理を書く
-- 処理が終わったら変数の入れ替え
fetch next from curデータ
into @CurName,@CurAge,@address
END
カーソルを閉じる
close curデータ
deallocate curデータ
以上が基本的なカーソルの書き方となります。
ですが、実際はカーソルの途中でエラーになった時のことなどを考え、トランザクションも同時に考えたほうがいいのではないかと思います。
その場合の書き方は以下のようになります。
begin try begin transaction declare @CurName nvarchar(20), @CurAge int, @address nvarchar(20) declare curデータ cursor local for select CustomerName,age,address from customer open curデータ fetch next from curデータ into @CurName,@CurAge,@address while(@@fetch_status = 0) BEGIN -- ここに特定の処理を書く -- 処理が終わったら変数の入れ替え fetch next from curデータ into @CurName,@CurAge,@address END close curデータ deallocate curデータ commit transaction end try begin catch rollback transaction end catch
まとめ
SQLのカーソルはデータを1行ずつ取り出したいときに使うもので、例えばデータを1行ずつ条件かけてInsertする際に使ったりするといいのではないでしょうか。
とは言ってみたものの、大体はカーソル無しで実装できることが多いため、今後どのような場面でカーソルを使うのか分かればここに書いていきたいと思います!
コメント