Oracle データベース「ORA-00942: テーブルまたはビューが存在しません」の問題の解決
最近、データベース コース設計プロジェクトを完了するときに、Oracle データベースに接続する必要があります。Navicat プレミアムを使用しており、接続プロセスは正常ですが、単純なインターフェイスを実装してテストすると、エラーが発生し、「ORA-00942:テーブルまたはビューが存在しません" :
関連情報を調べたところ、次のような理由が考えられることがわかりました。
-
テーブル自体がデータベースに存在しないか、名前が間違っていますが、確認したところそれが原因ではありませんでした。
-
Oracle では大文字と小文字が区別されます。SQL スクリプトを記述するときにこの形式を使用すると
create table 表名
、Oracle データベースはテーブル名を自動的に大文字に変換します。のように:
create table routes(...)
最終的なテーブル名は実際には です
ROUTES
。したがって、最終的なテーブル名を小文字にしたい場合は
routes
、実際にテーブルを作成するときに次のように記述する必要があります。create table "routes"(...)
""を付けると、一般的なSQL文クエリを使用する際に「ORA-00942: テーブルまたはビューが存在しません」が発生するため、SQLスクリプト内でテーブル名に""を付ける必要があります。
select * from "routes";
データベース テーブル名を二重引用符のないバージョンに変更する場合、つまり、すべて大文字のバージョンがデフォルトで生成される場合は、次のクエリ ステートメントを使用できます (逆も同様)。
ALTER TABLE "routes"
RENAME TO routes;
更新後、テーブル名はデフォルトで大文字に変換されます。
テーブル内の属性にも同じ問題が存在する可能性があります。すべての属性の名前を統一形式ですべて大文字に変更する場合は、次の SQL ステートメントを使用できます。
DECLARE
stmt VARCHAR2(1000);
BEGIN
FOR col IN (SELECT column_name
FROM user_tab_columns
WHERE table_name = 'ROUTES')
LOOP
stmt := 'ALTER TABLE ROUTES RENAME COLUMN "' || col.column_name || '" TO ' || REPLACE(col.column_name, '"', '');
EXECUTE IMMEDIATE stmt;
END LOOP;
END;
/
このコードは、Oracle データベースに匿名の PL/SQL ブロックを作成します。これは、「ROUTES」テーブル内のすべての列を反復処理し、動的 SQL ステートメントを実行して列名から二重引用符を削除します。
変更後は、テーブル内のすべての属性名が大文字で表示されます。
この時点で、インターフェースを再度テストすると、エラー報告の問題は発生しません。
概要:
- Oracle では、テーブル名を二重引用符で囲んで作成されたテーブル名は大文字と小文字が区別されます。テーブルは二重引用符を使用してのみ参照できます。例えば:
SELECT * FROM "routes";
- デフォルトでは、テーブルの作成時に二重引用符を使用しない場合、Oracle はテーブル名を大文字と小文字を区別せずに扱います。この場合、大文字と小文字の混合またはすべて小文字を使用してテーブル名を参照できます。たとえば、次のようになります。
SELECT * FROM routes;
またはSELECT * FROM ROUTES;
両方が有効です。 - 要約すると、論理的に言えば、「ルート」と「ルート」は両方とも同じテーブルを参照しますが、Oracle データベースの命名規則と参照時の大文字小文字の処理の影響を受ける可能性があります。特別な処理が必要ない場合は、不必要な複雑さを避けるために二重引用符なしでテーブル名を使用することを一般的にお勧めします。