SQL0104N(SQLSTATE 42601)は SQL の構文エラーです。この記事の出力は Db2 12.1.4(Linux)で採りました。
SQL0104N An unexpected token "FORM" was found following "LECT EMPNO,
LASTNAME". Expected tokens may include: "FROM". SQLSTATE=42601
まず見る(結論)
- 1つ目の引用符が読めなかった語。誤りはここか、その直前
- 2つ目の引用符はその語の直前20文字。長い SQL ではこの文字列で位置を探す
END-OF-STATEMENTなら文が途中で終わっている(括弧の閉じ忘れ・末尾のカンマ)Expected tokens may includeは候補の一部しか出さない。直し方の手がかりにしない
症状 → 原因 → 対処(逆引き)
| 症状 | 原因 | 対処 |
|---|---|---|
トークンが ; |
1回の db2 に2文を書いた |
1文ずつ実行するか、ファイルにして -tvf |
| カレントにあるファイル名がトークンに出る | * がシェルに展開された |
SQL を二重引用符で囲む |
bash: syntax error near unexpected token '(' |
count(*) を引用符なしで打った(Db2 に届いていない) |
同上 |
-tvf で2文が1つにつながって表示される |
前の文の ; 抜け |
-v の表示で区切られ方を見る |
CREATE PROCEDURE が BEGIN の直後で失敗し、END でももう1回出る |
本体の ; で文が切れた |
db2 -td@ -vf か、ファイル内で --#SET TERMINATOR @ |
トークンが "3"(SELECT TOP 3) |
SQL Server の書き方 | FETCH FIRST 3 ROWS ONLY |
トークンが "PRIMARY KEY"(AUTO_INCREMENT の後) |
MySQL の書き方 | GENERATED ALWAYS AS IDENTITY |
FETCH FIRST の後に OFFSET を書いて失敗 |
順序が逆 | OFFSET を前に |
トークンが "="、または名前に読めない記号が付く |
全角の記号・全角スペース | 半角に直す |
LIMIT・DROP TABLE IF EXISTS・CREATE TABLE IF NOT EXISTS は 12.1.4 では通ります。列名を ORDER や USER にしても CREATE TABLE は通ったので、予約語を疑うのは後回しで構いません。
エラーにならない構文の誤り
DELETE FROM 表 WHERE のように条件を書き忘れると、SQL0104N にならず全行が削除されます。WHERE が表の相関名として読まれるためです。SELECT ... FROM 表 WHERE も全件を返します。UPDATE ... WHERE は SQL0104N で止まりました。
シェルで条件を組み立てる DELETE は、条件の変数が空でないことを確かめてから実行します。
SQL0104N ではないコード
- 文字列の引用符が閉じていない(
'O'BRIEN'など)…SQL0010N。引用符は'O''BRIEN'と重ねる - バッククォート …
SQL0007N - 文字列を二重引用符で囲んだ …
SQL0206N(SQL0206N の記事)
それでも分からないとき(実機ログつきの詳解)
原因ごとのメッセージの全文、LINE NUMBER の数え方、-tvf でエラー後も後続の文が実行される動き、SQLCA の sqlerrmc の中身は、Zennのフル記事にまとめています。
関連: Db2のSQL0204N / Db2のLIMIT・OFFSET・FETCH FIRST
この記事のような現場のTIPSを、Db2運用の全体像として12章に体系化しました。公式マニュアルには載らない「あのとき知っていれば」を減らすための1冊です。
現場で引ける Db2 の教科書
現場で引ける!Db2実践エンジニア・バイブル
Db2はRDBMS市場でシェア数%。情報が少なく、頼れるのは膨大な公式マニュアルだけ―― そんな現状を変えたくて、「なぜこの値にするのか」「この障害のとき次に何を見るのか」という、マニュアルに載っていない現場の文脈を1冊にまとめました。書いてあることはすべて実際の現場で経験したことです。
アーキテクチャ/構成パラメーター選定/セキュリティ/バックアップ・リカバリ/HADR/pureScale/日常点検の自動化/メモリ・ロック競合/SQLチューニング/RUNSTATS・REORG/MON_GET監視/現場の難題集 ―― 全12章+運用シェルスクリプト集。