ストアドプロシージャ
ストアドプロシージャはまぁ、いつか必要になる。
でも、ストアドプロシージャの紹介方法は問題ありすぎる気がするんだよなぁ。
例えばこの記事とか。
以下主に愚痴。
ストアドプロシージャ教えるならIF文は必須だよね。でも、SQLで出来ることをわざわざストアドプロシージャ使ってそれを紹介する神経が分からない。
こんな教え方をするから、ちょっと複雑*1なSQL書くと「わかりにくい」やら「効率悪い」やら、意味不明なこと言い出す輩が出てくるんだよ。
例えばSQLのことをよく知らない人が書きがちな以下のコード。
UPDATE SomeTable SET hoge = NULL WHERE piyo = 'D' ; UPDATE SomeTable SET hoge = 3 WHERE piyo = 'U' ;
T-SQLをかじってしまったら、カーソル使ってDかUかをIF文とかで分岐させて、UPDATEは一つにまとめてしまうような人も出てくる。
declare cur cursor for SELECT id, piyo FROM SomeTable WHERE piyo IN('D', 'U') open cur declare @val as int declare @id as int declare @piyo as char(1) fetch next from cur into @id, @piyo while @@fetch_status = 0 begin case @piyo when 'D' then set @val = NULL when 'U' then set @val = 3 end case UPDATE SomeTable SET hoge = @val WHERE id = @id; fetch next from cur into @id, @piyo end close cur deallocate cur
でも、そうじゃないだろ、こうだろ。
UPDATE SomeTable SET hoge = CASE piyo WHEN 'D' THEN NULL WHEN 'U' THEN 3 ELSE piyo -- 保険 END WHERE piyo IN('D', 'U') ;
この程度がわかりにくいとかいったい何なのさ。
カーソル使って無駄に行数稼いでる方がわかりにくいって。
しかも、最初のSQL文2つの場合より効率悪いということに全然気づかない。
カーソル使ってDかUか判断するって事は、piyoがDとUになっているデータに対して一つ一つUPDATE文を実行することになる。
カーソル使った時点で負け、くらいに思っておいても間違いじゃないと思う。
あと、SQLのイディオムとか、標準関数とか、そういうのを知らなさすぎる奴が多い。
例えばCOALESCE関数とか、IS NULL述語とか*2。そういうレベルで知らないのに、「SQL出来ます」なんてよく言えるよ本当。
その2択だったら間違いなく「できない方」だろ。