ORA エラーは、Oracle Database が返すエラーで、ORA- の後ろの5桁の番号で種類が決まります。 番号ごとの原因(Cause)と対処(Action)は、Oracle の公式のエラーヘルプ https://docs.oracle.com/en/error-help/db/ora-番号/ で調べられます。よく出るものを先にまとめます。

番号 メッセージ(要約) まず疑うこと
ORA-00001 一意制約に違反 主キー・UNIQUE の値が重複
ORA-00904 無効な識別子 列名の打ち間違い・引用符付きの大文字小文字
ORA-00942 表またはビューが存在しない 表名・スキーマ名・権限
ORA-00933 SQL の終わり方が不正 / 予期しないキーワード 表の別名の AS・LIMIT・文字列の引用符
ORA-01017 認証情報が無効 ユーザー名・パスワード・接続先
ORA-01400 NULL は挿入できない NOT NULL の列。空文字 '' も NULL
ORA-01722 数値への変換ができない 文字の列と数値の比較
ORA-12154 接続先の名前を解決できない tnsnames.ora・接続文字列
ORA-12899 列に対して値が大きすぎる VARCHAR2 のバイト数(日本語は1文字3バイト)
ORA-06512 (PL/SQL のどこで起きたか) その上に出ている別の ORA エラーが本当の原因

確認環境:ORA エラーのメッセージ・原因・対処は、Oracle Database のエラーヘルプ(26ai・21c・19c 共通のページ、2026年7月19日更新)の原文で確かめました。再現 SQL と直し方は、エラーヘルプの原因・対処に沿った例です。MySQL・PostgreSQL の対応するエラーは、MySQL 8.0.46・PostgreSQL 16.15(Ubuntu 24.04)で同じ操作を実際に行い、出たエラー文を載せています(確認日 2026年10月13日)。

本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。

(記載例)出典:株式会社RJC「ORAエラー一覧|よく出るエラーの原因と直し方の早見表」

エラーの読み方と調べ方

1行目が本当の原因

ORA-01403: no data found
ORA-06512: at "APP.GET_NAME", line 5
ORA-06512: at line 1

複数の ORA エラーが並んだら、いちばん上が原因で、ORA-06512 は「どこで起きたか」の情報です。 この例は「APP.GET_NAME の5行目で ORA-01403(データが見つからない)が起きた」という意味です。エラーヘルプでも、ORA-06512 は「エラースタックのほかの例外を見て原因を調べる」とされています。

メッセージの形は版で変わった

エラーヘルプの各ページには、同じ番号に「新しい形式」と「以前の形式」の文面が並んでいます。 新しい形式は、表名・列名・値などの手がかりが入るようになっています。

番号 新しい形式(エラーヘルプの1つ目) 以前の形式
ORA-00001 unique constraint (schema.name) violated on table schema.table columns (columns) unique constraint (string.string) violated
ORA-00054 Failed to acquire a lock (Type: ..., Name: ..., Description: ...) because it is currently held by another session. ... resource busy and acquire with NOWAIT specified or timeout expired
ORA-00904 identifier: invalid identifier string: invalid identifier
ORA-00911 character_value: invalid character after token_value invalid character
ORA-00918 column_name: column ambiguously specified - appears in table_name_1 and table_name_2 column ambiguously defined
ORA-00932 expression failed_expression is of data type type, which is incompatible with expected data type type inconsistent datatypes: expected string got string
ORA-00933 unexpected keyword at or near keyword_value SQL command not properly ended
ORA-00942 table or view object_name does not exist table or view does not exist
ORA-00979 expression: must appear in the GROUP BY clause or be used in an aggregate function not a GROUP BY expression
ORA-01017 invalid credential or not authorized; logon denied invalid username/password; logon denied
ORA-01438 value value greater than specified precision precision_scale for column column value larger than specified precision allowed for this column
ORA-01722 unable to convert string value containing invalid_char to a number: column_or_expression invalid number
ORA-12154 Cannot connect to database. Cannot find alias alias_value in repository_loc. TNS:could not resolve the connect identifier specified
ORA-12514 Cannot connect to database. Service service_name is not registered with the listener at host_port. TNS:listener does not currently know of service requested in connect descriptor
ORA-12541 Cannot connect. No listener at host_port. TNS:no listener

検索するときは、番号(ORA-00942)で探すと、どちらの形式でも同じページにたどり着きます。 23ai の SQL*Plus では、エラーの下に Help: https://docs.oracle.com/error-help/db/ora-00942/ のようにエラーヘルプへのリンクが表示されます(SET ERRORDETAILS で切り替え。oracle-base の記事より)。

もっと詳しく出す

方法 使いどころ
ALTER SESSION SET ERROR_MESSAGE_DETAILS = ON; ORA-00001・ORA-01722 などで、違反した値の詳細を出す(エラーヘルプでは既定で ON)
oerr ora 942(サーバーのシェル) ORACLE_HOME のあるサーバーで、番号から原因と対処を表示
DBMS_UTILITY.FORMAT_ERROR_BACKTRACE PL/SQL の例外処理の中で、元のエラーの行番号を取る
SET ERRORDETAILS VERBOSE(SQL*Plus 23ai) エラーの下に原因と対処も表示

ORA-01722 では、ERROR_MESSAGE_DETAILS=ON にすると ORA-03302: (ORA-01722 details) invalid string value: SMITH のように、変換できなかった文字列そのものが2行目に出ると、エラーヘルプに書かれています。

分類別の早見表

SQL の文法

番号 メッセージ(以前の形式) 主な原因
ORA-00900 invalid SQL statement SQL として認識できない文
ORA-00907 missing right parenthesis かっこの閉じ忘れ、かっこの中の余計な語
ORA-00911 invalid character 使えない文字。プログラムから送る SQL の末尾の ;
ORA-00923 FROM keyword not found where expected 列の区切りのカンマ忘れ・別名の書き方
ORA-00933 SQL command not properly ended 表の別名に AS、LIMIT(行数の制限は FETCH FIRST)、文末の余計な句
ORA-00936 missing expression SELECT FROM、カンマの後ろが空、予約語の誤用

名前・オブジェクト

番号 メッセージ 主な原因
ORA-00904 invalid identifier 列名の誤り、"Name" のような引用符付きの名前、予約語
ORA-00918 column ambiguously defined JOIN で両方の表にある列を、表名なしで書いた
ORA-00942 table or view does not exist 表名の誤り、別スキーマ、SELECT 権限が無い
ORA-04043 object does not exist DESC などで指定したオブジェクトが無い

制約

番号 メッセージ 主な原因
ORA-00001 unique constraint violated 主キー・UNIQUE の重複、シーケンスの値が既存より小さい
ORA-01400 cannot insert NULL into (...) NOT NULL の列に NULL。''(空文字)も NULL
ORA-02291 integrity constraint violated - parent key not found 存在しない親を指す外部キー
ORA-02292 integrity constraint violated - child record found 子の行がある親を削除
ORA-02290 check constraint violated CHECK 制約に合わない値

データ型・値

番号 メッセージ 主な原因
ORA-01438 value larger than specified precision allowed for this column NUMBER(p,s) の桁を超えた
ORA-01476 divisor is equal to zero 0 で割った
ORA-01722 invalid number 数字でない文字列を数値に変換(暗黙の変換を含む)
ORA-01830 date format picture ends before converting entire input string 文字列が書式より長い(時刻つきの文字列を日付だけの書式で)
ORA-01843 not a valid month 月が 1〜12 でない、MON に合わない月名
ORA-01861 literal does not match format string 文字列と書式の形が合わない
ORA-00932 inconsistent datatypes DATE と数値の比較、CLOB の比較など型が合わない
ORA-12899 value too large for column (actual: n, maximum: m) 文字列が列の長さを超えた(バイトで数えている)

PL/SQL

番号 メッセージ 主な原因
ORA-01403 no data found SELECT INTO で0行
ORA-01422 exact fetch returns more than requested number of rows SELECT INTO で2行以上
ORA-06502 PL/SQL: numeric or value error 変数の長さ・桁を超えた、NOT NULL の変数に NULL
ORA-06512 at line n 上のエラーが起きた場所(原因ではない)
ORA-06550 line n, column m PL/SQL のコンパイルエラー(続くメッセージが本体)
ORA-01427 single-row subquery returns more than one row = (SELECT ...) のサブクエリが2行以上

集計

番号 メッセージ 主な原因
ORA-00979 not a GROUP BY expression GROUP BY に無い列を SELECT・ORDER BY に書いた
ORA-00937 not a single-group group function GROUP BY なしで、集計関数と普通の列を並べた
ORA-00934 group function is not allowed here WHERE・GROUP BY に集計関数(集計の条件は HAVING に書く)

ログイン・権限

番号 メッセージ 主な原因
ORA-01017 invalid username/password; logon denied ユーザー名・パスワードの誤り、別の DB(PDB)に接続
ORA-28000 The account is locked ログインの失敗回数の上限、管理者がロック
ORA-28001 the password has expired パスワードの有効期限(PASSWORD_LIFE_TIME)
ORA-01031 insufficient privileges 必要な権限(システム権限・オブジェクト権限)が無い
ORA-01045 user lacks CREATE SESSION privilege; logon denied ログインの権限が無い

接続(Oracle Net・リスナー)

番号 メッセージ(以前の形式) 主な原因
ORA-12154 TNS:could not resolve the connect identifier specified tnsnames.ora に別名が無い、ファイルの場所(TNS_ADMIN)・書き間違い
ORA-12514 TNS:listener does not currently know of service requested in connect descriptor サービス名の誤り、DB・PDB が起動していない、登録前
ORA-12541 TNS:no listener リスナーが動いていない、ホスト名・ポートの誤り
ORA-12170 TNS:Connect timeout occurred ファイアウォール・経路

ロック・トランザクション

番号 メッセージ 主な原因
ORA-00054 resource busy and acquire with NOWAIT specified or timeout expired 別のセッションがロック中の表に DDL・NOWAIT
ORA-00060 deadlock detected while waiting for resource 2つのトランザクションが互いのロックを待った
ORA-01555 snapshot too old 長い問い合わせの間に、必要な UNDO が上書きされた
ORA-08177 can't serialize access for this transaction SERIALIZABLE で同じ行を更新した

領域・メモリ

番号 メッセージ(以前の形式) 主な原因
ORA-01653 unable to extend table ... in tablespace ... 表領域がいっぱい
ORA-01652 unable to extend temp segment by ... in tablespace ... 一時表領域(大きなソート・ハッシュ結合)
ORA-01654 unable to extend index ... 索引の表領域がいっぱい
ORA-04031 unable to allocate n bytes of shared memory 共有プール・ラージプールの不足

主なエラーの再現 SQL と直し方

ここからの SQL は、次の表を例にしています(Oracle の書き方)。

CREATE TABLE depts (
  id   NUMBER PRIMARY KEY,
  name VARCHAR2(20) NOT NULL
);
CREATE TABLE emps (
  id      NUMBER PRIMARY KEY,
  name    VARCHAR2(10) NOT NULL,
  email   VARCHAR2(50) UNIQUE,
  salary  NUMBER(5,2),
  dept_id NUMBER REFERENCES depts(id),
  hired   DATE
);

ORA-00001:一意制約に違反

INSERT INTO emps (id, name, email) VALUES (9, 'Dup', 'sato@example.com');   -- 既にあるメール

どの制約に違反したかは、メッセージの (スキーマ.制約名) で分かります。 制約名から列を調べる SQL は、エラーヘルプに載っています。

SELECT column_name, table_name
FROM   all_cons_columns
WHERE  owner = 'APP'
AND    constraint_name = 'SYS_C0012345';
直し方 SQL の例
あれば更新、無ければ追加 MERGE INTO emps e USING (SELECT ... FROM dual) s ON (e.email = s.email) WHEN MATCHED THEN UPDATE ... WHEN NOT MATCHED THEN INSERT ...
主キーをシーケンスで採番していて重複 シーケンスの値が既存の最大値より小さくないか確かめる(SELECT MAX(id) FROM emps と比べる)
重複を無視して続ける INSERT /*+ IGNORE_ROW_ON_DUPKEY_INDEX(emps(email)) */ ...

UPSERT の書き方の DB ごとの違いは、関連記事「SQL UPSERTの書き方|PostgreSQL・MySQL・MERGE構文比較表」で扱っています。

ORA-00904:無効な識別子

SELECT nme FROM emps;                         -- 列名の打ち間違い

CREATE TABLE t1 ("Name" VARCHAR2(10));        -- 引用符付きで作った
SELECT name FROM t1;                          -- → ORA-00904(NAME という列は無い)
SELECT "Name" FROM t1;                        -- 引用符と大文字小文字を合わせると通る

Oracle は、引用符なしの名前を大文字にして扱います。 引用符付きで "Name" と作った列は、いつも "Name" と書く必要があります。エラーヘルプでは、識別子は英字で始まり、128文字以内、英数字と $・_・# だけ(それ以外は二重引用符で囲む)とされています。ツールが小文字の名前を引用符付きで作っていないかを、SELECT column_name FROM user_tab_columns WHERE table_name = 'T1'; で確かめます。

ORA-00933:SQL の終わり方・予期しないキーワード

SELECT e.name FROM emps AS e;                        -- 表の別名に AS は使えない
SELECT name FROM emps WHERE name = 'O'Brien';        -- 文字列の中の ' で文字列が終わる
SELECT name FROM emps ORDER BY id LIMIT 10;          -- 19c などでは LIMIT は使えない
直し方 SQL
表の別名は AS なし SELECT e.name FROM emps e;
文字列の中の ' は2つ重ねる WHERE name = 'O''Brien'
件数の制限 ORDER BY id FETCH FIRST 10 ROWS ONLY(12c 以降)

エラーヘルプの新しい形式では「unexpected keyword at or near keyword_value」となり、原因として「文字列の中のアポストロフィで文字列が早く終わり、残りがキーワードとして解釈された」ことが挙げられ、対処として「アポストロフィは単一引用符を2つ重ねる」と書かれています。

ORA-00911:無効な文字

プログラム(JDBC など)から送る SQL の末尾に ; を付けると、よく出ます。 ; は SQL*Plus などのツールが「文の終わり」として使う記号で、SQL そのものの一部ではありません。

stmt.executeQuery("SELECT * FROM emps;");   // ORA-00911 の原因になる
stmt.executeQuery("SELECT * FROM emps");    // 末尾の ; を消す

ORA-00942:表またはビューが存在しない

原因 確かめ方 直し方
表名の打ち間違い SELECT table_name FROM all_tables WHERE table_name LIKE 'EMP%'; 正しい名前にする
別のスキーマの表 SELECT owner, table_name FROM all_tables WHERE table_name = 'EMPS'; app.emps と書く、シノニムを作る
権限が無い all_tables に出ない GRANT SELECT ON app.emps TO 自分;(所有者・管理者が実行)
引用符付きの小文字で作られた SELECT table_name FROM user_tables; で小文字が出る "emps" と書く

権限が無い表も、「存在しない」と同じ ORA-00942 になります。 エラーヘルプでも、原因に「表へのアクセスに権限が要る場合がある」と書かれています。新しい形式では、table or view "APP"."EMPS" does not exist のようにスキーマ名まで出ます。

ORA-01400:NULL は挿入できない(空文字の罠)

INSERT INTO emps (id, name) VALUES (10, NULL);   -- ORA-01400
INSERT INTO emps (id, name) VALUES (11, '');     -- これも ORA-01400

Oracle では、長さ0の文字列 '' は NULL として扱われます。 MySQL・PostgreSQL から移ってきたコードで「空文字を入れているのに NULL のエラーになる」ときは、これが原因です。空文字を許したいなら列を NULL 可にするか、' ' などの値を決めます。NULL の扱いの違いは、関連記事「SQLのNULLの扱い|COALESCE・NULLIFと落とし穴12選」で扱っています。

ORA-01722:数値に変換できない

SELECT TO_NUMBER('12a') FROM dual;                -- 数字でない文字
SELECT * FROM items WHERE code = 123;             -- code が VARCHAR2 で、'A-01' のような行がある

2つ目は、文字の列を数値と比べたため、Oracle が列の値を数値に変換しようとして失敗しています。 エラーになるかどうかは、どの行を読んだかで変わるので、「条件を変えたら急に出た」ということが起こります。

直し方 SQL
文字列として比べる WHERE code = '123'
変換できないものを NULL にする(12.2 以降) TO_NUMBER(code DEFAULT NULL ON CONVERSION ERROR)
変換できるかを調べる(12.2 以降) WHERE VALIDATE_CONVERSION(code AS NUMBER) = 0 で変換できない行を探す

ORA-01830・ORA-01843・ORA-01861:日付の書式

SELECT TO_DATE('2026-10-13 09:30:00', 'YYYY-MM-DD') FROM dual;   -- ORA-01830:文字列が書式より長い
SELECT TO_DATE('2026-13-01', 'YYYY-MM-DD') FROM dual;            -- ORA-01843:13月は無い

書式('YYYY-MM-DD')を省略すると、セッションの NLS_DATE_FORMAT に頼った変換になります。 開発 PC とサーバー、ツールとアプリで NLS_DATE_FORMAT が違うと、同じ SQL が片方でだけ ORA-01861 などになります。

直し方 SQL
書式をいつも書く TO_DATE('2026-10-13 09:30:00', 'YYYY-MM-DD HH24:MI:SS')
日付のリテラル DATE '2026-10-13'、TIMESTAMP '2026-10-13 09:30:00'
文字の列と比べない WHERE hired = DATE '2026-04-01'(WHERE hired = '2026-04-01' に頼らない)

日付の書式の一覧は、関連記事「SQL 日付関数 一覧|4DB比較表とコピペSQL・実行結果つき」で扱っています。

ORA-12899:列に対して値が大きすぎる(日本語のバイト数)

CREATE TABLE notes (title VARCHAR2(10));        -- 既定はバイトで数える
INSERT INTO notes VALUES ('あいうえお');         -- AL32UTF8 では15バイト → ORA-12899

VARCHAR2(10) は、既定(NLS_LENGTH_SEMANTICS が BYTE)では「10バイト」です。 データベースの文字セットが AL32UTF8 だと、ひらがな・漢字は1文字3バイトなので、5文字で15バイトになります。エラーヘルプにも、長さは文字の長さのセマンティクスなら文字数、そうでなければバイト数で表示されるとあります。

ALTER TABLE notes MODIFY (title VARCHAR2(10 CHAR));   -- 10文字にする

ORA-01403・ORA-01422:SELECT INTO が0行・2行以上

DECLARE
  v_name emps.name%TYPE;
BEGIN
  SELECT name INTO v_name FROM emps WHERE id = 999;        -- 0行 → ORA-01403
EXCEPTION
  WHEN NO_DATA_FOUND THEN
    v_name := NULL;                                          -- 無いときの扱いを決める
  WHEN TOO_MANY_ROWS THEN                                    -- 2行以上 → ORA-01422
    RAISE_APPLICATION_ERROR(-20001, 'emps.id が重複しています');
END;
/

SELECT INTO は「ちょうど1行」を前提にしています。 0行なら NO_DATA_FOUND、2行以上なら TOO_MANY_ROWS の例外になります。エラーヘルプでは、2行以上を扱うなら FOR ループか BULK COLLECT を使うよう書かれています。

ORA-06502:変数の長さ・桁を超えた

DECLARE
  v_code VARCHAR2(3);
  v_num  NUMBER(2);
BEGIN
  v_code := 'abcd';   -- 4文字 → ORA-06502
  v_num  := 100;      -- 3桁 → ORA-06502(エラーヘルプの例:NUMBER(2) に 99 を超える整数)
END;
/

変数は emps.name%TYPE のように表の列から型を取ると、列の長さを変えたときに合わせて変わります。

ORA-12154・ORA-12514・ORA-12541:接続できない

番号 どこで失敗したか 確かめること
ORA-12154 接続先の名前(別名)を、接続の情報に変換できない tnsnames.ora にその別名があるか、TNS_ADMIN の場所、括弧の対応
ORA-12541 指定したホスト・ポートでリスナーが動いていない lsnrctl status、ホスト名・ポート、ファイアウォール
ORA-12514 リスナーはいるが、そのサービス名を知らない lsnrctl services、SERVICE_NAME の綴り、DB・PDB が起動しているか
# 別名を使わずに、ホスト:ポート/サービス名で直接つなぐ(Easy Connect)
sqlplus app@//db.example.com:1521/FREEPDB1
lsnrctl status          # リスナーの状態と、待ち受けのポート
lsnrctl services        # リスナーが知っているサービス名

Easy Connect でつながるのに別名でつながらないなら ORA-12154 の範囲(tnsnames.ora の問題)、Easy Connect でも ORA-12514 なら DB 側のサービスの問題、と切り分けられます。エラーヘルプでは、ORA-12514 はリスナーが起動した直後で、DB がまだ登録していない一時的な状態でも起こるので、少し待ってから再接続することも挙げられています。

ORA-28000・ORA-28001:アカウントのロック・パスワードの期限切れ

SELECT username, account_status, lock_date, expiry_date
FROM   dba_users
WHERE  username = 'APP';

ALTER USER app ACCOUNT UNLOCK;                 -- ORA-28000
ALTER USER app IDENTIFIED BY "NewPassw0rd#";   -- ORA-28001(新しいパスワードを設定)

エラーヘルプでは、ORA-28000 は連続したログイン失敗(FAILED_LOGIN_ATTEMPTS)・管理者によるロックで起き、ロックの時間は PASSWORD_LOCK_TIME で決まり、状態は DBA_USERS.ACCOUNT_STATUS で分かるとされています。ORA-28001 は PASSWORD_LIFE_TIME を過ぎたときなどに起きます。アプリの接続プールが変更前のパスワードで再接続を繰り返すと、ログインの失敗が重なって、またロックされる原因になります。 パスワードを変えたら、アプリの設定もあわせて直します。

ORA-00054:リソース・ビジー

-- セッションA
UPDATE emps SET salary = 150 WHERE id = 1;      -- まだ COMMIT していない
-- セッションB
ALTER TABLE emps ADD (memo VARCHAR2(100));      -- ORA-00054

DDL(ALTER TABLE など)は、ほかのセッションが表をロックしていると、待たずにすぐ ORA-00054 になります。 DDL_LOCK_TIMEOUT を設定すると、指定した秒数だけロックの解除を待ちます。

ALTER SESSION SET ddl_lock_timeout = 30;    -- 30秒まで待つ

ロックを持っているセッションは、エラーヘルプに載っている GV$SESSION と GV$LOCK を結合する SQL で調べられます。新しい形式のメッセージには、ロックの種類と ID1・ID2 の値が入っているので、それを条件にします。

ORA-01555:スナップショットが古すぎる

長い SELECT の途中で、読み取りに必要な UNDO(変更前のデータ)がほかの更新で上書きされたときに起きます。 エラーヘルプの対処は、自動 UNDO 管理なら UNDO_RETENTION を増やすことです。

対処 内容
UNDO の保持時間を延ばす ALTER SYSTEM SET undo_retention = 3600;(UNDO 表領域の大きさも合わせて見る)
問い合わせを短くする 索引・条件の見直し、分けて読む
読みながら COMMIT しない カーソルで読みながら同じ表を更新・COMMIT するループを避ける

ORA-01653・ORA-01652:表領域がいっぱい

SELECT tablespace_name, file_name, bytes/1024/1024 AS mb, autoextensible, maxbytes/1024/1024 AS max_mb
FROM   dba_data_files
WHERE  tablespace_name = 'USERS';

ALTER TABLESPACE users ADD DATAFILE SIZE 1G AUTOEXTEND ON NEXT 100M MAXSIZE 10G;
ALTER DATABASE DATAFILE '/u01/oradata/users01.dbf' RESIZE 4G;

エラーヘルプの対処は、データファイルの追加・RESIZE、AUTOEXTEND を有効にする、AUTOEXTEND 済みなら MAXSIZE を増やすか置き場所のディスクを増やす、BIGFILE 表領域なら ALTER TABLESPACE RESIZE、です。ORA-01652(一時表領域)は、ほかの処理が使い終わると空くことがあるので、再実行も対処に挙げられています。

ORA-04031:共有メモリが足りない

エラーヘルプの対処は、SGA_TARGET・MEMORY_TARGET を使っていればその値を増やす、使っていなければ足りないプール(SHARED_POOL_SIZE など)を増やす、です。同じ形の SQL に値を直接埋め込んで大量に投げると、共有プールに別々の SQL として溜まります。 バインド変数(WHERE id = :id)を使うと、同じ SQL として使い回されます。

MySQL・PostgreSQL との対応表

同じ操作を MySQL 8.0.46 と PostgreSQL 16.15 で行ったときのエラーです。 MySQL の ERROR 番号 (SQLSTATE)、PostgreSQL の SQLSTATE(5文字のエラーコード)で検索できます。

Oracle 操作 MySQL 8.0 PostgreSQL 16
ORA-00001 一意制約の重複 ERROR 1062 (23000): Duplicate entry 'sato@example.com' for key 'emps.email' duplicate key value violates unique constraint "emps_email_key"(23505)
ORA-00904 無い列 ERROR 1054 (42S22): Unknown column 'nme' in 'field list' column "nme" does not exist(42703)
ORA-00907・00933 構文の誤り ERROR 1064 (42000): You have an error in your SQL syntax; ... near 'FROM emps' syntax error at or near "FROM"(42601)
ORA-00936 SELECT FROM emps ERROR 1064 (42000) エラーにならない(列が0個の行が3行返る)
ORA-00942 無い表 ERROR 1146 (42S02): Table 't.emp_typo' doesn't exist relation "emp_typo" does not exist(42P01)
ORA-01400 NOT NULL に NULL ERROR 1048 (23000): Column 'name' cannot be null null value in column "name" of relation "emps" violates not-null constraint(23502)
ORA-01438 NUMERIC(5,2) に 1234.56 ERROR 1264 (22003): Out of range value for column 'salary' numeric field overflow(22003)
ORA-01476 SELECT 10 / 0 NULL(警告 1365)。INSERT では ERROR 1365 (22012): Division by 0 division by zero(22012)
ORA-01722 WHERE id = 'abc'(id は数値) エラーにならない(警告 1292 Truncated incorrect DOUBLE value: 'abc') invalid input syntax for type integer: "abc"(22P02)
ORA-01722 数値の列に 'abc' を INSERT ERROR 1366 (HY000): Incorrect decimal value: 'abc' for column 'salary' (同上の 22P02)
ORA-01843 など 13月の日付 CAST は NULL(警告 1292)、STR_TO_DATE も NULL(警告 1411) date/time field value out of range: "2026/13/45"(22008)
ORA-12899 長すぎる文字列 ERROR 1406 (22001): Data too long for column 'name' at row 1 value too long for type character varying(10)(22001)
ORA-02291 無い親を参照 ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails insert or update on table "emps" violates foreign key constraint(23503)
ORA-02292 子がある親を削除 ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails update or delete on table "depts" violates foreign key constraint ... on table "emps"(23503)
ORA-00918 あいまいな列 ERROR 1052 (23000): Column 'id' in field list is ambiguous column reference "id" is ambiguous(42702)
ORA-00979 GROUP BY に無い列 ERROR 1055 (42000): Expression #2 of SELECT list is not in GROUP BY clause ... column "emps.name" must appear in the GROUP BY clause or be used in an aggregate function(42803)
ORA-00937 GROUP BY なしで集計と列 ERROR 1140 (42000): In aggregated query without GROUP BY, ... 同上(42803)
ORA-01427 サブクエリが2行 ERROR 1242 (21000): Subquery returns more than 1 row more than one row returned by a subquery used as an expression(21000)
ORA-00932 DATE と数値を比較 エラーにならない(警告 1292 Incorrect date value: '5') operator does not exist: date = integer(42883)

PL/SQL・ロック・接続

Oracle 操作 MySQL 8.0 PostgreSQL 16
ORA-01403 SELECT INTO が0行 エラーにならず変数は NULL(警告 1329 No data - zero rows fetched, selected, or processed) INTO STRICT で query returned no rows(P0002)。STRICT なしは NULL
ORA-01422 SELECT INTO が2行 ERROR 1172 (42000): Result consisted of more than one row INTO STRICT で query returned more than one row(P0003)
ORA-06502 変数の長さ超え ERROR 1406 (22001): Data too long for column 'v' at row 1 value too long for type character varying(3)(22001)
ORA-06512 どこで起きたか (行番号の情報は出ない) CONTEXT: PL/pgSQL function get_name(integer) line 4 at SQL statement
ORA-00054 FOR UPDATE NOWAIT ERROR 3572 (HY000): Statement aborted because lock(s) could not be acquired immediately and NOWAIT is set. could not obtain lock on row in relation "emps"(55P03)
ORA-00054 ロック待ちの時間切れ ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction canceling statement due to lock timeout(55P03)
ORA-00060 デッドロック ERROR 1213 (40001): Deadlock found when trying to get lock; try restarting transaction deadlock detected(40P01)
ORA-01017 パスワード違い ERROR 1045 (28000): Access denied for user 'app'@'localhost' (using password: YES) SQLSTATE 28P01(invalid_password)
ORA-28000 ロックされたアカウント ERROR 3118 (HY000): Access denied for user 'locked_u'@'localhost'. Account is locked. NOLOGIN のロールで role "nologin_u" is not permitted to log in
ORA-28001 パスワード期限切れ ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement. (VALID UNTIL を過ぎるとパスワード認証が失敗する)
ORA-01031 権限が無い ERROR 1142 (42000): SELECT command denied to user 'app'@'localhost' for table 'emps' permission denied for table emps(42501)
ORA-12154 名前を解決できない ERROR 2005 (HY000): Unknown MySQL server host 'no-such-host.invalid' could not translate host name "no-such-host.invalid" to address
ORA-12541 待ち受けがいない ERROR 2003 (HY000): Can't connect to MySQL server on '127.0.0.1:33999' (111) Connection refused
ORA-12514 接続先の DB が無い ERROR 1049 (42000): Unknown database 'nodb' database "nodb" does not exist(3D000)

移行で気を付けたいのは、Oracle と PostgreSQL ではエラーになるのに、MySQL ではエラーにならず警告と NULL・切り捨てで進むものです。 手元では、0除算の SELECT(NULL)、数値の列と文字列の比較(警告 1292)、日付への変換の失敗(NULL)がそうでした。SHOW WARNINGS で警告を見られます。

MySQL 8.0.46 では、列の定義の中に書いた REFERENCES(dept_id INT REFERENCES depts(id))は無視されました。 存在しない親を指す行がエラーなしで入り、SHOW CREATE TABLE にも外部キーはありませんでした。表の最後に FOREIGN KEY (dept_id) REFERENCES depts(id) と書くと、ERROR 1452 になりました。Oracle・PostgreSQL の DDL を MySQL に持ってくるときは、この書き方を確かめます。

MySQL のエラー番号の一覧は関連記事「MySQLエラーコード一覧と対処法|ERROR 1045・2002の原因別解決」で扱っています。個別のエラーは「MySQL ERROR 1062 Duplicate entryの直し方」「PostgreSQL duplicate keyの直し方|シーケンスのずれ」「PostgreSQL relation does not existの原因と直し方」「MySQL only_full_group_byエラーの直し方|1055」で扱っています。

よくある質問

Q. エラーのメッセージが日本語で出ます。英語で調べたいです。 A. メッセージの言語は NLS_LANGUAGE の設定で変わります。番号は言語によらず同じなので、ORA-00942 のように番号で調べると、エラーヘルプのページにたどり着けます。

Q. ORA-06512 の行番号が、ソースの行と合いません。 A. 行番号は、そのプロシージャ・パッケージの本体の先頭(CREATE OR REPLACE の行)から数えます。SELECT line, text FROM user_source WHERE name = 'GET_NAME' ORDER BY line; で、データベースに入っているソースの行を確かめます。

Q. ORA-00942 なのに、SQL Developer では表が見えます。 A. ツールとアプリで、接続しているユーザー(スキーマ)が違うことがよくあります。SELECT USER, SYS_CONTEXT('USERENV', 'CURRENT_SCHEMA') FROM dual; で、今のユーザーとスキーマを確かめます。

Q. ORA-00600・ORA-07445 が出ました。 A. Oracle 内部のエラーで、SQL の書き間違いとは別のものです。アラートログとトレースファイルを確認し、Oracle のサポートに相談する対象です。

まとめ

  • エラーが並んだら いちばん上が原因。ORA-06512 は「どこで起きたか」
  • 調べるときは 番号で。エラーヘルプ(docs.oracle.com/en/error-help/db/ora-番号/)に原因と対処の原文がある。新しい版はメッセージに表名・列名・値が入る
  • ORA-00942 は 権限が無い場合も同じ。ORA-00904 は 引用符付きの名前を疑う
  • ORA-01400 は 空文字 '' も NULL。ORA-12899 は VARCHAR2 のバイト数(10 CHAR にする)
  • ORA-01722・日付のエラーは、暗黙の変換と NLS_DATE_FORMAT に頼らない
  • 接続は Easy Connect で、ORA-12154(名前の解決)と ORA-12514・12541(リスナー・サービス)を切り分ける
  • MySQL では、0除算・数値と文字列の比較・日付の変換の失敗がエラーにならず警告で進んだ

参考・出典

確認日はいずれも 2026年10月13日です。

  • Oracle Database Error Help(各 ORA 番号のページ):https://docs.oracle.com/en/error-help/db/ora-00001/ (以下、番号を変えたページ。ora-00054・00060・00900・00904・00907・00911・00918・00923・00932・00933・00934・00936・00937・00942・00979・01017・01031・01045・01400・01403・01422・01427・01438・01476・01555・01652・01653・01654・01722・01830・01843・01861・02290・02291・02292・04031・04043・06502・06512・06550・08177・12154・12170・12514・12541・12899・28000・28001)
  • Oracle「SQL*Plus User's Guide - OERR」:https://docs.oracle.com/cd/F82042_01/sqpug/oerr.html
  • oracle-base「SQL*Plus Enhancements in Oracle Database 23ai」:https://oracle-base.com/articles/23/sqlplus-new-features-23
  • MySQL 8.0 Reference Manual「Server Error Message Reference」:https://dev.mysql.com/doc/mysql-errors/8.0/en/server-error-reference.html
  • PostgreSQL 16 Documentation「Appendix A. PostgreSQL Error Codes」:https://www.postgresql.org/docs/16/errcodes-appendix.html

本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。

(記載例)出典:株式会社RJC「ORAエラー一覧|よく出るエラーの原因と直し方の早見表」

株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。

WE ARE HIRING

RJCで一緒に開発しながら、
成長を楽しみませんか?

RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!

  • 127日年間休日
  • 12時間平均残業時間
  • 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!

ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。

ABOUT RJC RJCがどんな会社か知る 考え方、研修、働き方、福利厚生、社員の前職まで。RJCのことが丸わかり! RJC丸わかりページへ JOB DESCRIPTION 仕事内容・待遇を見てみる 仕事内容、給与・待遇、選考の流れ。経験者も未経験も!応募前に知りたいこと、まとめました! 募集要項を見る ENTRY エントリーする エントリーは1〜2分・履歴書不要です。まずは話を聞いてみたい、という方でも歓迎です! エントリーフォームへ

RJCで一緒に開発しながら、 成長を楽しみませんか?