MLEモジュールのコール仕様の作成

MLEコール仕様の作成では、汎用的なCREATE FUNCTION RETURNS ASまたはCREATE PROCEDURE AS構文に続けて、MLE固有の構文を使用します。

例6-1 MLEコール仕様の作成

この例では、2つのファンクションをエクスポートするMLEモジュールの作成と、それらのファンクションを公開するためのコール仕様の作成について順を追って説明します。

CREATE OR REPLACE MLE MODULE jsmodule
LANGUAGE JAVASCRIPT AS

    export function greet(str){
        console.log(`Hello, ${str}`);
    }
    export function concat(str1, str2){
        return str1 + str2;
    }
/

MLEモジュールjsmoduleは、2つのファンクションをエクスポートします。ファンクションgreet()は1つの入力文字列引数を使用して簡単な挨拶を出力し、ファンクションconcat()は2つの文字列を入力として使用して連結された文字列を結果として戻します。

greet()は値を戻さないため、次のようにPL/SQLプロシージャを作成してそれを公開する必要があります。

CREATE OR REPLACE PROCEDURE
    GREET(str in VARCHAR2)
    AS MLE MODULE jsmodule
    SIGNATURE 'greet(string)';
/

前述のコール仕様は、GREET()という名前のPL/SQLプロシージャを現行のユーザーのスキーマ内に作成します。このプロシージャを実行すると、JavaScriptモジュールjsmodule内のエクスポートされたファンクションgreet()が実行されます。

コール仕様は、公開するファンクション(greet)と同じ名前(GREET)である必要はありません。

MLE固有の句MLE MODULE <module name>では、コールされるJavaScriptファンクションをエクスポートするJavaScript MLEモジュールを指定します。

SIGNATURE句では、コールされる、エクスポートされるファンクションの名前(この場合はgreet)に加えて、オプションで引数の型のリストをカッコで囲んで指定します。JavaScript MLEファンクションは、SIGNATURE句でTypeScript型を使用します。この例では、ファンクションはJavaScript文字列を受け入れます。PL/SQLのVARCHAR2文字列は、基礎となるJavaScript実装を起動する前にJavaScript文字列に変換されます。SIGNATURE句では、引数の型のリストを省略することもでき、その場合、MLEファンクション名のみが必要となり、MLE言語型はコール仕様の引数リストで指定された型から推測されます。

エクスポートされるもう一方のファンクションconcat()も同様に使用して、PL/SQLファンクションを作成できます:

CREATE OR REPLACE FUNCTION CONCATENATE(str1 in VARCHAR2, str2 in VARCHAR2)
    RETURN VARCHAR2
    AS MLE MODULE jsmodule
    SIGNATURE 'concat(string, string)';
/

この場合のコール仕様ではさらに、作成されるファンクションのPL/SQL戻り型を指定します。JavaScriptファンクションconcat()によって戻される値(文字列型)は、VARCHAR2型に変換されます。

作成されたプロシージャとファンクションは、次に示すようにコールできます(結果も示されています):

SQL> CALL GREET('Peter');
Hello, Peter

Call completed.

SQL> SELECT CONCATENATE('Hello, ','World!');

CONCATENATE('HELLO','WORLD!')
-------------------------------------------------
Hello, World!

トピック

MLEコール仕様のコンポーネント

MLEコール仕様の要素を説明とともに示します。

図6-1 MLEコール仕様の構文



表6-1 MLEコール仕様のコンポーネント

要素名 説明
OR REPLACE ファンクションがすでに存在する場合は置き換えることを指定します。この句を使用すると、既存のファンクションに以前に付与されたオブジェクト権限を削除、再作成および再付与することなしに、そのファンクションの定義を変更できます。再作成されたファンクションまたはプロシージャに対する権限を以前に付与されていたユーザーは、権限を再付与されなくても、そのファンクションに引き続きアクセスできます。
IF NOT EXISTS

ファンクションが存在しない場合は作成することを指定します。同じ名前のファンクションが存在する場合、文はエラーなしで無視され、元のファンクション本体は変更されません。SQL*Plusでは、コマンドが無視されるか実行されるかに関係なく、同じ出力メッセージが表示され、DDLスクリプトのべき等性が確保されています。

IF NOT EXISTSは、OR REPLACEと組み合せて使用することはできません。

schema コール仕様を含めるスキーマを指定します。スキーマを省略した場合は、現行のユーザーのスキーマ内にコール仕様が作成されます。
call_spec_name 作成するコール仕様の名前を指定します。コール仕様は、専用のネームスペースを使用するMLEモジュールおよび環境とは異なり、デフォルトのネームスペースに作成されます。
param_declaration コール仕様のパラメータを指定します。パラメータを指定しない場合は、カッコを省略する必要があります。
RETURN datatype ファンクションにのみ使用され、ファンクションの戻り値のデータ型を指定します。戻り値には、MLEでサポートされている任意のデータ型を指定できます。データ型のみを指定します。長さ、精度またはスケール情報は省略する必要があります。
invoker_rights_clause ファンクションが実行者権限であるか、定義者権限であるかを指定します。
  • AUTHID CURRENT_USERは、実行者権限のファンクションまたはプロシージャを作成します。
  • AUTHID DEFINERは、定義者権限のファンクションまたはプロシージャを作成します。

AUTHID句を省略した場合、コール仕様はデフォルトで定義者権限で作成されます。MLEコール仕様のAUTHID句のセマンティクスは、PL/SQLファンクションおよびプロシージャとまったく同じです。

deterministic_clause ファンクションにのみ使用され、ファンクションがそのパラメータの同じ値でコールされたときに常に同じ結果値を戻すことを示します。PL/SQLファンクションと同様に、ファンクションから戻される結果に影響を与える可能性のある方法でデータベースにアクセスするファンクションには、この句を使用しないでください。データベースでファンクションを再実行しないことが選択された場合、このことを行った結果は取得されません。

MLEモジュール句

MLE MODULE句では、コール仕様の基礎となるJavaScriptファンクションをエクスポートするMLEモジュールを指定します。指定したモジュールは常に、作成するコール仕様と同じスキーマ内に存在する必要があります。

指定したMLEモジュールが存在しない場合は、ORA-04103エラーがスローされます。同様に、指定したモジュールが、作成するコール仕様とは異なるスキーマにある場合は、ORA-01031エラーが発生します。

ENV句

オプションのENV句では、このコール仕様が実行されるモジュール・コンテキストのMLE環境を指定します。

指定した環境スキーマ・オブジェクトが存在しない場合は、ORA-04105エラーがスローされます。

この句を省略した場合、デフォルトの環境が使用されます。デフォルトの環境は、モジュール・インポートや指定された言語オプションがない、最も基本的な状態の単純な環境になります。

SIGNATURE句

SIGNATURE句には、指定したMLEモジュールによってエクスポートされる特定のファンクションにMLEコール仕様をマップするために必要なすべての情報が含まれます。

具体的には、次の2つの情報があります:

  • 指定したMLEモジュール内のエクスポートされるファンクションの名前。
  • ファンクションの(PL/SQLパラメータ型ではなく) MLE言語パラメータ型(オプション)。

SIGNATURE句は、次の形式である必要があります:

図6-2 signature_clause ::=



パス指定は、コールされるファンクションを表し、次の2つの形式を使用できます:

  • パス指定は、インポート指定のみで構成できます。

    • インポート指定には、モジュールの名前付きエクスポートを識別するJavaScript識別子を使用でき、これはファンクションである必要があります。または、インポート指定に予約語defaultを使用することもできます。この場合、モジュールのデフォルト・エクスポートが使用され、これはファンクションである必要があります。

  • パス指定は、インポート指定と、その後に続くドットおよびJavaScript識別子で構成される複合形式にすることができます。

    • この場合、インポート指定は、ドットの後に示されている識別子と名前が一致するプロパティを持つオブジェクトを参照する必要があります。プロパティの値はファンクションである必要があります。

language-typeには、組込みのJavaScript型(文字列や数値など)、またはMLEで提供される、対応するPL/SQL引数との互換性がある型(OracleNumberOracleDateなど)を指定できます。JSONデータは、MLE ANY型にマップされることに注意してください。PL/SQLからMLEにJSONを渡す方法の例については、「JSONデータの操作」を参照してください。組込みモジュールmle-js-plsqltypesを介してMLEで提供される型の詳細は、サーバー側JavaScript APIのドキュメントを参照してください。

function-nameには、任意の英数字に加えて、アンダースコアとピリオドを含めることができます。

コール仕様がファンクションである場合は、SIGNATURE句に戻り値の型を指定しません。このファンクションでは、コール仕様のRETURN句に指定されたPL/SQL型と互換性のあるJavaScript型が戻されます。

ノート:

SIGNATURE句の解析および解決は、MLEファンクションが最初に実行されるときに遅延して発生します。SIGNATURE句における解決エラーや構文エラーは、この時点で初めて報告されます(コール仕様が作成されたときではなく)。

簡略化されたSIGNATURE

CREATE FUNCTIONおよびCREATE PROCEDURE DDL文は、エクスポートされるファンクションの名前のみを指定し、パラメータのJavaScript言語型を省略する、簡略化された形式のSIGNATURE句も受け入れます。この場合、デフォルトのPL/SQL-MLE言語型マッピングが使用されます。

次の例は、簡略化されたSIGNATURE句を使用したコール仕様の作成を示しています。

CREATE OR REPLACE FUNCTION concat
    RETURN VARCHAR2
    AS MLE MODULE jsmodule
    SIGNATURE 'concat';
/

ファンクションconcatがPL/SQLからコールされると、基礎となるJavaScriptファンクションをコールする前に、入力VARCHAR2パラメータがJavaScript文字列(VARCHAR2のデフォルトの型マッピング)に変換されます。

関連項目:

型マッピングの詳細は、「MLEの型変換」を参照してください