Oracleデータベースを扱う中で、開発者や運用担当者が最も遭遇しやすいエラーのひとつが
「ORA-00942: 表またはビューが存在しません」 です。

本記事では、発生原因と具体的な解決策をわかりやすく解説します。
✅ ORA-00942とは?
SQLで参照したテーブルまたはビューが見つからないときに発生するエラーです。
主に DML(SELECT / INSERT / UPDATE / DELETE)実行時に発生します。
✅ 主な発生原因
| 原因 | 説明 |
| テーブル名・ビュー名の誤字 | タイプミス、大小文字の不一致 |
| スキーマ名を指定していない | schema.table が必要なのに table だけ記述 |
| オブジェクトが存在しない | 作成前、削除済み、まだコミットされていない |
| 権限不足 | SELECT権限などが付与されていない |
| PUBLIC SYNONYMが無い/壊れている | シノニム経由アクセス失敗 |
| 参照先データベースリンクが不正 | DBリンク先にオブジェクトが存在しない |
✅ 代表的な発生例と解決策
① テーブル名の誤字
対策
スペルを確認し、USER_TABLES や ALL_TABLES で存在確認。
② スキーマ指定漏れ
本当は他スキーマのテーブル:
対策
必要に応じてスキーマ名を付けて記述。
③ 権限不足
権限が無い場合、テーブルが存在していても参照できません。
✅ 権限付与例(管理者実行)
④ シノニム問題
シノニム経由で参照する場合:
対策
壊れていれば再作成。
⑤ コミット忘れ
セッションAで作成 → セッションBから参照、未コミットの場合
対策
テーブル作成後は COMMIT;
✅ 原因の切り分け手順(チェックリスト)
| チェック項目 | コマンド / 方法 |
| テーブルが存在するか | SELECT table_name FROM user_tables; |
| 他スキーマか | SELECT owner, table_name FROM all_tables; |
| 権限があるか | SELECT * FROM user_tab_privs; |
| シノニム確認 | SELECT * FROM all_synonyms; |
| 大文字小文字 | SQL識別子は大文字扱い、""付きは注意 |
✅ よくある落とし穴
✅ まとめ
| 要点 | 内容 |
| エラー原因 | オブジェクトなし・スキーマ指定漏れ・権限不足 |
| 解決方法 | テーブル存在確認、権限確認、スキーマ明記 |
| コツ | user_tables / all_tables で確認 |
Oracleはスキーマ管理と権限管理が厳密なため、
「テーブルが本当に存在するか」「アクセス権があるか」 が重要です。
✅ 例:実務での対応テンプレ
■ 発生時に実施する確認
-
SQLを確認(スペル・スキーマ)
-
ALL_TABLESで存在確認
-
権限を確認
-
必要に応じて GRANT 実施
この手順を覚えておけば、ほぼ解決できます。
💬 最後に
Oracleの権限周りは慣れるまで少し難しいですが、
このエラーは落ち着いて確認すれば必ず解決できます。
記事が役に立ったら、ぜひシェアやブックマークをお願いします!
OracleデータベースでSQLを実行した際に、
「ORA-00933: SQLコマンドが正しく終了していません」
というエラーが出た経験はありませんか?
このエラーは、SQL文の構文がOracleの文法に合っていない場合に発生します。
この記事では、原因別の対処法と実際の修正例をまとめて解説します。

🔍 エラーメッセージの意味
このエラーは、SQL文の構文(文法)違反があるときに出力されます。
Oracleは他のDBMS(MySQL、PostgreSQLなど)よりも文法が厳密で、
小さな違いでもエラーになります。
💡 主な発生原因と対処法
| 原因分類 | 内容 | 修正例 |
| ① 不正な句の並び順 | 句の順序(WHERE → GROUP BY → HAVING → ORDER BY)が誤っている | ✅ SELECT deptno, COUNT(*) FROM emp WHERE sal > 2000 GROUP BY deptno ORDER BY deptno; |
| ② ORDER BYの位置が不適切 | UNIONやINSERT ... SELECT内でORDER BYを誤って記述 | ✅ (SELECT ... FROM ... UNION SELECT ... FROM ...) ORDER BY column; |
| ③ セミコロンやカンマの余計な入力 | SQLの途中に「;」や「,」が誤って入っている | ✅ 不要なセミコロンやカンマを削除 |
| ④ MySQL構文の使用 | LIMIT, AUTO_INCREMENT, !=などOracle非対応の構文を使用 | ✅ LIMIT → FETCH FIRST n ROWS ONLY に置換 |
| ⑤ UPDATE文の書式誤り | UPDATE ... SET ... WHERE ...の句構成が不正 | ✅ UPDATE emp SET sal = 3000 WHERE deptno = 10; |
| ⑥ サブクエリに括弧が足りない | サブクエリ全体を括弧で囲っていない | ✅ WHERE deptno IN (SELECT deptno FROM dept WHERE loc='TOKYO') |
⚙️ よくあるパターン別の修正例
❌ 間違った例(MySQL構文)
✅ Oracleでの正しい書き方
❌ 間違った例(ORDER BY位置の誤り)
✅ 正しい書き方
🧩 エラー発生箇所の特定ポイント
-
SQL DeveloperやSQL*Plusで文を一文ずつ実行
-
FROM句やORDER BY句をコメントアウトして構文を切り分ける
-
整形ツール(SQL Formatter)を使って句順序を確認
🧠 参考:他DBとの構文違い
| 構文要素 | MySQL | Oracle |
| 件数制限 | LIMIT 10 | FETCH FIRST 10 ROWS ONLY |
| 比較演算子 | != | <> |
| AUTO_INCREMENT | AUTO_INCREMENT | CREATE SEQUENCE+NEXTVAL |
| 文字列連結 | CONCAT(a,b) | `a |
✅ 再発防止のポイント
| 観点 | 対策内容 |
| SQL整形 | SQL Developerのフォーマッタを活用して句の順序を自動整形 |
| DBMS差異の意識 | MySQLなどの構文を流用しない |
| コードレビュー | ORDER BY、GROUP BYの順序・構文チェックを実施 |
| 静的解析 | SQL構文チェッカーや単体テストで事前検出 |
📝 まとめ
-
ORA-00933は「文法上の誤り」で発生する構文エラー
-
ORDER BYの位置やLIMIT句の使用が典型的な原因
-
OracleではFETCH FIRST句や句の正しい順序を意識すれば解消できる
💬 ワンポイント
他のDBMSからSQLを移植した際に発生しやすいため、
実行前に構文チェックツールを活用するのがおすすめです。
「駑馬十駕」を信念に IT系情報を中心に調べた事をコツコツ綴っています。