Oracle Database 23aiではMultilingual Engine(以下MLE)のJavaScriptに関する機能が大幅に強化されています。
23aiでは一度実装したコードをスキーマ・オブジェクトとして保存し、任意のタイミングで呼び出したり、他のコードへimportできるようになっています。
以前投稿したこちらの記事ではいきなりMLEの応用的な新機能を紹介してしまいましたが、改めて基本要素を本記事にまとめておこうと思います。
なお以下は23aiマニュアル(Free - Developer Release版)の参考資料です。
- Creating JavaScript Modules in the Database
- Preparing JavaScript code for MLE Module Calls
- Overview of Importing MLE JavaScript Modules
事前準備
MLE JavaScriptを利用するには対象のDBユーザに対して以下の権限を付与する必要があります。
-- JavaScriptをOracle Database上で実行するための権限
GRANT EXECUTE ON JAVASCRIPT TO <ユーザ名>;
-- MLE ModuleやMLE Environmentを作成するための権限
GRANT CREATE MLE TO <ユーザ名>;
-- MLE Moduleの呼び出しに使うPL/SQLプロシージャの作成権限
GRANT CREATE PROCEDURE TO <ユーザ名>;
-- JavaScript実行後デバッグ機能の利用に必要な権限
GRANT COLLECT DEBUG INFO ON <module> TO <ユーザ名>;
MLE JavaScript実装の基本
MLE JavaScriptをオブジェクトとして保存し、再利用できるようにするには、以下3つのオブジェクトを作成する必要があります。
- MLE Module:
- メインのJavaScriptのコードを格納
- MLE Environment:
- MLE Moduleを実行する際に必要となる他MLE Moduleのimportや、Strictモードなどのパラメータを指定
- MLE Module Call:
- MLE Moduleを呼び出すためのプロシージャ
今回は例として、入力された値の階乗を計算する処理をMLE JavaScriptで実装してみます。
まずはメインとなる階乗の計算をするMLE Moduleが以下になります。
CREATE MLE MODULE IF NOT EXISTS 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 ) );
}
}
/
次に、MLE Module「factorial_mod」を他のMLE Moduleでimportして使えるよう、MLE Environmentを作成します。
-- IMPORTS('<別のMLE Moduleでimport時に指定する別名>', MODULE <import対象のMLE Module名>)
CREATE MLE ENV my_factorial_env IMPORTS('FACTORIAL_MOD' MODULE FACTORIAL_MOD)
/
さらに factorial_mod をimportするMLE Moduleを作成します。
CREATE OR REPLACE MLE MODULE mod_imp_fact LANGUAGE JAVASCRIPT AS
import * as h from "FACTORIAL_MOD"
export function printAnswer(num){
let ans = h.factorial(num);
console.log(`The factorial of ${num} is: ${ans}`);
}
/
JavaScriptパートのimportでは、MLE Environment「my_factorial_env」で設定したimport時の別名を指定しています。
今回はMLE Module名と同名になっています。
最後にMLE Module「mod_imp_fact」を実行するためのMLE Module Call(プロシージャ)を作成します。
CREATE OR REPLACE PROCEDURE mod_imp_fact_proc(num NUMBER)
AS MLE MODULE mod_imp_fact
ENV my_factorial_env
SIGNATURE 'printAnswer(number)';
/
PROCEDURE句に実行時に利用するプロシージャ名を、ENV句には今回利用するMLE Environmentを指定します。
AS MLE Module句には実行するMLE Module名を指定します。
またSIGNATURE句には呼び出すJavaScriptの関数を指定します。
では作成したMLE Module Callを実行してみます。
SQL> set serveroutput on
SQL> EXEC mod_imp_fact_proc(3);
The factorial of 3 is: 6
PL/SQLプロシージャが正常に完了しました。
以上がMLE JavaScriptの基本的な使い方になります。