DB2 5 min read

Db2の「An unexpected token」 ― SQL0104Nがセミコロン・シェル・他DBの構文で出るときの逆引き

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のフル記事にまとめています。

▶ Zennで続きを読む(無料)

Db2のSQL0104Nの読み方 ― 直前20文字とExpected tokens、WHEREだけの DELETE で全件消える


実機ログつきの詳解を読む →

関連: Db2のSQL0204N / Db2のLIMIT・OFFSET・FETCH FIRST

この記事で解決しなかったときは

Db2 の技術的な質問を無料で受け付けています。エラーメッセージの全文と Db2 のバージョンを添えて送ってください。回答はメールで返します。

Db2 の相談を送る →

この記事のような現場のTIPSを、Db2運用の全体像として12章に体系化しました。公式マニュアルには載らない「あのとき知っていれば」を減らすための1冊です。

現場で引ける Db2 の教科書

現場で引ける!Db2実践エンジニア・バイブル

Db2はRDBMS市場でシェア数%。情報が少なく、頼れるのは膨大な公式マニュアルだけ―― そんな現状を変えたくて、「なぜこの値にするのか」「この障害のとき次に何を見るのか」という、マニュアルに載っていない現場の文脈を1冊にまとめました。書いてあることはすべて実際の現場で経験したことです。

アーキテクチャ/構成パラメーター選定/セキュリティ/バックアップ・リカバリ/HADR/pureScale/日常点検の自動化/メモリ・ロック競合/SQLチューニング/RUNSTATS・REORG/MON_GET監視/現場の難題集 ―― 全12章+運用シェルスクリプト集。

Zennで読む →