- データベース
ORAエラー一覧|よく出るエラーの原因と直し方の早見表
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期連続の黒字決算。