2022年2月17日木曜日

言語照合(COLLATION)の確認

 Autonomous Databaseの初期化パラメータMAX_STRING_SIZEは最初からEXTENDEDに設定されています。

MAX_STRING_SIZEがEXTENDEDの場合、VARCHAR2の長さの上限が4000から32767に拡張されます。その他に、表の列に照合(COLLATION)を設定できるようになります。

Oracle Datase 19cで設定できる言語照合については、以下にリファレンスがあります。

Databaseグローバリゼーション・サポート・ガイド Release 19
A.6 言語照合

言語照合の設定に依存してソートの順番がどう変わるか、データを見て確認できるようにアプリケーションを作ってみます。

使用するデータベースはAlways FreeのAutonomous Transaction Processingです。


表の作成


クイックSQLを使って、アプリケーションで使用する表を作成します。

SQLワークショップユーティリティから、クイックSQLを開きます。モデルとしては以下を使用します。

# prefix: coll
# semantics: default
definitions
collation vc40

testdata
name vc80

SQLの生成SQLスクリプトを保存レビューおよび実行を順次実行します。

レビュー画面が開いたら、実行をクリックします。ダイアログが開くので、即時実行をクリックします。

DDLが2行実行されます。実行が成功すると、表COLL_DEFINITIONSおよびCOLL_TESTDATAが作成されます。

以上で表の準備は完了です。


アプリケーションの作成


アプリケーション・ビルダーより作成を実行し、アプリケーション作成ウィザードを起動します。

新規に作成するアプリケーションの名前言語照合の確認とします。最初にデフォルトで作成されているホーム・ページを削除します。編集をクリックします。

削除をクリックします。確認のためのダイアログが表示されるので、OKをクリックします。

ホーム・ページが削除されました。

確認したい言語照合の名前を保存する(表COLL_DEFINITIONSに保存する)対話グリッドのページを作成します。

ページの追加をクリックします。

ページ・タイプの一覧より、対話グリッドを選択します。

ページ名言語照合とします。表またはビュー編集を許可が選択されていることを確認します。表またはビューとしてCOLL_DEFINITIONSを選択します。

詳細の設定にホームページとして設定という項目があります。現時点で最初のページになるため、ホームページの設定にはチェックが入ります。そのため、このページがホーム・ページ(サインイン後に最初に表示されるページ)になります。

ページの追加をクリックします。

対話グリッドのページが作成されます。

続いて対話モード・レポートとフォームのページを追加します。ページの追加をクリックします。

対話モード・レポートを選択します。

ページ名テストとします。表またはビュー対話モード・レポートが選択されていることを確認します。表またはビューとしてCOLL_TESTDATAを選択します。編集作業ができるように、フォームを含めるチェックを入れます。

ページの追加をクリックします。


フォーム付きの対話モード・レポートのページが追加されます。

ウィザードでできる範囲はこれで完了なので、アプリケーションの作成を実行します。


アプリケーションが作成されました。

これから言語照合の動作確認のために、対話モード・レポートのページ(ページ番号2)に変更を加えていきます。



対話モード・レポートの更新



ページ・デザイナにて対話モード・レポートのページを開きます。

最初に対話モード・レポートのソースタイプSQL問合せに変更し、SQL問合せに以下を記述します。シフトJISでのコード選択された照合をレポートの表示に含めています。

select
ID
,NAME
,utl_i18n.string_to_raw(name, 'JA16SJIS') sjis
,COLLATION(NAME) collation
from COLL_TESTDATA


続いて、表COLL_TESTDATAの列NAMEに適用する照合を選択するページ・アイテムを作成します。

リージョンColl Testdata上でコンテキスト・メニューを開き、ページ・アイテムの作成を実行します。


作成されたページ・アイテムの識別名前P2_COLLATIONタイプ選択リストとします。ラベル言語照合設定選択時のページ・アクションにはRedirect and Set Valueを選びます。LOVタイプSQL問合せSQL問合せには以下を記述します。

select collation d, collation r from coll_definitions


選択された言語照合を、列の定義に反映させるプロセスを作成します。

レンダリング前ヘッダーの前の上でコンテキスト・メニューを表示させ、プロセスの作成を実行します。


作成したプロセスの識別名前言語照合の設定とします。タイプコードの実行とし、ソースPL/SQLコードに以下を記述します。選択された言語照合によって、列の定義を変更(ALTER文の実行)しています。

declare
l_sql varchar2(400);
begin
l_sql := 'alter table coll_testdata modify (name collate %COLLATION%)';
l_sql := replace(l_sql, '%COLLATION%', :P2_COLLATION);
apex_debug.info(l_sql);
execute immediate l_sql;
exception
when others then
apex_error.add_error(
p_message => sqlerrm
,p_display_location => apex_error.c_inline_in_notification
);
end;

ページ・アイテムP2_COLLATIONに値がある場合のみALTER文が発行されるように、サーバー側の条件タイプアイテムはNULLではないアイテムとしてP2_COLLATIONを指定します。


最後に、言語照合を切り替えたときに発生する警告を抑止するため、ページ・プロパティのナビゲーション保存されていない変更の警告OFFにします。


以上で、言語照合の設定を確認するアプリケーションの作成は完了です。


言語照合の確認



作成したアプリケーションを実行し、言語照合によるソート処理への影響を確認します。

言語照合のページで、JAPANESE、JAPANESE_M、BINARY、UCA0700_JAPANESEを登録します。


テストのページを開き、テストデータとして、太郎、たろう、タロウ、Taro、taro、花子、はなこ、ハナコ、Hanako、hanakoを作成します。

列Nameにソートを定義し、言語照合を切り替えてソート順を確認します。

BINARYを選択した場合は、以下のように表示されました。


JAPANESE_Mを選択した結果です。


JAPANESEです。


UCA0700_JAPANESEです。


今回作成したアプリケーションのエクスポートを以下に置きました。
https://github.com/ujnak/apexapps/blob/master/exports/database-collation.sql

以上になります。

Oracle APEXのアプリケーション作成の参考になれば幸いです。

追記

照合にBINARY_CIを設定して、対話モード・レポートのフィルタを設定すると、きちんとCase Insensitiveで判断されました。


こんな記述や
select * from coll_testdata where upper(name) = upper(:P2_NAME);
こんな記述は不要。
select * from coll_testdata where NLSSORT(name, 'NLS_SORT=BINARY_CI') = NLSSORT(:P2_NAME,'NLS_SORT=BINARY_CI');