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

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

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

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

関連項目:

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

  • Oracle AI Databaseの権限およびロールの詳細は、『Oracle AI 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 AI 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グローバル・プロパティを指定します。