SQL Developer で SQL を実行したときに出るエラーのうち、この教材でよく出るものをまとめます。エラーは ORA- と5桁の番号で始まるので、まず番号で探してください。各章の「うまくいかないときは」も参照してください。
B.1 エラーメッセージの読み方
SQL がエラーになると、「文の実行」では画面下に赤い文字でメッセージが表示され、「スクリプトの実行」では「スクリプト出力」にメッセージが表示されます。
コマンドの1行目で開始中にエラーが発生しました :
INSERT INTO DEPARTMENT (DEPT_ID, DEPT_NAME) VALUES (1, '経理部')
エラー・レポート -
ORA-00001: 一意制約(DBAPP.PK_DEPARTMENT)に反しています
- どの SQL でエラーになったか:「コマンドの N 行目」と、その SQL 文が表示されます。複数の SQL を実行したときは、ここでどれが失敗したかを見ます
-
エラー番号:
ORA-00001のように、ORA-と5桁の番号。この付録はこの番号で引けます - メッセージ:制約に反したときは制約の名前、列が無いときは列名、のように原因の手がかりが入っています
文法の間違い(, の抜けなど)のエラーは、Oracle が 最初につまずいた場所 を指しています。本当の間違いは、その少し手前にあることが多いので、指された場所の前後を見直してください。
【便利な使い方】スクリプトの実行は、エラーの後も続く
F5(スクリプトの実行)では、途中の SQL がエラーになっても、残りの SQL は実行されます。「スクリプト出力」を上から順に読んで、どの SQL が失敗したかをすべて確認してください。
【便利な使い方】メッセージで分からないときは、番号で検索する
Oracle のエラーメッセージは、ほかのデータベースと比べて、原因が分かりにくい言い回しのことがあります。たとえば、ORA-00904: 無効な識別子です。 は列名のつづりの間違い、ORA-00933: SQLコマンドが正しく終了されていません。 はカンマの抜けや余計な語で出ることがよくありますが、メッセージからは読み取りにくいです。
メッセージを読んでも原因が分からないときは、ORA-00904 のようなエラー番号か、メッセージの文をそのまま検索してください。同じエラーに出会った人の情報や、原因の説明が見つかります。番号は ORA-904 ではなく、5桁の ORA-00904 のまま検索します。
Oracle の公式ドキュメント「エラー・メッセージ」(日本語)でも、エラー番号から原因と対処を引けます。この付録に無いエラーが出たときに使ってください。
B.2 接続のエラー
| エラー | 原因と対処 | 章 |
|---|---|---|
| ORA-01017: ユーザー名/パスワードが無効です。ログオンは拒否されました。 | ユーザー名かパスワードが違います。大文字と小文字も区別されます。system のパスワードはインストール時に設定したもの、dbapp は dbapp
|
第2章 |
| ORA-12514: リスナーは接続記述子でリクエストされたサービスを現在認識していません | 「SID」が選ばれたままか、サービス名の入力ミスです。「サービス名」を選び、XEPDB1(mac では FREEPDB1) と入力します。Oracle を起動した直後にも出ることがあるので、1分ほど待ってからやり直します |
第2章 |
| IO エラー: The Network Adapter could not establish the connection (接続が拒否されました) |
Oracle Database が起動していません。「サービス」アプリで OracleServiceXE と OracleOraDB21Home1TNSListener を開始します。ホスト名が localhost、ポートが 1521 になっているかも確認します |
「開発環境の準備」 |
| ORA-65096: 共通ユーザーまたはロール名が無効です | XEPDB1 ではなく CDB に接続しています。接続のプロパティで「サービス名」を XEPDB1(mac では FREEPDB1) に直します |
第2章 |
| ORA-01045: ユーザーDBAPPにはCREATE SESSION権限がありません。ログオンが拒否されました。 | GRANT が実行されていません。XE_SYSTEM で GRANT ALL PRIVILEGES TO dbapp; を実行します |
第2章 |
| ORA-01920: ユーザー名'DBAPP'は他のユーザー名またはロール名と競合しています | すでに dbapp ユーザーがあります。前に作ったものをそのまま使います | 第2章 |
| ポート 1521 が使えない | 別の Oracle など、同じポートを使うソフトウェアが動いています。パソコンの管理者に相談してください | 「開発環境の準備」 |
B.3 SQL の書き間違いのエラー
| エラー | 原因と対処 | 章 |
|---|---|---|
| ORA-00933: SQLコマンドが正しく終了されていません。 | 句の順番が違う(WHERE と ORDER BY の前後など)、文字の値を ' で囲んでいない、テーブルの別名に AS を付けた、前の SQL の ; が無く2つの SQL がつながった、のいずれかです |
第6章・第10章 |
| ORA-00936: 式がありません。 | 列名の最後に余分な , がある(SELECT NAME, AGE, FROM)、WHERE の後ろに条件が無い、== と書いた、ON の後ろに条件が無い |
第5章・第7章 |
| ORA-00920: 関係演算子が無効です。 |
=> のように比較演算子の向きが逆です。>=・<= と書きます |
第6章 |
| ORA-00907: 右カッコがありません。 |
( と ) の数が合っていないか、CREATE TABLE の列と列の間の , が抜けています |
第3章 |
| ORA-00917: カンマがありません。 | INSERT の文字の値を ' で囲んでいないか、値と値の間の , が抜けています |
第4章 |
| ORA-00905: キーワードがありません。 |
NOT NULL などのつづりの間違い、JOIN の後ろの ON の抜け |
第3章・第10章 |
| ORA-00902: データ型が無効です。 | CREATE TABLE のデータ型のつづりが違います(NUMBR、VARCHAR2 の 2 の抜けなど) |
第3章 |
| ORA-01756: 引用符付き文字列が正しく終了していません |
' が片方しかありません |
第4章 |
| ORA-00911: 文字が無効です。 | 全角の ‘ ’ や、SQL で使えない記号が混ざっています。半角の ' で書き直します |
第2章 |
| ORA-00909: 引数の個数が無効です。 ORA-00938: 関数の引数が不足しています。 |
関数に渡す引数の数が違います | 第8章 |
| SP2-0734: "SELEC * FR..."で開始するコマンドが不明です |
SELECT などの先頭のキーワードのつづりが違います |
第5章 |
B.4 テーブル・列・名前のエラー
| エラー | 原因と対処 | 章 |
|---|---|---|
| ORA-00942: 表またはビューが存在しません。 | テーブル名の打ち間違い、テーブルをまだ作っていない、XE_SYSTEM のワークシートで実行している(dbapp のテーブルは見えない)、のいずれかです | 第3章・第5章 |
| ORA-00904: "〇〇": 無効な識別子です。 | 列名の打ち間違い、そのテーブルに無い列、関数名の打ち間違い、WHERE・HAVING・ORDER BY に別名を書いた、文字の値を " で囲んだ、結合で別名と列の組み合わせが違う("E"."DEPT_NAME")、CREATE TABLE の最後の列の後ろに余分な , がある、のいずれかです |
第5章・第8章・第9章 |
| ORA-00955: すでに使用されているオブジェクト名です。 | 同じ名前のテーブルやシーケンスがすでにあります。作り直すなら先に DROP します |
第3章 |
| ORA-02449: 表の一意キーまたは主キーが外部キーに参照されています。 | 参照されている部署テーブルを先に DROP しようとしています。社員テーブルから先に消します |
第3章 |
| ORA-00918: 列の定義が未確定です。 | 結合で、両方のテーブルにある列(DEPT_ID)を別名なしで書いています。e.DEPT_ID のように別名を付けます |
第10章 |
B.5 制約と値のエラー
| エラー | 原因と対処 | 章 |
|---|---|---|
| ORA-00001: 一意制約(DBAPP.PK_DEPARTMENT)に反しています | 主キーが重複しています。INSERT では シーケンス名.NEXTVAL を使い、同じ INSERT を2回実行していないかを確認します |
第4章 |
| ORA-01400: ("DBAPP"."DEPARTMENT"."DEPT_NAME")にはNULLは挿入できません。 |
NOT NULL の列に値を入れていません。表示された列名の値を INSERT に加えます |
第4章 |
| ORA-01407: ("DBAPP"."EMPLOYEE"."AGE")をNULLには更新できません。 |
NOT NULL の列を UPDATE で NULL にしようとしています |
第7章 |
| ORA-02290: チェック制約(DBAPP.CK_EMPLOYEE_GENDER)に違反しました | CHECK 制約の条件に合わない値(GENDER に 1・2 以外)を入れようとしています | 第4章 |
| ORA-02291: 整合性制約(DBAPP.FK_EMPLOYEE_DEPARTMENT)に違反しました - 親キーがありません | 外部キーの参照先に無い値(存在しない部署ID)を入れようとしています。部署テーブルにある部署IDを指定します | 第4章 |
| ORA-02292: 整合性制約(DBAPP.FK_EMPLOYEE_DEPARTMENT)に違反しました - 子レコードがあります | 外部キーで参照されている行(社員がいる部署)を DELETE しようとしています。参照している側を先に変更・削除します | 第7章 |
| ORA-12899: 列"DBAPP"."DEPARTMENT"."DEPT_NAME"の値が大きすぎます(実際: 23、最大: 20) | 列の長さ(VARCHAR2(20 CHAR))を超える文字列を入れようとしています |
第4章 |
| ORA-01438: この列に許容される指定精度より大きな値です | 数の列の桁数(NUMBER(3) など)を超える数を入れようとしています |
第4章 |
| ORA-01722: 数値が無効です。 | 数の列に文字を入れた、数の列と文字を比べた、文字列を + でつなげようとした(連結は ||)、のいずれかです。INSERT では列名と値の順番がずれていないかを確認します |
第4章・第8章 |
| ORA-00947: 値の個数が不足しています。 ORA-00913: 値の個数が多すぎます。 |
INSERT の列名の数と値の数が合っていません | 第4章 |
| ORA-01858: 数値を指定する箇所に数値以外の文字が指定されています | 日付として解釈できない文字列を日付の列と比べています。DATE '2000-06-22' の書き方にします |
第8章 |
B.6 集計・結合のエラー
| エラー | 原因と対処 | 章 |
|---|---|---|
| ORA-00937: 単一グループのグループ関数ではありません。 | 集計関数と普通の列を一緒に書いていて、GROUP BY がありません |
第9章 |
| ORA-00979: GROUP BYの式ではありません。 |
GROUP BY に書いていない列を、SELECT・HAVING・ORDER BY に書いています |
第9章・第10章 |
| ORA-00934: ここではグループ関数は使用できません。 |
WHERE に集計関数を書いています。HAVING に書きます |
第9章 |
B.7 エラーではないが、思ったとおりにならないとき
| 症状 | 原因と対処 | 章 |
|---|---|---|
| SELECT の結果が0行 | 条件に合う行が無いか、文字の値が1文字違っています(空白、全角と半角、大文字と小文字)。= NULL と書いていると必ず0行になります(IS NULL を使う) |
第6章・第6章 |
| 結果の順番が毎回違う |
ORDER BY が無いか、ORDER BY の列の値が同じ行があります。2つ目の列(主キーなど)を ORDER BY に加えます |
第5章 |
| 「0行更新しました。」「0行削除しました。」 | WHERE の条件に合う行がありません。同じ WHERE 句で SELECT して確かめます | 第7章 |
| 想定より多くの行が更新・削除された | WHERE の条件が広いか、WHERE を書き忘れています。COMMIT 前なら ROLLBACK で戻します |
第7章 |
| ほかの接続(別の人、アプリ)から変更が見えない |
COMMIT していません |
第4章 |
| ROLLBACK しても戻らない | すでに COMMIT されています。DDL(CREATE・DROP)を実行すると自動で COMMIT されることにも注意します | 第4章 |
| ID が 1, 2, 4 のように飛ぶ | エラーになった INSERT や ROLLBACK した INSERT でも、シーケンスの番号は消費されます。番号が飛ぶこと自体は問題ありません。そろえたいときは作り直します | 第4章 |
日付が 00-06-22 のように2桁の年で表示される |
日付書式の設定が反映されていません。設定を確認し、SQL Developer をいったん終了して、もう一度起動してから接続します | 「開発環境の準備」 |
| 結果が表ではなく文字で表示される | F5 で実行しています。Ctrl + Enter で実行すると表で表示されます | 第2章 |
| 結合の結果の行数が多すぎる(40行など) |
ON の結合の条件が間違っているか抜けています |
第10章 |
| 社員のいない部署が出てこない、人数 0 が 1 になる |
INNER JOIN を LEFT OUTER JOIN に、COUNT(*) を COUNT(e.EMP_ID) にします |
第10章・第10章 |