読者です 読者をやめる 読者になる 読者になる

ストアドプロシージャ

SQL

ストアドプロシージャはまぁ、いつか必要になる。
でも、ストアドプロシージャの紹介方法は問題ありすぎる気がするんだよなぁ。
例えばこの記事とか。
以下主に愚痴。


ストアドプロシージャ教えるならIF文は必須だよね。でも、SQLで出来ることをわざわざストアドプロシージャ使ってそれを紹介する神経が分からない。
こんな教え方をするから、ちょっと複雑*1SQL書くと「わかりにくい」やら「効率悪い」やら、意味不明なこと言い出す輩が出てくるんだよ。


例えば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択だったら間違いなく「できない方」だろ。

*1:に見える

*2:これらは知らないけどISNULL関数は知っていたり。だからそれはSQL標準じゃないんだってば。しかも関数名微妙だし