データベースでのJavaScriptモジュールの管理

必要な権限がある場合は、SQLでMLEモジュールをスキーマ・オブジェクトとして作成できます。

独自のスキーマでMLEモジュールを作成または置換するには、少なくともCREATE MLE MODULE権限が必要です。また、ターゲットのJavaScript言語オブジェクトに対する実行権限も必要です。

関連項目:

  • MLE固有の権限の詳細は、「MLEでのJavaScriptの操作に必要なシステム権限およびオブジェクト権限」を参照してください

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

トピック

JavaScriptモジュールの名前付け

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

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

一意の名前を選択する場合、MLEオブジェクトは、表、ビュー、マテリアライズド・ビュー、順序、プライベート・シノニム、PL/SQLパッケージ、ファンクション、プロシージャおよびキャッシュ・グループとネームスペースを共有することに注意してください。

データベースでのJavaScriptモジュールの作成

JavaScriptモジュールは、CREATE MLE MODULE DDL文を使用して、MLEモジュールの名前とソース・コードを指定してデータベースに作成されます。

MLEモジュールが作成されるとすぐに、データベース・ディクショナリに保持されます。これは、DBMS_MLEを使用したJavaScriptコードの動的実行と比較した場合の違いの1つです。

指定された名前のMLEモジュールがすでに存在する場合、CREATE MLE MODULE (OR REPLACE句なし)はエラーをスローします。CREATE OR REPLACE MLE MODULEでは、既存のモジュールが存在する場合は置換され、存在しない場合は新しいモジュールが作成されます。MLEモジュールが置換される場合、そのモジュールに対する権限を再付与する必要はありません。

PL/SQLの知識のある方は、これがPL/SQLプログラム・ユニットの動作とまったく同じであることに注意してください。

モジュール名がすでに使用されている場合に既存のモジュールを置換しない場合は、CREATE OR REPLACEではなくIF NOT EXISTS句を使用できます。このバリエーションの構文を例3-1に示します。IF NOT EXISTS句とOR REPLACE句は相互に排他的です。

関連項目:

例3-1 データベースでのJavaScriptモジュールの作成

この例は、MLEモジュールの作成および単純なJavaScriptファンクションのエクスポートを示しています。

CREATE MLE MODULE IF NOT EXISTS po_module LANGUAGE JAVASCRIPT AS

/**
* get the value of all line items in an order
* @param {array} lineItems - all the line items in a purchase order
* @returns {number} the total value of all line items in a purchase order
*/
export function orderValue(lineItems) {
    
    return lineItems
        .map( x => x.Part.UnitPrice * x.Quantity )
        .reduce( 
            (accumulator, currentValue) => accumulator + currentValue, 0
        );
}
/

このコード・ブロックの最初の行は、JavaScriptモジュール名をpo_moduleとして指定しています。残りの行は、実際のJavaScriptコードを定義します。ECMAScript標準に従い、exportキーワードは、モジュールの潜在的なコール元にエクスポートされるファンクションを示すことに注意してください。MLEは、ECMAScript 2023標準に準拠したコードを受け入れます。

シングルバイト文字セットの使用によるデータベースでのJavaScriptコードの格納

文字セット標準と、MLEでシングルバイト文字セットを使用する際の注意事項。

JavaScriptはUnicodeでエンコードされます。Unicode規格は、世界中で話されているほとんどの言語のあらゆる文字を定義する文字コード・システムです。これは、他の文字セット・エンコーディングの制限事項を克服するために開発されました。

データベースの作成には、AL32UTF8文字セットを使用することをお薦めします。データベースでAL32UTF8文字セットを使用すると、最新バージョンのUnicode標準が確実に使用され、文字セット変換エラーの可能性が最小限に抑えられます。

データベースで依然としてUS7ASCII、WE8ISO8859-n、WE8MSWIN1252などのシングルバイト文字セットが使用されている場合は、MLE JavaScriptコードでUnicode機能を使用しないように注意する必要があります。このことは、そのようなデータベースで他のタイプの入力データを処理する場合と変わりありません。

関連項目:

Unicode標準の詳細は、Oracle AI Databaseグローバリゼーション・サポート・ガイドを参照してください

コード分析

MLEモジュールの作成時にはJavaScript構文エラーにフラグが付けられますが、それでも、CREATE MLE MODULEコマンドを実行する前に任意のlintツールを使用して分析を実行してください。

MLEモジュールをデータベースに作成する場合は、他のJavaScriptプロジェクトを制御するのと同じ方法で、十分に確立されたツールチェーンを使用する必要があります。この意味では、CREATE MLE MODULEのコールは、サーバー・アプリケーションのデプロイと同様に、デプロイメント・ステップとみなすことができます。コード・チェックは、デプロイする前に、継続的インテグレーション/継続的デプロイメント(CI/CD)パイプラインなどによって、ビルド・ステップの間に実行する必要があります。

JavaScriptコードに構文エラーを含むCREATE MLE MODULEを使用してモジュールを作成すると、そのモジュールは作成されますが、無効な状態になります。これは、インライン・コール仕様を使用して作成されたファンクションにも適用されます。ただし、このチェックはモジュール内で呼び出されたSQL文には適用されないため、別のテストも実行して、コードが想定どおりに機能することを確認する必要があります。

コードをソース・コード・リポジトリにチェックインする前に、linterと呼ばれるツールでコードを処理することは、業界のベスト・プラクティスとみなされています。他の開発プロジェクトと同様に、自分自身とチームにとって最適なオプションを自由に選択できます。考えられるオプションには、ESLint、JSHint、JSLint、および静的コード分析を実行して構文エラー、バグ、その他の問題のあるコードにフラグを付けるものがあります。また、これらを使用して特定のコーディング・スタイルを適用することもできます。多くの統合開発環境(IDE)では組込み機能としてlintが提供され、ファイルがディスクに保存されるとすぐにこのツールを起動して、問題にフラグを付けます。

lintの動的実行に加えて、高度に自動化されたDevOps環境を使用してコード分析を自動化し、ビルド・パイプラインの一部としてlintを起動できます。通常、このステップは、JavaScriptモジュールをデータベースに送信する前に発生します。

この目的は、実行時に問題が発生する前に、できるだけ多くの潜在的な問題を検出することです。ユニット・テストはこれらのリスクをさらに軽減するために役立ち、開発プロセスへのユニット・テストの組込みは業界のベスト・プラクティスになっています。どの方法を選択しても、JavaScriptモジュールをデータベースに送信する前に、コード分析ステップが発生します。