MLEモジュールの環境の指定

MLE環境は、データベース内のスキーマ・オブジェクトです。それらの機能と管理方法について説明します。

MLE環境はMLEモジュールを補完し、次のことを可能にします:

  • 言語オプションを設定して、実行コンテキストでJavaScriptランタイムをカスタマイズします

  • インポートする特定のMLEモジュールを有効にします

  • 名前解決およびインポート・チェーンを管理します

トピック

データベースでのMLE環境の作成

SQL DDLでは、MLE環境の作成がサポートされています。

MLEモジュールと同様に、MLE環境はデータベース内のスキーマ・オブジェクトであり、データ・ディクショナリに保持されます。

独自のスキーマでMLE環境を作成または置換するには、少なくともCREATE MLE MODULE権限が必要です。

関連項目:

  • MLEでJavaScriptコードを作成および実行するために必要な権限の詳細は、「MLEでのJavaScriptの操作に必要なシステム権限およびオブジェクト権限」を参照してください

  • Oracle Databaseの権限およびロールの詳細は、『Oracle Databaseセキュリティ・ガイド』を参照してください

トピック

MLE環境の名前付け

各JavaScript環境の名前は、それが作成されるスキーマ内で一意である必要があります。完全修飾名が使用されないかぎり、現在のユーザーのスキーマが使用されます。

他のスキーマ・オブジェクト識別子と同様に、二重引用符で囲まれた名前は大/小文字が区別されます。引用符で囲まれていない場合、名前は暗黙的に大文字に変換されます。

MLE環境には、MLE組込みモジュールの名前(mle-js-oracledbmle-js-bindingsmle-js-plsqltypesmle-js-fetchmle-encode-base64mle-js-encodingsおよびmle-js-plsql-ffi)と競合するインポート・マッピングを含めることはできません。CREATE MLE ENV DDLまたはALTER MLE ENV DDLを使用してそのようなマッピングを追加しようとすると、操作はエラーで失敗します。

空のMLE環境の作成

DDL文CREATE MLE ENVを使用してMLE環境を作成できます。

最も基本的な形式では、次のスニペットに示すように空の環境を作成できます:

CREATE MLE ENV myEnv;

それ以降のALTER MLE ENVのコールを使用して、環境にプロパティを追加できます。

MLEモジュールと同様に、OR REPLACE句を追加して、エラーをスローするのではなく、既存のMLE環境を置き換えるようにデータベースに指示できます。

また、OR REPLACE句のかわりにIF NOT EXISTS句を使用して、同じ名前の環境がすでに存在する場合に、新しいMLE環境が作成されないようにすることもできます。この場合、環境の作成に使用される文は、次のように変更されます:

CREATE MLE ENV IF NOT EXISTS myEnv;

ノート:

IF NOT EXISTS句とOR REPLACE句は相互に排他的です。

オプションで、PUREキーワードを含めて、環境を使用するJavaScriptコードが、データベース状態へのアクセスを許可しない制限された実行コンテキストで実行されるように指定できます。PUREでの実行では、サード・パーティのJavaScriptライブラリなどの特定のコードをデータベースから分離することで、追加のセキュリティ・レイヤーが提供されます。PUREキーワードを使用して作成された環境は、MLEモジュールで参照したり、動的実行にDBMS_MLEを使用する場合に参照できます。PUREキーワードは次のように指定できます:

CREATE OR REPLACE MLE ENV my_pure_env PURE;

関連項目:

既存の環境の編集の詳細は、「MLE環境の変更」を参照してください

PUREキーワードおよび制限されたコンテキストの詳細は、「制限された実行コンテキストについて」を参照してください。

CREATE MLE ENVの完全な構文は、『Oracle Database SQL言語リファレンス』を参照してください

既存の環境のクローンとしての環境の作成

必要に応じて、既存の環境のポイント・イン・タイム・コピーとして新しい環境を作成できます。

新しい環境は、そのソースのすべての設定を継承します。その後のソースに対する変更はクローンに伝播されません。次の文に示すようにクローンを作成できます:

CREATE MLE ENV MyEnvDuplicate CLONE MyEnv

インポート解決のためのMLE環境の使用

インポート文を使用して、あるJavaScriptモジュールによってエクスポートされた機能を別のモジュールにインポートできます。

コードの分離により、変更をより細かく制御し、より再利用可能なコードを記述できます。コードの保守が簡素化されることも、このアプローチのプラスの効果です。

exportキーワードでマークされた識別子のみがインポートの対象となります。

データベースに格納されている他のモジュールから機能をインポートしようとするモジュールには、名前解決を実行するためにMLE環境が必要です。その情報を使用してMLE環境を作成するには、IMPORTS句を使用する必要があります。例3-14は、識別子po_moduleとJavaScriptモジュールPO_MODULE (例3-1で作成)の間のマッピングの作成方法を示しています。

複数のインポートをカンマ区切りリストとして指定できます。例3-14の一重引用符で囲まれた最初のパラメータは、インポート名と呼ばれます。インポート名は、別のモジュールのインポート文で使用されます。この場合、'po_module'はインポート名で、同じ名前のモジュールを参照します。

ノート:

インポート名はモジュール名と一致する必要はありません。任意の有効なJavaScript識別子を使用できます。インポート名が参照先のモジュール名と一致するほど、2つの間のリンクを識別しやすくなります。

IMPORTS句で参照されているモジュールが存在しないか、ユーザーがアクセスできない場合、CREATE MLE ENVコマンドは失敗します。

組込みJavaScriptモジュールは、追加のMLE環境を指定することなく直接インポートできます。

関連項目:

組込みモジュールの詳細は、「組込みのJavaScriptモジュールの概要」

例3-14 JavaScriptモジュールへの識別子のマップ


CREATE OR REPLACE MLE ENV 
    po_env
IMPORTS (
    'po_module' MODULE PO_MODULE
);

例3-15 モジュール機能のインポート


CREATE OR REPLACE MLE MODULE import_example_module
LANGUAGE JAVASCRIPT AS
 
import * as po from "po_module";
/**
* use po_module's getValue() function to calculate the value of
* a purchase order. In later chapters, when discussing the MLE
* JavaScript SQL driver the hard-coded value used as the PO will
* be replaced by calls to the database
* @returns {number} the value of all line items in the purchase order
*/
export function purchaseOrderValue() {
 
    const purchaseOrder = {
        "PONumber": 1600,
        "Reference": "ABULL-20140421",
        "Requestor": "Alexis Bull",
        "User": "ABULL",
        "CostCenter": "A50",
        "ShippingInstructions": {
            "name": "Alexis Bull",
            "Address": {
                "street": "200 Sporting Green",
                "city": "South San Francisco",
                "state": "CA",
                "zipCode": 99236,
                "country": "United States of America"
            },
            "Phone": [
                {
                    "type": "Office",
                    "number": "909-555-7307"
                },
                {
                    "type": "Mobile",
                    "number": "415-555-1234"
                }
            ]
        },
        "Special Instructions": null,
        "AllowPartialShipment": true,
        "LineItems": [
            {
                "ItemNumber": 1,
                "Part": {
                    "Description": "One Magic Christmas",
                    "UnitPrice": 19.95,
                    "UPCCode": 13131092899
                },
                "Quantity": 9.0
            },
            {
                "ItemNumber": 2,
                "Part": {
                    "Description": "Lethal Weapon",
                    "UnitPrice": 19.95,
                    "UPCCode": 85391628927
                },
                "Quantity": 5.0
            }
        ]
    };
 
    return po.orderValue(purchaseOrder.LineItems);
}
/
次のコール仕様では、purchaseOrderValueファンクションをコールできます:

CREATE FUNCTION purchase_order_value
RETURN NUMBER AS
MLE MODULE import_example_module
ENV po_env
SIGNATURE 'purchaseOrderValue';
/

SELECT purchase_order_value;
/

結果:


PURCHASE_ORDER_VALUE
--------------------
               279.3

言語オプションの指定

MLEでは、MLE環境で言語固有のオプションを設定して、JavaScriptのランタイムをカスタマイズできます。

MLE環境で指定されたオプションは、デフォルト設定よりも優先されます。

複数の言語オプションを'<key>=<value>'文字列のカンマ区切りリストとして指定できます。次のスニペットは、JavaScriptの厳密モードを適用する方法を示しています。

CREATE MLE ENV MyEnvOpt
    LANGUAGE OPTIONS 'js.strict=true';

環境の言語オプションに加えられた変更は、その環境を使用してすでに作成されている実行コンテキストには伝播されません。既存のコンテキストに対して変更を有効にするには、そのコンテキストを削除して再作成する必要があります。

ノート:

キー、等号および値の間に空白文字は使用できません。

トピック

JavaScript言語オプション

MLEで使用できるJavaScript言語オプションの完全なリストが含まれています。

表3-1 JavaScript言語オプション

言語オプション 受け入れられる値の型 デフォルト 説明
js.strict ブール false 厳密モードを適用します。
js.console ブール true consoleグローバル・プロパティを指定します。
js.polyglot-builtin ブール true Polyglotグローバル・プロパティを指定します。

MLE環境の削除

不要になったMLE環境は、DROP MLE ENVコマンドを使用して削除できます。

次のスニペットは、MLEモジュールを削除する基本的な例を示しています:

DROP MLE ENV myOldEnv;

MLEモジュールと同様に、IF EXISTS句は、次のスニペットに示すように、指定されたMLE環境が存在しない場合のエラーを防ぎます:

DROP MLE ENV IF EXISTS myOldEnv;

MLE環境の変更

既存のMLE環境は、ALTER MLE ENVコマンドを使用して変更できます。

言語オプションとインポート句を変更できます。

トピック

言語オプションの変更

MLEモジュールに指定されている言語オプションを変更できます。

次のスニペットに示すように、ALTER MLE ENV句を使用して言語オプションを変更します:

ALTER MLE ENV MyEnvOpt
    SET LANGUAGE OPTIONS 'js.strict=false';

モジュール・インポートの変更

MLEモジュール・インポートのコンテキストで、ALTER MLE ENVコマンドを使用すると、追加のインポートを追加したり、既存のインポートを変更および削除できます。

環境の作成中に指定されていないインポートは、ADD IMPORTS句を使用して既存のMLE環境に追加できます。定義したインポート名は静的であり、必要に応じて追加する前に削除する必要があります。例3-1IMPORT_EXAMPLE_MODULEをモジュール名IMPORT_EXAMPLE_MODULE_V2に置き換えるために新しいCREATE MLE DDLを実行したとすると、次の文が正常に実行されるとします:


ALTER MLE ENV po_env 
ADD IMPORTS (
    'import_example' MODULE IMPORT_EXAMPLE_MODULE_V2
);

不要になったインポートは、DROP IMPORTS句を使用して削除できます:

ALTER MLE ENV po_env DROP IMPORTS('import_example');

インポート識別子の大/小文字は、データ・ディクショナリのUSER_MLE_ENV_IMPORTSビューのものと一致する必要があります。

MLE JavaScript環境に関連するディクショナリ・ビュー

MLE環境の詳細は、USER_MLE_ENVSビューおよびUSER_MLE_ENV_IMPORTSビューのファミリで入手できます。

USER接頭辞に加えて、これらのビューは、すべてのネームスペース(CDBDBAALLおよびUSER)に存在します。

トピック

USER_MLE_ENVS

USER_MLE_ENVSビューには、使用可能なすべてのMLE環境が定義済の言語オプションとともにリスト表示されます。

*_MLE_ENVSの詳細は、『Oracle Databaseリファレンス』を参照してください。

例3-16 USER_MLE_ENVSを使用した使用可能なMLE環境のリスト表示

SELECT ENV_NAME, LANGUAGE_OPTIONS
FROM USER_MLE_ENVS
WHERE ENV_NAME='MYENVOPT'
/

SQL*Plus出力の例:

ENV_OWNER            ENV_NAME   LANGUAGE_OPTIONS
-------------------- ---------- ----------------------
JSDEV01              MYENVOPT   js.strict=true

USER_MLE_ENV_IMPORTS

ビューの[USER | ALL | DBA | CDB]_MLE_ENV_IMPORTSファミリには、インポートされたモジュールがリスト表示されます。

MLE環境は、インポートされたモジュールの名前を解決するための主要なイネーブラです。例3-17は、USER_MLE_ENV_IMPORTSに対する、IMPORT_NAMEMODULE_OWNERおよびMODULE_NAMEをリスト表示する問合せを示しています。

*_MLE_ENV_IMPORTSの詳細は、『Oracle Databaseリファレンス』を参照してください

例3-17 USER_MLE_ENV_IMPORTSを使用したモジュール・インポート情報のリスト表示

SELECT IMPORT_NAME, MODULE_OWNER, MODULE_NAME
    FROM USER_MLE_ENV_IMPORTS
    WHERE ENV_NAME='MYFACTORIALENV';
/

SQL*Plus出力:

IMPORT_NAME            MODULE_OWNER              MODULE_NAME
---------------------- ------------------------- ------------------
FACTORIAL_MOD          DEVELOPER1                FACTORIAL_MOD