※ 本記事は、Martin Bachによる”Introduction to JavaScript in Oracle Database 23c Free – Developer Release“を翻訳したものです。

2023年4月14日


Oracle Database 23c Free – Developer Releaseは、次世代のOracle Databaseの最初のリリースです。これにより、開発者は、最新のデータドリブン・アプリケーションの開発を簡素化する革新的な23cの機能により、アプリケーションの構築をすぐに開始できます。Oracle Database 23cの機能セット全体は、今後12か月以内に一般提供する予定です。

 

Oracle Database用アプリケーションの開発: クライアントおよびサーバー

Oracle Databaseは、プログラミング言語のサポートが充実していることで有名です。Oracleデータベースでは、多くのクライアント側開発言語のサポートに加えて、非常に長い期間サーバー側プログラムがサポートされています。これらは「ストアド・プロシージャ」と呼ばれることもありますが、この名称ではこの機能が評価されることはないでしょう。「プロシージャ」を記述すること以外に、データを操作するための他の多くの可能性が存在します。

Oracleデータベースに対する最も一般的なプログラム的なサーバー側インタフェースは、PL/SQLです。PL/SQLを使用すると、ビジネス・ロジックとデータをまとめて保持できるため、多くの場合、パフォーマンスと効率が大幅に向上します。開発者は、使用中のクライアント・インタフェースに関係なく、データの統合処理パターンを利用することもできます。最後に、アプリケーションへのプログラマティック・インターフェースを使用することで、フロントエンドとバックエンドを切り離すことができ、最新のアプリケーション開発技術にとって非常に重要です。

PL/SQLに加えて、データベースのJavaプログラミング言語を使用してストアド・プロシージャを作成できます。さらに多くの言語が外部プロシージャを介してサポートされます。それがOracle 21cのリリース前の状況でした。

Oracle Database 21cのJavaScriptの概要

Oracle 21c for Linux x86-64では、は、サーバー側開発用の別の言語であるJavaScriptを追加しました。JavaScriptは、現在最も人気のあるプログラミング言語の1つです。インタラクティブなWebページのためのブラウザベースのソリューションとして誕生して以来、長い道のりを歩んできました。フロントエンド開発の人気は依然として強固ですが、バックエンド開発への道筋もありました。たとえば、node.jsdenoプロジェクトは、その分野で非常に人気があります。

JavaScriptのサポートにより、コンバージド・データベースに関するOracleの強いメッセージがさらに強化されます。コンバージド・データベースは、マルチモデル、マルチテナント、マルチワークロードのデータベースです。各開発チームが求めるデータ・モデルとアクセス方法を容易にサポートし、開発プロセスを簡素化します。JavaScript言語はこの概念にぴったりです。内部では、JavaScriptエンジンは、高パフォーマンスで複数のプログラミング言語を実行できる多言語ランタイムであるGraalVMに基づいています。Oracle 21c以降でJavaScriptエンジンにパワーを供給するコンポーネントは、Multilingual Engine(MLE)と呼ばれます。

Oracleリリース21cは、JavaScriptスニペットの動的な実行と、Oracleのローコード・アプリケーション・フレームワークであるApplication Express(APEX)への統合に重点を置いています。DBMS_MLEパッケージを使用すると、開発者は、Linux x86-64に対して、オンプレミスおよびクラウドの両方で、JavaScriptで記述されたコード・スニペットをデータベース内で実行できます。

Oracle Database 23c Free – Developer Releaseの拡張JavaScriptサポート

Linux x86-64でOracle Database 23c Free – Developer Releaseを利用すると、開発者に多くの新機能が提供されます。OracleデータベースのJavaScriptのコンテキストでは、次の2つの概念が導入されています。:

  • JavaScriptモジュールおよび環境
  • インラインJavaScriptプロシージャ

次のセクションでは、これらについて詳しく説明します。

JavaScriptモジュールおよび環境

これらはスキーマ・オブジェクトとして格納され、Character Large Objects(CLOB)またはファイル・システムに格納されているBFILEに基づいて、モジュール・ヘッダーを使用してインラインで作成できます。次の例は、宣言とともにインラインで提供される実際のJavaScriptコードを使用してMLE JavaScriptモジュールを作成する方法を示しています。:

create mle module if not exists example_module 
language javascript as 

/**
 * convert a delimited string into key-value pairs and return JSON
 * @param {string} inputString - the input string to be converted
 * @returns {JSON}
 */
function string2obj(inputString) {
    if ( inputString === undefined ) {
        throw `must provide a string in the form of key1=value1;...;keyN=valueN`;
    }

    let myObject = {};
    if ( inputString.length === 0 ) {
        return myObject;
    }

    const kvPairs = inputString.split(";");
    kvPairs.forEach( pair => {
        const tuple = pair.split("=");
        if ( tuple.length === 1 ) {
            tuple[1] = false;
        } else if ( tuple.length != 2 ) {
            throw "parse error: you need to use exactly one '=' between key and value and not use '=' in either key or value";
        }
        myObject[tuple[0]] = tuple[1];
    });

    return myObject;
}

/**
 * Perform a simple string concatenation
 * @param {string} str1 - the first input string
 * @param {string} str2 - the second input string
 * @returns {string}
 */
function concat(str1, str2) {

    return str1 + str2;
}

export { string2obj, concat }
/

クライアント側のnode.js開発と同様に、モジュールは他のモジュールをインポートすることができ、分割統治が可能なプログラミングモデルとなっています。また、MLEランタイムによって規定されたルールに従っていれば、コミュニティが作成した巨大なエコシステムを活用して、既存のJavaScriptモジュールを使用することもできます。

Oracle Database 23c FreeのJavaScript – Developer ReleaseはECMAScript 2022に基づいており、エクスポートおよびインポート機能はexportおよびimportのキーワードに基づいています。モジュールが存在するファイルシステムがないため、MLE環境という名前の新しいヘルパーエンティティーが導入されます。これらのMLE環境は、Oracle Database 23c Free – Developer Releaseの2番目の主要な新しいイノベーションであり、MLEモジュールと同様にスキーマ・オブジェクトです。MLE環境では、モジュールを指すimportキーワードで使用されるインポート名を定義します。MLE環境やMLEモジュール間の依存関係については、この紹介の範囲外であり、今後の記事で広く取り上げる予定です。詳細は、新しい『Database JavaScript Developer’s Guide』の第2章を参照してください。

SQLおよびPL/SQLからもJavaScriptコードをコールできます。JavaScript固有のコール仕様は、MLEモジュールからエクスポートされた関数を公開します。次に例を示します。:

create function if not exists string_to_JSON_module_example(
    p_str varchar2
) return JSON
as mle module example_module 
signature 'string2obj(string)';
/

JavaScriptコードを起動する各PL/SQLファンクションまたはプロシージャは、モジュールおよび(JavaScript)ファンクションを、PL/SQL引数リスト内の正しいパラメータ数およびsignature句を使用したマップされたJavaScriptファンクションの両方とともに参照する必要があります。すべての要件を満たすと、PL/SQLモジュール・コールを介してJavaScriptコードを実行できます。:

select 
    json_serialize(
        string_to_JSON_module_example('a=1;b=2;c=3;d')
        PRETTY
    ) as result;

RESULT
--------------------

{
  "a" : "1",
  "b" : "2",
  "c" : "3",
  "d" : false
}

インラインJavaScriptのファンクションおよびプロシージャ

JavaScriptファンクションのみが必要な場合、モジュールのかわりにインラインJavaScriptプロシージャを使用できます。前の例は、次のようにインライン関数として書き換えることができます。

create function if not exists string_to_JSON_inline_example(
    "inputString" varchar2
) return JSON
as mle language javascript 
q'~
    if ( inputString === undefined ) {
        throw `must provide a string in the form of key1=value1;...;keyN=valueN`;
    }

    let myObject = {};
    if ( inputString.length === 0 ) {
        return myObject;
    }

    const kvPairs = inputString.split(";");
    kvPairs.forEach( pair => {
        const tuple = pair.split("=");
        if ( tuple.length === 1 ) {
            tuple[1] = false;
        } else if ( tuple.length != 2 ) {
            throw "parse error: you need to use exactly one '=' between key and value and not use '=' in either key or value";
        }
        myObject[tuple[0]] = tuple[1];
    });

    return myObject;
~';
/

インラインJavaScript関数は利便性が高い分、機能は多少犠牲になりますが、多くの場合、そのトレードオフは無視できるものです。前述のリストのファンクションは、PL/SQLファンクションのように実行でき、生産性が向上します。

Oracle Database 23c Free – Developer ReleaseのJavaScriptを使用するための前提条件

この投稿の例を実行する前に、次の前提条件を満たしていることを確認してください。:

  • 互換性のある初期化パラメータが23.0.0以上に設定されていることを確認
  • 新しい初期化パラメータ multilingual_engineenable に設定
  • 次のシステム権限をユーザーに付与:
    • create mle
    • create procedure
    • creating tables, indexesなどのその他の権限 db_developer_role は役立つ可能性があります
  • execute on javascript オブジェクト権限をユーザーに付与
  • プラットフォームはLinux x86-64

詳細情報

『Oracle Database 23c Free – Developer Release』のドキュメント・セットの一部である『JavaScript Developer’s Guide』では、JavaScript開発について詳細に説明しています。詳細は本を参照してください。このブログでは、OracleデータベースのJavaScriptに関する記事を随時追加していきますので、どうぞご期待ください。

フィードバック

あなたの意見を聞かせてください! 予期しないことが見つかった場合、または単に経験を共有したい場合は、https://forums.oracle.com/ords/apexds/domain/dev-community/category/oracle-database-free のフォーラムを使用してチームに連絡してください

まとめ

Oracle Database 23c Free – Developer Release on Linux x86-64で提供されるJavaScript実装は、PL/SQLやJavaに代わる一般的な言語を開発者に提供し、サーバー側コードを記述するための優れたステップです。MLE ModulesおよびEnvironmentsは、21cで初期リリースされた既存の機能セットを補完します。これらの使用は、インラインJavaScript関数およびプロシージャを使用して、特別な場合に簡略化されます。さらに詳しいブログ投稿は、今後数週間でリリースする予定です。

待てない方は、JavaScript開発者ガイドを参照してください。お楽しみください!