Oracle SQL を PolarDB for PostgreSQL (Compatible with Oracle) に移行する際、Oracle が識別子を大文字で格納するため、大文字の識別子を参照するクエリは失敗します。これは、PolarDB が引用符なしの識別子を小文字で格納するためであり、両データベースの折りたたみ方向が逆であるためです。ケース非依存性機能はこのギャップを埋めます。この機能を有効にすると、引用符なしの名前、すべて大文字の引用符付きの名前、およびすべて小文字の引用符付きの名前が同等として扱われるため、識別子を書き換えることなく Oracle SQL を PolarDB で実行できます。
識別子の折りたたみ動作
Oracle と PolarDB は、引用符なしの識別子を異なる方法で処理します。
| データベース | 引用符なしの識別子 | 格納形式 |
|---|---|---|
| Oracle | test_table | TEST_TABLE |
| PolarDB (PostgreSQL) | test_table | test_table |
両データベースは、二重引用符付き識別子を記述されたとおりに正確に格納します。これは、Oracle で test_table として作成されたテーブルがストレージでは TEST_TABLE になることを意味しますが、PolarDB で同じステートメントを実行すると test_table が生成されます。そして、"TEST_TABLE" を使用するクエリは、test_table と TEST_TABLE が同じではないため、PolarDB では失敗します。
ケース非依存性機能は、次の3つの識別子形式を同等にすることで、この問題を解決します。
| 識別子形式 | 例 | 機能有効時に同等 |
|---|---|---|
| 引用符なし | test_table | はい |
| 二重引用符付き、すべて大文字 | "TEST_TABLE" | はい |
| 二重引用符付き、すべて小文字 | "test_table" | はい |
| 二重引用符付き、混合ケース | "TEST_table" | いいえ — 記述されたとおりに格納され、一致します |
有効にすると、これら4つのクエリはすべて同じ結果を返します。
SELECT * FROM test_table WHERE "ID" = 10;
SELECT * FROM "TEST_TABLE" WHERE "ID" = 10;
SELECT * FROM TEST_TABLE WHERE "ID" = 10;
SELECT * FROM "test_table" WHERE "ID" = 10;"TEST_table" のような混合ケースの二重引用符付きの名前は影響を受けません。この機能は、二重引用符付きの名前内のすべての文字が均一に大文字であるか、均一に小文字である場合にのみ適用されます。
サポートされるオブジェクト
ケース非依存性は、以下のすべてのオブジェクトタイプに適用されます。個々のオブジェクトタイプに対して有効にすることはできません。すべてに適用されるか、まったく適用されません。
データベース
スキーマ
テーブル (共通テーブル式 (CTEs)、インデックス、ビュー、マテリアライズドビューを含む)
カラム
エイリアス
関数 (リビジョンバージョン 2.0.14.26.0 以降)
パッケージ
ケース非依存性の有効化または無効化
polar_case_sensitive_for_columnref パラメーターを設定して、この機能を制御します。
| 値 | 動作 |
|---|---|
on | ケース非依存性が有効になります |
off | ケース非依存性が無効になります |
ケース非依存性は、マイナーバージョン 1.1.24 (2022年7月リリース) 以降に作成されたクラスターではデフォルトで有効になっています。
コンソール経由: ご利用のクラスターのパラメーター設定に移動し、polar_case_sensitive_for_columnref を更新します。
SQL経由:
-- 有効化
SET polar_case_sensitive_for_columnref = on;
-- 無効化
SET polar_case_sensitive_for_columnref = off;注意事項
既存のクラスターで有効にする前に:
マイナーバージョン 1.1.24 (2022年7月リリース) より前に作成されたクラスターの場合、データベース、スキーマ、テーブル、またはカラムのいずれかが、大文字と小文字のみが異なる名前 (たとえば、id という名前のカラムと ID という名前の別のカラム) を使用しているかどうかを確認してください。このようなクラスターでこの機能を有効にすると、エンジンがこれらの名前を区別できなくなるため、不正確なクエリ結果を返す可能性があります。
曖昧なオブジェクト名を避ける:
名前が文字ケースのみで異なるオブジェクトの命名は避けてください。クエリに、大文字と小文字が異なる同じ文字を持つカラムを持つテーブルが含まれる場合は、<table_name>.<column_name> 表記またはカラムエイリアスを使用してください。
名前が文字ケースのみで異なるオブジェクトがすでに存在するクラスターでケース非依存性を有効にすると、DDLステートメントが意図しないオブジェクトに影響を与える可能性があります。たとえば、"tbl" という名前のテーブルがすでに存在し、後で "TBL" を作成した場合、DROP TABLE "TBL" を実行すると、"tbl" と "TBL" が同等として扱われるため、両方のテーブルが削除されます。
CREATE TABLE "tbl" (id int);
DROP TABLE "TBL"; -- "tbl" と "TBL" の両方を削除します例
テーブル、カラム、およびエイリアス
CREATE TABLE "TEST_TABLE"(id int);
INSERT INTO test_table VALUES(10);
SELECT "T".id FROM "TEST_TABLE" AS t WHERE "ID" = 10;結果:
id
----
10
(1 row)データベース、スキーマ、および関数
CREATE DATABASE test_database;
\c test_database
CREATE SCHEMA "TEST_SCHEMA";
CREATE FUNCTION "TEST_SCHEMA"."TEST_FUNCTION"(IN i int) RETURNS int AS $$ BEGIN RETURN i; END; $$ LANGUAGE plpgsql;
SELECT "TEST_DATABASE".test_schema.test_function(10) FROM dual;結果:
test_function
---------------
10
(1 row)パッケージ
CREATE PACKAGE "TEST_PACKAGE" AS
FUNCTION test_function(i int) RETURN int;
END;
CREATE PACKAGE BODY "TEST_PACKAGE" AS
FUNCTION test_function(i int) RETURN int
IS
BEGIN
RETURN i;
END;
END;
SELECT test_package."TEST_FUNCTION"(100) FROM dual;結果:
TEST_FUNCTION
---------------
100
(1 row)混合ケース名は正規化されません
この機能は、混合ケースの二重引用符付きの名前を正規化しません。二重引用符で囲まれ、小文字と大文字の両方で構成されるオブジェクト名は、この機能の影響を受けません。
CREATE TABLE "TEST_table"(id int);
SELECT * FROM "TEST_table" WHERE "ID" = 10;