2023年7月26日水曜日

RESTデータ・ソースのRAWセレクタの使用について

 Oracle APEX 23.1より、RESTデータ・ソースデータ・プロファイル詳細RAWセレクタの使用というオプションが追加されました。

このオプションの効果について説明します。


データ・プロファイル行セレクタ列のセレクタの定義を含みます。Oracle APEX 23.1以前は、これらのセレクタはサニタイズ(ダブル・クオートで囲む)した上でファンクションJSON_TABLEで使用されていました。

Oracle APEX 23.1で追加されたRAWセレクタの使用オンにすると、指定したセレクタはそのまま使用されます。その結果、アスタリスクを含んだセレクタが機能するようになります

以下のJSONドキュメントを返すRESTサービスがあるとします。
    {
        "items" : {
            "rs1" : {
                "rows": [ 
                    {
                        "data": {
                            "id": 1,
                            "name": "Kenny"
                        }
                    },
                    {
                        "obj": {
                            "id": 2,
                            "name": "Sam"
                        }
                    }
                ]
            },
            "rs2" : {
                "rows": [ 
                    {
                        "data" : {
                            "id": 23,
                            "name": "Jane"
                        }
                    },
                    {
                        "obj": {
                            "id": 24,
                            "name": "Kate"
                        }
                    }
                ]
            }
        }
    }
属性rs1、rs2を区別せず、また、dataとobjも区別せずに4行のデータとしてRESTデータ・ソースが返すようにするために、RAWセレクタの使用オンにして、行セレクタと列のセレクタに以下を指定します。

行セレクタ: items.*.rows[*]
列IDのセレクタ: $.*.id
列NAMEのセレクタ: $.*.name

RAWセレクタの使用オフのときは、Oracle APEXが指定した行セレクタの末尾に[*]を追加します。そのため行セレクタ[*]は付けません。RAWセレクタをオンにしたときは、開発者が行セレクタの末尾に[*]を追加する必要があります

内部的には以下のようなSQLが実行されます。セレクタがそのまま使われています。
select jt.*
from raw_test r, json_table(r.data, '$.items.*.rows[*]'
    columns
    (
        id number path '$.*.id',
        name varchar2(20) path '$.*.name'
    )
) jt;

RAWセレクタオフの時に実行されるSQLは以下です(行セレクタの末尾からは[*]を除いています)。
select jt.*
from raw_test r, json_table(r.data, '$."items"."*"."rows"[*]'
    columns
    (
        id number path '$."*"."id"',
        name varchar2(20) path '$."*"."name"'
    )
) jt;
アスタリスクが含まれている場合、上記のSELECT文は行を返しません。

Oracle APEX 23.1で追加された行セレクタの説明は以上になります。

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