「駑馬十駕」を信念に IT系情報を中心に調べた事をコツコツ綴っています。

Oracleデータベースでアプリケーション開発をしていると、時々遭遇するエラーが ORA-01403: no data found です。
特にPL/SQLSELECT INTO構文を使った処理でよく発生します。

この記事では、

  • ORA-01403が発生する状況

  • よくある原因

  • 実務レベルでの修正方法

  • 回避設計のポイント

をわかりやすく整理します。

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を使う(複数行対策にも◎)

もし複数件返る設計になり得るなら、こちら推奨。


実務での推奨対応フロー

  1. 本来データが存在する仕様かを確認

  2. SELECT条件が正しいか確認

  3. テーブル・マスタ不足の場合はデータ整備

  4. それでも0件あり得る場合は例外処理 or EXISTS分岐


よくある追加トラブル|ORA-01403+ORA-01422

これはデータが多すぎる時のエラーです。
つまり

  • ORA-01403 → データが無い

  • ORA-01422 → データが複数件ある

👉 SELECT INTOは「1件のみ存在する前提」であることを覚えておきましょう。


まとめ

状況エラー対策
データが0件ORA-01403例外処理、事前チェック、OUTER JOIN
データが複数件ORA-01422FETCH FIRST、条件整理

✔ポイント

  • SELECT INTOは非常に便利だが1件前提のリスクあり

  • PL/SQL設計時は例外処理と事前確認が必須

  • テーブル初期データの登録漏れ・WHERE条件誤りが最も多い原因

Ads by Google