Oracleデータベースでアプリケーション開発をしていると、時々遭遇するエラーが ORA-01403: no data found です。
特にPL/SQLやSELECT INTO構文を使った処理でよく発生します。
この記事では、
-
ORA-01403が発生する状況
-
よくある原因
-
実務レベルでの修正方法
-
回避設計のポイント
をわかりやすく整理します。
ORA-01403とは?
ORA-01403は、実行したSELECT文に対して対象データが1件も存在しなかったときに発生するエラーです。
特に以下のケースで発生します👇
この構文は「必ず1件はレコードある前提」です。
そのため0件の場合にOracle側が例外を投げます。
実際のエラー例
対象となるid = 999が存在しない場合、次の例外が発生します。
ORA-01403が発生する典型原因
| 原因 | 詳細 |
|---|---|
| WHERE条件が厳しすぎる | PK/NOT NULL条件で絞りすぎて0件になっている |
| 想定外のデータ削除 | 参照テーブルのデータが削除されている |
| SELECT INTO構文の誤使用 | 1件のみを期待しているが実際は0件 |
| マスタ未登録 | 初期データ投入漏れ、移行漏れ |
| ライフサイクルの差異 | 本番環境とTEST/DEV環境でデータ差異がある |
解決方法①:EXCEPTION(例外処理)で吸収する
「データが無いことを許容する仕様」であれば例外処理するのが一般的です。
解決方法②:COUNT(*)やEXISTSで事前チェック
データがあるか事前に確認する安全設計。
解決方法③:NVL/COALESCE + OUTER JOINで吸収する(SQL単体対応)
PL/SQLではなく普通のSQLで処理する場合の回避例。
解決方法④:FETCH FIRST 1 ROW ONLYを使う(複数行対策にも◎)
もし複数件返る設計になり得るなら、こちら推奨。
実務での推奨対応フロー
-
本来データが存在する仕様かを確認
-
SELECT条件が正しいか確認
-
テーブル・マスタ不足の場合はデータ整備
-
それでも0件あり得る場合は例外処理 or EXISTS分岐
よくある追加トラブル|ORA-01403+ORA-01422
これはデータが多すぎる時のエラーです。
つまり
-
ORA-01403 → データが無い -
ORA-01422 → データが複数件ある
👉 SELECT INTOは「1件のみ存在する前提」であることを覚えておきましょう。
まとめ
| 状況 | エラー | 対策 |
|---|---|---|
| データが0件 | ORA-01403 | 例外処理、事前チェック、OUTER JOIN |
| データが複数件 | ORA-01422 | FETCH FIRST、条件整理 |
✔ポイント
-
SELECT INTOは非常に便利だが1件前提のリスクあり -
PL/SQL設計時は例外処理と事前確認が必須
-
テーブル初期データの登録漏れ・WHERE条件誤りが最も多い原因

