#はじめに
今回はSQLクエリでエラーが起きた、またはプログラムに組み込んだSQLでエラーが発生した場合の調査のコツを自分なりに書いていこうと思います。殆ど自分用のメモみたいなものです。
#自己紹介
過去の記事でも書いてますが、社内SEをやっています。
ただ最近はプログラムだけじゃなく、RPA、PM業、法改正対応などもやってるので、また何でも屋に戻った感じです。
#SQLエラーは何で意外と苦戦する?
SQLは短いプログラムです。でも複雑な結合とかで長文になると、エラーが起きた時に原因が非常に分かり辛いのもSQLです。
普通のプログラムより、SQLクエリエラーの方が対処が苦手って人もいるんじゃないかな?
##1行で構成されている
SQLは見やすいように改行しても、実態は1行の処理です。
そのため、他のプログラムと違ってステップを出してくれない!
ここがエラーを探しにくい原因でしょう。
##エラーコードが多い
とにかくエラーコードが多い!
にも関わらず、Oracle、DB2、MySQL、PostgreSQLと種類多い、構文違う、エラーコードも違う…
対処し辛いですよ(統一してくんねぇかなぁ、割りと真面目に)
#エラー原因の探し方
とまぁ、自分なりの原因を並べたところで、次は自分なりの探し方を書いていきます。
##FROMから見る!
SQLを習う時は、大抵SELECT句から習うことが多いと思います。個人的には既にこれが罠だと思います。
プログラムは基本的に上から下に流れていくものだから学習としては正しいんですが…SQLは別にSELECTから読み込まれるわけじゃないんですよね。
###SQLの実行順序
色々端折りますが、色々な関数を除いた基本構文だけの場合、
- FROM(ターゲット)
- WHERE(条件)
- SELECT(結果)
の順番に実施されます。
実際はJOINやORDER BYも絡むともっと順番が複雑化するんですが、SQLの基本のキだけピックアップするとこんな感じ。(もっと詳細な順序を知りたい人は調べてみましょう!)
上の通りSELECTは結果、だから順番的には最後。そして、SQLエラーは実行順序の順にエラーが出力される。
なので、エラーが起きたから必死に上から調査!ってやると、時間だけかかっちゃう。
でも、プログラム組んだことある人は習性で上から調査する…
時間かかる…
罠か何か?
##構文エラーは怖くない!
構文エラーも意外とクセモノ。1文で構成されているのでピンポイントでここがおかしいって出してくれないので分かり辛いです。(曖昧には出してくれる)
エラーに出力されたクエリの一部を使って、作成したクエリに検索をかけるとおかしい部分だけは分かるので、その場所をターゲットに自分流の決め打ち的な調査法をポイント毎に書いていきます!
※関数間違いでのエラーは書いてません、そこは正しい使い方を調べよう!
###FROMで発生した場合
- テーブルが存在していない
- スキーマが違う
- JOIN内に書いた別名間違い(個人的に一番多い)
###WHEREで発生した場合
- FROMで指定した別名orテーブル名違い(真面目にこれくらいしかWHEREでは起きない)
###SELECTで発生した場合
- FROMで指定した別名orテーブル名違い(FROMでサブクエリ使った場合とかに多い)
- カンマ抜けてる(よくやらかす、むしろ個人的には一番頻度多い…)
###SyntaxError 〜 "'"の場合
- プログラムで設定した変数に「'(シングルクォーテーション)」が紛れてる(プログラム内にSQLクエリを組み込んでるとよくある)
###SyntaxError 〜 ","の場合
- プログラムで設定した変数が空(ブランク)になってる(UPDATEやINSERTでよくある、特に文字列だけど数値型に書き込む場合)
#最後に
最近、意外とSQLエラーって解決するの苦手な人って多いなぁと思って、簡単にですが自分がやらかしやすいSQLエラーの原因と対処法を書いてみました。
SQLエラーの対処が苦手な人が多少は参考にしてくれると嬉しい限りです。
さて最近UiPathをいじったので、次回はそっちの話を書こうかな。