2023年4月11日火曜日

DB 23cのMLEでJavaScriptモジュールを作成する

 Oracle Database 23c Freeの環境上でJavaScriptのMLEモジュールを作成し、APEXのSQLコマンドより呼び出してみます。

マニュアルの記載部分は以下になります。

JavaScript Developer's Guide
2 MLE JavaScript Modules and EnvironmentsJavaScript Developer's Guide

マニュアルに記載されている例に間違いがあるため、一部を変更しています。最初にMLEモジュール(JavaScriptモジュール)factorial_modを作成します。ファンクションfactorialがエクスポートされます。
CREATE OR REPLACE MLE MODULE factorial_mod LANGUAGE JAVASCRIPT AS

export function factorial(num) {
    if(num < 0) {
        return -1;
    } else if (num == 0) {
        return 1;
    } else {
        return(num * factorial(num-1));
    }
}
/
DDLなので、言語SQLを選択します。


作成されたMLEモジュールはオブジェクト・ブラウザMLEモジュール - JavaScriptより、参照や修正(および新規作成)が可能です。モジュールの本文はDDLに埋め込む以外に、CLOB、BLOBおよびBFILEとして指定することも可能です。


次にMLE環境を作成します。マニュアルの例を少し変更し、環境名やインポート名に小文字を使うようにしました。モジュール名またはインポート名を指定する箇所の違いが分かりやすくなると思います。
CREATE MLE ENV "myFactorialEnv" IMPORTS('factorialMod' MODULE FACTORIAL_MOD);
/
こちらもDDLなので、言語SQLを選択します。


オブジェクト・ブラウザMLE環境より、作成したMLE環境の参照と変更(および新規作成)が可能です。


MLEモジュールFACTORIAL_MODfactorialを呼び出してみます。

以下を実行します。今度はJavaScriptの実行なので、言語JavaScript(MLE)を選択します。また、モジュールのインポートを行うため環境としてmyFactorialEnvを選択します。
const { factorial } = await import('factorialMod');
console.log(factorial(3));
実行すると、結果が表示されます。


SQLコマンドから、MLEモジュールとして作成したファンクションを呼び出すことができました。

SQL Developer Web(データベース・アクション)にも、MLE JSというJavaScriptを実行するツールが含まれています。

スニペットとして全く同じコードを実行してみましたが、解析エラーが発生します。この原因は、今のところ不明です。


エクスポートしたJavaScriptのファンクションfactorialを、SQLから呼び出せるようにします。ファンクションを作成し、JavaScriptのファンクションをSIGNATUREに指定します。
CREATE OR REPLACE FUNCTION js_factorial(
    p_num number)
return number
AS MLE MODULE FACTORIAL_MOD
SIGNATURE 'factorial(number)';
/

ファンクションが作成されたら、以下のSQLを実行し作成したファンクションjs_factorialを呼び出してみます。

select js_factorial(3) from dual;


結果が出力されます。

Oracle APEXのアプリケーションに適用されるMLE環境は、アプリケーション定義セキュリティデータベース・セッションのセクションにあるMLE環境で設定します。


MLEでJavaScriptモジュールを扱う方法の紹介は以上です。

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