MLEモジュールの環境の指定
MLE環境は、データベース内のスキーマ・オブジェクトです。それらの機能と管理方法について説明します。
MLE環境はMLEモジュールを補完し、次のことを可能にします:
-
言語オプションを設定して、実行コンテキストでJavaScriptランタイムをカスタマイズします
-
インポートする特定のMLEモジュールを有効にします
-
名前解決およびインポート・チェーンを管理します
トピック
- データベースでのMLE環境の作成
SQL DDLでは、MLE環境の作成がサポートされています。 - MLE環境の削除
不要になったMLE環境は、DROP MLE ENV
コマンドを使用して削除できます。 - MLE環境の変更
既存のMLE環境は、ALTER MLE ENV
コマンドを使用して変更できます。 - MLE JavaScript環境に関連するディクショナリ・ビュー
MLE環境の詳細は、USER_MLE_ENVS
ビューおよびUSER_MLE_ENV_IMPORTS
ビューのファミリで入手できます。
親トピック: MLE JavaScriptモジュールおよび環境
データベースでのMLE環境の作成
SQL DDLでは、MLE環境の作成がサポートされています。
MLEモジュールと同様に、MLE環境はデータベース内のスキーマ・オブジェクトであり、データ・ディクショナリに保持されます。
独自のスキーマでMLE環境を作成または置換するには、少なくともCREATE MLE MODULE
権限が必要です。
関連項目:
-
MLEでJavaScriptコードを作成および実行するために必要な権限の詳細は、「MLEでのJavaScriptの操作に必要なシステム権限およびオブジェクト権限」を参照してください
-
Oracle Databaseの権限およびロールの詳細は、『Oracle Databaseセキュリティ・ガイド』を参照してください
トピック
- MLE環境の名前付け
各JavaScript環境の名前は、それが作成されるスキーマ内で一意である必要があります。完全修飾名が使用されないかぎり、現在のユーザーのスキーマが使用されます。 - 空のMLE環境の作成
DDL文CREATE MLE ENV
を使用してMLE環境を作成できます。 - 既存の環境のクローンとしての環境の作成
必要に応じて、既存の環境のポイント・イン・タイム・コピーとして新しい環境を作成できます。 - インポート解決のためのMLE環境の使用
インポート文を使用して、あるJavaScriptモジュールによってエクスポートされた機能を別のモジュールにインポートできます。 - 言語オプションの指定
MLEでは、MLE環境で言語固有のオプションを設定して、JavaScriptのランタイムをカスタマイズできます。
親トピック: MLEモジュールの環境の指定
MLE環境の名前付け
各JavaScript環境の名前は、それが作成されるスキーマ内で一意である必要があります。完全修飾名が使用されないかぎり、現在のユーザーのスキーマが使用されます。
他のスキーマ・オブジェクト識別子と同様に、二重引用符で囲まれた名前は大/小文字が区別されます。引用符で囲まれていない場合、名前は暗黙的に大文字に変換されます。
MLE環境には、MLE組込みモジュールの名前(mle-js-oracledb
、mle-js-bindings
、mle-js-plsqltypes
、mle-js-fetch
、mle-encode-base64
、mle-js-encodings
およびmle-js-plsql-ffi
)と競合するインポート・マッピングを含めることはできません。CREATE MLE ENV
DDLまたはALTER MLE ENV
DDLを使用してそのようなマッピングを追加しようとすると、操作はエラーで失敗します。
親トピック: データベースでのMLE環境の作成
空の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言語リファレンス』を参照してください
親トピック: データベースでのMLE環境の作成
既存の環境のクローンとしての環境の作成
必要に応じて、既存の環境のポイント・イン・タイム・コピーとして新しい環境を作成できます。
新しい環境は、そのソースのすべての設定を継承します。その後のソースに対する変更はクローンに伝播されません。次の文に示すようにクローンを作成できます:
CREATE MLE ENV MyEnvDuplicate CLONE MyEnv
親トピック: データベースでのMLE環境の作成
インポート解決のための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では、MLE環境で言語固有のオプションを設定して、JavaScriptのランタイムをカスタマイズできます。
MLE環境で指定されたオプションは、デフォルト設定よりも優先されます。
複数の言語オプションを'<key>=<value>'
文字列のカンマ区切りリストとして指定できます。次のスニペットは、JavaScriptの厳密モードを適用する方法を示しています。
CREATE MLE ENV MyEnvOpt
LANGUAGE OPTIONS 'js.strict=true';
環境の言語オプションに加えられた変更は、その環境を使用してすでに作成されている実行コンテキストには伝播されません。既存のコンテキストに対して変更を有効にするには、そのコンテキストを削除して再作成する必要があります。
ノート:
キー、等号および値の間に空白文字は使用できません。トピック
- JavaScript言語オプション
MLEで使用できるJavaScript言語オプションの完全なリストが含まれています。
親トピック: データベースでのMLE環境の作成
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環境の変更
既存のMLE環境は、ALTER MLE ENV
コマンドを使用して変更できます。
言語オプションとインポート句を変更できます。
トピック
- 言語オプションの変更
MLEモジュールに指定されている言語オプションを変更できます。 - モジュール・インポートの変更
MLEモジュール・インポートのコンテキストで、ALTER MLE ENV
コマンドを使用すると、追加のインポートを追加したり、既存のインポートを変更および削除できます。
親トピック: MLEモジュールの環境の指定
言語オプションの変更
MLEモジュールに指定されている言語オプションを変更できます。
次のスニペットに示すように、ALTER MLE ENV
句を使用して言語オプションを変更します:
ALTER MLE ENV MyEnvOpt
SET LANGUAGE OPTIONS 'js.strict=false';
親トピック: MLE環境の変更
モジュール・インポートの変更
MLEモジュール・インポートのコンテキストで、ALTER MLE ENV
コマンドを使用すると、追加のインポートを追加したり、既存のインポートを変更および削除できます。
環境の作成中に指定されていないインポートは、ADD IMPORTS
句を使用して既存のMLE環境に追加できます。定義したインポート名は静的であり、必要に応じて追加する前に削除する必要があります。例3-1のIMPORT_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環境の変更
MLE JavaScript環境に関連するディクショナリ・ビュー
MLE環境の詳細は、USER_MLE_ENVS
ビューおよびUSER_MLE_ENV_IMPORTS
ビューのファミリで入手できます。
USER
接頭辞に加えて、これらのビューは、すべてのネームスペース(CDB
、DBA
、ALL
およびUSER
)に存在します。
トピック
- USER_MLE_ENVS
USER_MLE_ENVS
ビューには、使用可能なすべてのMLE環境が定義済の言語オプションとともにリスト表示されます。 - USER_MLE_ENV_IMPORTS
ビューの[USER | ALL | DBA | CDB]_MLE_ENV_IMPORTS
ファミリには、インポートされたモジュールがリスト表示されます。
親トピック: MLEモジュールの環境の指定
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_NAME
、MODULE_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