2024年7月17日水曜日

ORDSのMLE JavaScriptハンドラ内でmustacheを呼び出しテンプレート処理を行なう

Oracle REST Data ServicesのProduct ManagerのPeter O'brienさんが、以下のブログ記事を公開しています。

Transform your SQL Results with Mustache and ORDS JavaScript Handlers
https://peterobrien.blog/2024/07/16/transform-your-sql-results-with-mustache-and-ords-javascript-handlers/

この記事では、テンプレート・エンジンのmustacheのMLE ModuleをOracle Database 23aiに作成し、それをORDSのMLE JavaScriptハンドラ内で呼び出しています。ORDSのMLEハンドラ内で、データベースの検索結果をテンプレートに穴埋めし結果のXMLファイルを出力しています。

データベースでのテンプレート処理というのは、Oracle APEXの処理の基本です。MLEのJavaScriptでのテンプレート処理の実用性はさておき、データベースでのテンプレート処理をJavaScriptで実装してみます。それが、Oracle APEXの理解につながれば幸いです。

以前に、MLE Moduleの作成やORDS MLE Handlerの作成を助けるアプリケーションを作成しています。

NPMパッケージからOracle Datase 23aiのMLEモジュールを作成する
ORDSのハンドラをMLEのJavaScriptで記述する
https://apexugj.blogspot.com/2024/07/sample-mle-javascript-ords-handler.html

それぞれのアプリケーションをインポートするのが面倒なので、ひとつにまとめました。
このアプリケーションをAPEXのワークスペースにインポートします。
この他にパッケージUTL_MLE_NPMの作成が必要です。

以下より、テンプレート処理を行なうMLE JavaScriptハンドラを実装します。

RESTfulサービスのページを開き、サンプル・サービスのリセットを実施します。今回はサンプル・サービスに含まれるテンプレートemployees/:idGETハンドラを、MLE JavaScriptハンドラに置き換えます。


テンプレート処理に使うSELECT文とテンプレートを保持する、表EBSJ_REGIONSを作成します。
create table ebsj_regions (
    id          number generated by default on null as identity
                constraint ebsj_regions_id_pk primary key,
    query       varchar2(400 char) not null,
    template    clob not null
);

穴埋めに使用する問合せ文は以下とします。

select * from emp

テンプレートは以下です。

<employees>{{#rows}} <employee empno="{{EMPNO}}" ename="{{ENAME}}" salary="{{SAL}}"/>{{/rows}}</employees>

この問合せ文とテンプレートを表EBSJ_REGIONSに保存します。

insert into ebsj_regions(query, template)
values(
'select * from emp',
q'~<employees>{{#rows}} <employee empno="{{EMPNO}}" ename="{{ENAME}}" salary="{{SAL}}"/>{{/rows}}</employees>~');



ハンドラ呼び出し時の引数となるIDの値を確認します。

select * from ebsj_regions

今回のID1でした。


インポートしたアプリケーションMLEを実行します。

Module NamemustacheMLE EnvLIBRARY_ENVを入力します。


ボタンAdd Es Moduleをクリックします。対話モード・レポートにmustacheが追加されます。


ボタンResolve Onceをクリックします。mustacheは他に依存しているモジュールがないため、対話モード・レポートに変化はありません。


ボタンCreate Mle Moduleをクリックし、mustacheのMLE Moduleを作成します。


ボタンAdd Importsをクリックし、MLE環境LIBRARY_ENVの作成と、作成したMLE環境にmustacheをインポートとして追加します。


以上でmustachをMLEハンドラから呼び出せるようになりました。

オブジェクト・ブラウザMLE環境からLIBRARY_ENVを開くと、MLE Moduleであるmustacheのインポート名を確認できます。


MLE Handlerを作成します。Module Nameoracle.example.hrPatternemployees/:idMethodGETになります。Source Typemle/javascriptMLE Env NameLIBRARY_ENVです。

Sourceとして以下を記述し、Define Handlerをクリックします。




RESTfulサービスを開き、テンプレートemployees/:id完全なURLを確認します。


URLの最後の:idに1を与えて、ORDSのハンドラを呼び出すとXMLの出力を確認できます。


問合せとテンプレートの組みを追加します。

insert into ebsj_regions(query, template) 
values(
    'select * from dept',
q'~<departments>{{#rows}} <department deptno="{{DEPTNO}}" dname="{{DNAME}}" loc="{{LOC}}"/>{{/rows}}</departments>~');

先ほどと同様に表EBSJ_REGIONSを検索し、IDの値を見つけます。


今回はIDは2になっていました。ORDSのハンドラの:idの値に2を与えて呼び出します。

ORDSのハンドラのコードは変更せずに、出力を表DEPTのXML形式の出力に変更できました。


今回の記事は以上になります。