2023年8月3日木曜日

アプリケーション定義のNLS_SORTとNLS_COMPの設定

 アプリケーション定義グローバリゼーション文字の値の比較文字の値の比較動作という設定があります。


オンライン・ヘルプより、文字の値の比較がセッション・パラメータのNLS_SORT文字の値の比較動作がセッション・パラメータのNLS_COMPに対応していることがわかります。また、この設定が適用されるのは、クラシック・レポート対話モード・レポートリスト・ビューの各リージョン、およびプラグインAPIのSQL問合せの実行に限定されています。

APEXのテンプレート処理自体がSQLおよびPL/SQLで記述されているため、セッション・パラメータのNLS_SORTやNLS_COMPを変更すると正常に動作しなくなります。そのため、これらのセッション・パラメータは、レポートなどのデータ・ソースとなるSELECT文の実行時に限定する必要があります。

簡単なアプリケーションを作成して、これらの設定の効果を確認してみます。

以下のクイックSQLのモデルを使って表COLL_TESTDATAを作成します。
# prefix: coll
testdata
    name vc80

SQLワークショップユーティリティクイックSQLを開き、モデルから表を作成します。

上記のモデルを記述し、SQLの生成SQLスクリプトを保存レビューおよび実行をクリックします。


レビューおよび実行をクリックすると、スクリプト・エディタが開きます。以下のテストデータを入力するINSERT文を、CREATE TABLE文の下に挿入します。
insert into coll_testdata(name) values('太郎');
insert into coll_testdata(name) values('たろう');
insert into coll_testdata(name) values('タロウ');
insert into coll_testdata(name) values('Taro');
insert into coll_testdata(name) values('taro');
insert into coll_testdata(name) values('花子');
insert into coll_testdata(name) values('はなこ');
insert into coll_testdata(name) values('ハナコ');
insert into coll_testdata(name) values('Hanako');
insert into coll_testdata(name) values('hanako');
commit;
実行をクリックします。


確認画面が開きます。即時実行をクリックします。


表COLL_TESTDATAが作成され、10行のテストデータが挿入されます。

アプリケーションの作成をクリックします。確認画面が開くので、そこでもアプリケーションの作成をクリックします。


アプリケーション作成ウィザードが開きます。

デフォルトで表COLL_TESTDATAのフォーム付き対話モード・レポートが作成されます。

名前言語照合の確認と入力し、アプリケーションの作成をクリックします。


確認に使用するアプリケーションが作成されました。


アプリケーションを実行し、対話モード・レポートのページを表示します。Nameの昇順で行を並べます。

NLS_SORT、NLS_COMPのデフォルトは通常BINARYです。


フィルタでとしてName演算子として次と類似(LIKE演算子)、としてhanakoを指定します。


レポートにはNameがhanakoの行だけが表示されます。


アプリケーション定義グローバリゼーション文字列の比較BINARY_CIに変更します。


対話モード・レポートでの表示順序がHanako, hanako, taro, TaroとCase Insensitiveに変わっています。


列Nameをhanakoでフィルタすると、hanakoの行だけが表示されます。


文字の値の比較動作言語形式Lingusticのことです)に変更します。


同じフィルタ条件で、hanakoとHanakoの両方が表示されるようになります。


以上で文字の値の比較(NLS_SORT)と文字の値の比較動作(NLS_COMP)の設定の効果が確認できました。

文字の値の比較JAPANESEを設定してみます。


辞書順にソートされます。


文字の値の比較JAPANESE_Mを設定してみます。


英字の位置が変わります。


文字の値の比較UCA0700_JAPANESEを設定してみます。


結果は以下になりました。


表の列に言語照合を設定する方法については、こちらの記事で紹介しています。

アプリケーション定義による設定は、レポートのデータ・ソースなどに限定されているとはいえ、アプリケーション全体に影響があります。そのため、かなり小さなアプリケーションでないと使用は難しいように思います。

今回作成したアプリケーションのエクスポートを以下に置きました。表COLL_TESTDATAの作成やテスト・データをインストールするスクリプトも含んでいます。
https://github.com/ujnak/apexapps/blob/master/exports/nls-sort-and-nls-comp-sample.zip

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