このトピックでは、PolarDB for PostgreSQL (Compatible with Oracle) の大文字と小文字を区別しない機能について説明します。
背景
デフォルトでは、OracleとPolarDB for PostgreSQL (Compatible with Oracle) では、データベースオブジェクトの名前の大文字化ルールが異なります。 二重引用符で囲まれていないオブジェクト名の場合、Oracleはそれらを大文字に変換し、PolarDB For PostgreSQL (Compatible with Oracle) はそれらを小文字に変換します。 オブジェクトを作成するステートメントでオブジェクト名が二重引用符で囲まれている場合、その名前はそのまま格納されます。 したがって、PolarDB for PostgreSQL (Compatible with Oracle) を初めて使用する一部のOracleユーザーは、ユーザーの習慣の違いにより問題が発生する可能性があります。 例:
CREATE TABLE test_table(id int); SELECT * FROM "TEST_TABLE" WHERE "ID" = 10;
Oracleでは、前述のCREATE TABLEステートメントが実行されると、テーブル名
test_table
が自動的にTBLに変換されます。 TBLテーブルからデータを照会することを指定する文は、正常に実行できます。 ただし、PolarDB for PostgreSQL (Compatible with Oracle) でCREATE TABLE文を実行すると、テーブル名tblが小文字に格納されます。 したがって、TEST_TABLE
テーブルを含むSELECTステートメントは、テーブルが見つからないことを示すエラーを返します。CREATE TABLE "TEST_TABLE"(id int); SELECT * FROM test_table WHERE "ID" = 10;
上記のクエリは、大文字の問題のため、PolarDB for PostgreSQL (Compatible with Oracle) でも実行できません。
大文字化の問題を解決し、OracleからPolarDB for PostgreSQL (Compatible with Oracle) への切り替えを容易にするために、PolarDB for PostgreSQL (Compatible with Oracle) はケース非感受性機能を提供します。 この機能を有効にすると、二重引用符で囲まれていないオブジェクト名、二重引用符で囲まれて大文字で書かれたオブジェクト名、二重引用符で囲まれて小文字で書かれたオブジェクト名と同等のオブジェクト名と見なされます。 たとえば、次の各ステートメントで作成されたテーブルと列の名前は、結果の点では同等と見なされます。
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;
二重引用符で囲まれ、小文字と大文字の両方で構成されるオブジェクト名は、この機能の影響を受けません。 例:
CREATE TABLE "TEST_table"(id int);
SELECT * FROM "TEST_table" WHERE "ID" = 10;
使用上の注意
コンソールで
polar_case_sensitive_for_columnref
パラメーターを次のいずれかの値に設定して、ケース非感受性機能を有効または無効にできます。on: ケース非感受性機能が有効になっています。
off: ケース鈍感機能は無効です。
説明デフォルトでは、マイナーバージョン1.1.24が7月2022日にリリースされた後に作成されたクラスターでは、ケース非依存機能が有効になります。
マイナーバージョン1.1.24が7月2022日にリリースされる前に作成されたクラスターの場合、クラスター内のデータベース、スキーマ、テーブル、または列が異なるケースで同じ文字を含む名前を使用しているかどうかを判断できない場合は、大文字と小文字を区別できない機能を有効にしないでください。 それ以外の場合、誤ったクエリ結果が返されます。
同じ文字を含むオブジェクト名を異なるケースで指定しないことを推奨します。
クエリで、名前が同じ文字を含む列を持つテーブルが異なる場合は、
<Table name.Column name>
形式で列に名前を付けるか、列のエイリアス
を使用することをお勧めします。テーブルが作成された既存のクラスターでこの機能を有効にした後、これらのクラスターでDDLステートメントを実行するときは注意して続行することをお勧めします。 たとえば、
"tbl"
という名前のテーブルが既に存在するクラスターに対して、ケース非依存機能を有効にしたとします。 次に、次のCREATE TABLEステートメントを実行して、"TBL"
という名前のテーブルを作成します。 DROP TABLE文を実行して "TBL" テーブルを削除すると、"tbl" と "TBL" という名前のテーブルは同等と見なされるため、両方のテーブルが削除されます。CREATE TABLE "tbl" (id int); DROP TABLE "TBL";
説明
大文字と小文字の区別機能は、次のオブジェクトの名前にのみ適用されます。
データベース
スキーマ
共通テーブル式 (CTE) 、インデックス、ビュー、マテリアライズドビューなどのリレーショナルオブジェクトを含むテーブル
カラム
エイリアス
関数
シノニム
パッケージなどの他のオブジェクトは、ケース非依存機能ではサポートされません。
リビジョンバージョンが1.1.42以降のクラスターでは、大文字と小文字を区別しない機能がサポートされています。
polar_case_sensitive_for_columnref
パラメーターを次のいずれかの値に設定するには、SQL文を実行して、大文字と小文字を区別できない機能を有効または無効にします。
on: ケース非感受性機能が有効になっています。
off: ケース鈍感機能は無効です。
デフォルトでは、マイナーバージョン1.1.24が7月2022日にリリースされた後に作成されたクラスターでは、ケース非依存機能が有効になります。
例
テーブル、列、およびエイリアスの場合:
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)