doodle-on-web

自分で調べたことや、仕事の中で質問されたことなどをまとめています。

SQL実行時に出るエラーを潰していく基本について

スポンサーリンク

配属された新人君にSQLを教えている際に、エラーの潰し方がそもそも伝わっていないのでまとめ。

先輩!なんかこんなエラー出たんですけどー。

SQLServer
エラーコード:156 [Microsoft][ODBC SQL Server Driver][SQL Server]キーワード 'XXX' 付近に不適切な構文があります。
SQLステータス:37000

DB2
SQL実行中に以下のエラーが発生しました。
エラーコード:-104 [IBM][CLI Driver][DB2/SUN64] SQL0104N "XXXX" に続いて予期しないトークン "XX" が見つかりました。予期されたトークンに "XXX" が含まれている可能性があります。 SQLSTATE=42601
SQLステータス:42601

Oracle
SQL実行中に以下のエラーが発生しました。
エラーコード:936 [Oracle][ODBC][Ora]ORA-00936: 式がありません。
SQLステータス:S1000

・・・Oracle・・・式がありませんとは・・・
は、置いておいて、

おっけー、そのエラーね。

それじゃまずは、XXX付近でスペルミスしてないか見てみようか!

1.select が selact になっていたりするパターン

大丈夫そう?

じゃあ、selectに" , " 忘れてたりしない?

2.select に" , " 忘れてたりするパターン

大丈夫そう?

じゃあ、from区のところ、スキーマ名とテーブル名をつなぐところが . じゃなくて_になってない?

3.from区接続ミス問題
これは、Accessからsqlを引っ張ってきた時によくやるパターン

大丈夫そう?

突っ込みをメールでいただいたので、以下に追記してみます。

SQL実行時に出るエラーを潰していく基本について新人にもわかるように説明します。

SQLはデータベースとやりとりするための言語ですが、実行時にエラーが出ることがよくあります。エラーが出たら、どうすればいいのでしょうか?この記事では、SQL実行時に出るエラーを潰していく基本的な方法を、新人にもわかるように説明します。

SQL実行時に出るエラーの種類

SQL実行時に出るエラーは大きく分けて、構文エラーと実行エラーの二種類です。

構文エラーとは、SQLの文法に違反しているために、データベースがSQLを理解できないときに出るエラーです。例えば、カンマやセミコロンが抜けていたり、予約語を間違えていたり、引用符や括弧が対応していなかったりする場合です。構文エラーは、SQLを実行する前にチェックすることができます。SQLを書くときには、エディタやIDEなどのツールを使って、構文エラーを検出して修正しましょう。

実行エラーとは、SQLの文法は正しいけれども、データベースがSQLを実行できないときに出るエラーです。例えば、テーブルやカラムが存在しなかったり、データ型が一致しなかったり、制約に違反したり、アクセス権限がなかったりする場合です。実行エラーは、SQLを実行した後に発生します。SQLを実行するときには、データベースから返されるエラーメッセージを読んで、原因と対処法を探しましょう。

SQL実行時に出るエラーを潰していく基本的な方法は以下の通りです。

1. エラーメッセージを読む
2. エラーの種類を判別する
3. エラーの原因を特定する
4. エラーの対処法を適用する
5. SQLを再実行する

ステップ1: エラーメッセージを読む

まず、エラーメッセージを読みましょう!エラーメッセージは、データベースから返される文字列で、エラーの内容や位置などの情報を含みます。エラーメッセージは英語で書かれていることが多いですが、必要ならば翻訳ツールなどを使って理解しましょう。また、エラーメッセージだけではわからないことがあれば、インターネットで検索したり、ドキュメントやマニュアルを参照したりしましょう。
エラーメッセージを読むときには、以下の3つの要素に注目しましょう。

- エラーコード

エラーコードは、エラーの種類や分類を表す番号です。エラーコードは、データベース管理システム(DBMS)によって異なりますが、一般的には、先頭の数値が大きいほど重大なエラーを示します。例えば、Oracleでは、ORA-00001からORA-00999までが一般的なエラー、ORA-01000からORA-01999までがカーソル関連のエラー、ORA-02000からORA-02999までが制約関連のエラーなどとなっています。エラーコードを調べることで、エラーの原因や対処法のヒントを得ることができます。

- エラーメッセージ

エラーメッセージは、エラーの内容や詳細を表す文字列です。エラーメッセージは、DBMSや言語設定によって異なりますが、一般的には、エラーの概要と具体的な情報が含まれています。例えば、Oracleでは、「ORA-00904: "EMPNO": 無効な識別子」というエラーメッセージが表示された場合、「EMPNO」という識別子(列名や変数名など)が無効であることを示しています。エラーメッセージを読むことで、エラーの発生箇所や修正方法を確認することができます。

- エラー箇所

エラー箇所は、エラーが発生したSQL文の位置を表す情報です。エラー箇所は、DBMSやツールによって異なりますが、一般的には、行番号や列番号などが表示されます。例えば、例えば、「near 'FROM table' at line 1」というメッセージは、1行目のFROM句に問題があることを示します。エラー箇所を確認することで、エラーの発生源や修正範囲を特定することができます。

以上のように、SQLのエラーメッセージを読むときには、エラーコード、エラーメッセージ、エラー箇所の3つの要素に注目しましょう。これらの要素を理解することで、SQL文の実行に失敗したときに迅速かつ正確に問題を解決することができます。

ステップ2: エラーの種類を判別する

次に、エラーコードやエラーメッセージから、エラーの種類を判別しましょう。エラーの種類によって、対処法が異なります。一般的に、SQLのエラーは以下のような分類ができます。

- 構文エラー

構文エラーとは、SQLの文法に従っていないために発生するエラーです。例えば、キーワードのスペルミスや全角文字の混入、セミコロンの忘れなどがあります。構文エラーが発生すると、エラーコードやエラーメッセージが表示されます。エラーメッセージには、間違っている箇所や正しい構文を示すヒントが含まれていることが多いです。構文エラーを解決するには、エラーメッセージをよく読んで、SQLの文法を確認して修正します。

- 実行時エラー

実行時エラーとは、SQLの構文は正しいものの、実行する際にデータベースやテーブルなどのオブジェクトが存在しなかったり、アクセス権限がなかったりするために発生するエラーです。例えば、データベースやテーブルの名前を間違えたり、存在しないカラムを指定したり、重複したレコードを挿入したりなどがあります。実行時エラーが発生すると、エラーコードやエラーメッセージが表示されます。エラーメッセージには、問題が発生したオブジェクトや操作を示す情報が含まれています。実行時エラーを解決するには、エラーメッセージをよく読んで、オブジェクトの存在や状態を確認して修正します。

- 論理エラー

論理エラーとは、SQLの構文も実行も成功するものの、期待した結果と異なるために発生するエラーです。例えば、条件式や結合条件を間違えたり、集計関数や並び替え順序を誤ったりなどがあります。論理エラーが発生すると、エラーコードやエラーメッセージは表示されません。しかし、実行結果が正しいかどうかは自分で確認しなければなりません。論理エラーを解決するには、SQLのロジックをよく理解して、実行結果と期待値を比較して修正します。

ステップ3: エラーの原因を特定する

次に、エラー箇所やエラーメッセージから、エラーの原因を特定しましょう。エラー箇所は、問題が発生したSQLの一部や行番号を示す情報ですが、必ずしも正確ではありません。場合によっては、エラー箇所より前や後ろに原因があることもあります。そのため、以下のような方法で原因を探してみましょう。

SQLを分割して実行する:

SQLが複雑で長い場合は、SQLを部分的に実行してみましょう。これは、エラーが発生した箇所を絞り込むのに役立ちます。例えば、SELECT句、FROM句、WHERE句などを一つずつコメントアウトして、エラーが消えるかどうかを確認します。エラーが消えたら、その部分に問題がある可能性が高いです。また、サブクエリや結合などを単独で実行して、期待した結果が得られるかどうかもチェックします。

SQLの構文やデータ型を確認する:

SQLのエラーの多くは、構文やデータ型のミスによって引き起こされます。例えば、カンマやクォーテーションなどの記号を忘れたり、数値型と文字列型を混同したり、関数の引数や戻り値の型が合わなかったりすると、エラーになります。SQLの構文やデータ型は、使用しているデータベースシステムによって異なる場合があるので、注意が必要です。SQLの構文やデータ型に関するドキュメントやリファレンスを参照して、正しい書き方を確認しましょう。

SQLのパフォーマンスやロックをチェックする:

SQLのエラーの中には、パフォーマンスやロックに関係するものもあります。例えば、テーブルやインデックスの統計情報が古くなっていたり、不適切なインデックスが使われたりすると、SQLの実行計画が最適でなくなり、タイムアウトやリソース不足などのエラーになることがあります。また、同時に多くのユーザーが同じテーブルやレコードにアクセスしようとすると、ロック競合やデッドロックなどのエラーになることもあります。これらの場合は、SQLのパフォーマンスやロック状況をモニタリングツールやコマンドで確認し、必要に応じてインデックスや統計情報の再構築、トランザクションの分割や順序変更などの対策を行いましょう。

4. エラーの対処法を適用する

SQLのエラーの対処法を適用するには、以下のステップに従ってください。

- SQL文の構文やスペルミスがないかをチェックします。

SQL文は厳密なルールに従って記述しなければなりません。例えば、予約語や記号の使い方、カンマやセミコロンの位置、引用符や括弧の対応などに注意してください。構文やスペルミスがあると、SQL文が正しく解釈されずにエラーが発生します。

-存在チェック、定義チェック

次に、SQL文で参照しているテーブルやカラムが存在するか、また定義が正しいかを確認します。テーブルやカラムの名前は大文字と小文字を区別します。また、テーブルやカラムの定義はデータベースのスキーマに従っています。例えば、テーブルの主キーや外部キー、カラムのデータ型や制約などに注意してください。テーブルやカラムが存在しないか、定義が異なると、SQL文が正しく実行されずにエラーが発生します。

- データ型・値のチェック

さらに、SQL文で使用しているデータ型や値が不整合がないかを確認します。データ型は数値型、文字型、日付型などに分類されます。データ型が異なる場合は、暗黙的または明示的に変換する必要があります。例えば、文字型の値を数値型に変換する場合は、CAST関数やTO_NUMBER関数を使用します。データ型や値の不整合があると、SQL文が正しく評価されずにエラーが発生します。

- 権限・接続チェック

最後に、SQL文を実行する際の権限や接続の問題を解決します。SQL文を実行するには、データベースへの接続とテーブルやカラムへのアクセス権限が必要です。接続情報はユーザー名やパスワードなどを含みます。アクセス権限はGRANTやREVOKEなどのコマンドで設定できます。権限や接続の問題があると、SQL文が正しく実行されずにエラーが発生します。

以上のステップを踏むことで、SQLのエラーの対処法を適用することができます。SQLのエラーは多種多様ですが、原因を特定し、適切な方法で修正することで解決できます。

5. SQLを再実行する

最後に、SQL文をテストしてみてください。エラーの原因を特定した後は、修正したSQL文を実行してみてください。エラーが解消されたかどうかを確認するだけでなく、期待通りの結果が得られているかどうかも検証することが大切です。また、SQL文をテストする際は、バックアップやトランザクションなどの安全策を取ることも忘れないでください。


以上が、SQLのエラーの原因を特定する方法です。SQLは強力な言語ですが、それゆえにエラーも起こりやすいです。しかし、エラーメッセージやデータベースの状態を注意深く観察し、修正したSQL文をテストすることで、ほとんどのエラーは解決できるでしょう。