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');