ファンクションのコール仕様
モジュールのコール仕様およびインラインMLEコール仕様により、JavaScript機能を実装できます。
MLE JavaScriptモジュールによってエクスポートされたファンクションは、コール仕様を作成することで公開できます。コール仕様を使用して公開されたJavaScriptファンクションは、PL/SQLファンクションまたはプロシージャをコールできるあらゆる場所からコールできます。
または、インラインMLEコール仕様を使用して、JavaScriptコードをDDLに直接埋め込むこともできます。このオプションは、JavaScriptを使用して単純な機能を迅速に実装する場合に便利です。
トピック
- MLEモジュールのコール仕様の作成
MLEコール仕様の作成では、汎用的なCREATE FUNCTION RETURNS AS
またはCREATE PROCEDURE AS
構文に続けて、MLE固有の構文を使用します。 - インラインMLEコール仕様の作成
インラインMLEコール仕様では、CREATE FUNCTION
およびCREATE PROCEDURE
のDDLにJavaScriptコードが直接埋め込まれます。 - インライン対モジュールのMLEコール仕様の選択の違い
各オプションには、ユースケースに応じて独自の長所と短所があります。 - MLEコール仕様のランタイム分離
MLEでは、実行コンテキストを使用してランタイム状態の分離が維持されます。コール仕様は、同じユーザー、モジュールおよび環境を共有していない場合、個別のコンテキストに関連付けられます。 - コール仕様のディクショナリ・ビュー
JavaScriptコール仕様に関するメタデータは、[USER | ALL | DBA | CDB]_MLE_PROCEDURES
ビューを使用してデータ・ディクショナリで使用できます。ビューのファミリは、コール仕様(パッケージ、ファンクション、プロシージャ)をJavaScriptモジュールにマップします。このディクショナリ・ビューは、*_PROCEDURES
ビューによく似たモデルとなっています。
親トピック: MLE JavaScriptファンクション
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コール仕様の要素を説明とともに示します。 - MLEモジュール句
MLE MODULE
句では、コール仕様の基礎となるJavaScriptファンクションをエクスポートするMLEモジュールを指定します。指定したモジュールは常に、作成するコール仕様と同じスキーマ内に存在する必要があります。 - ENV句
オプションのENV
句では、このコール仕様が実行されるモジュール・コンテキストのMLE環境を指定します。 - SIGNATURE句
SIGNATURE
句には、指定したMLEモジュールによってエクスポートされる特定のファンクションにMLEコール仕様をマップするために必要なすべての情報が含まれます。
親トピック: ファンクションのコール仕様
MLEコール仕様のコンポーネント
MLEコール仕様の要素を説明とともに示します。
表6-1 MLEコール仕様のコンポーネント
要素名 | 説明 |
---|---|
OR REPLACE |
ファンクションがすでに存在する場合は置き換えることを指定します。この句を使用すると、既存のファンクションに以前に付与されたオブジェクト権限を削除、再作成および再付与することなしに、そのファンクションの定義を変更できます。再作成されたファンクションまたはプロシージャに対する権限を以前に付与されていたユーザーは、権限を再付与されなくても、そのファンクションに引き続きアクセスできます。 |
IF NOT EXISTS |
ファンクションが存在しない場合は作成することを指定します。同じ名前のファンクションが存在する場合、文はエラーなしで無視され、元のファンクション本体は変更されません。SQL*Plusでは、コマンドが無視されるか実行されるかに関係なく、同じ出力メッセージが表示され、DDLスクリプトのべき等性が確保されています。
|
schema |
コール仕様を含めるスキーマを指定します。スキーマを省略した場合は、現行のユーザーのスキーマ内にコール仕様が作成されます。 |
call_spec_name |
作成するコール仕様の名前を指定します。コール仕様は、専用のネームスペースを使用するMLEモジュールおよび環境とは異なり、デフォルトのネームスペースに作成されます。 |
param_declaration |
コール仕様のパラメータを指定します。パラメータを指定しない場合は、カッコを省略する必要があります。 |
RETURN datatype |
ファンクションにのみ使用され、ファンクションの戻り値のデータ型を指定します。戻り値には、MLEでサポートされている任意のデータ型を指定できます。データ型のみを指定します。長さ、精度またはスケール情報は省略する必要があります。 |
invoker_rights_clause |
ファンクションが実行者権限であるか、定義者権限であるかを指定します。
|
deterministic_clause |
ファンクションにのみ使用され、ファンクションがそのパラメータの同じ値でコールされたときに常に同じ結果値を戻すことを示します。PL/SQLファンクションと同様に、ファンクションから戻される結果に影響を与える可能性のある方法でデータベースにアクセスするファンクションには、この句を使用しないでください。データベースでファンクションを再実行しないことが選択された場合、このことを行った結果は取得されません。 |
親トピック: MLEモジュールのコール仕様の作成
MLEモジュール句
MLE MODULE
句では、コール仕様の基礎となるJavaScriptファンクションをエクスポートするMLEモジュールを指定します。指定したモジュールは常に、作成するコール仕様と同じスキーマ内に存在する必要があります。
指定したMLEモジュールが存在しない場合は、ORA-04103
エラーがスローされます。同様に、指定したモジュールが、作成するコール仕様とは異なるスキーマにある場合は、ORA-01031
エラーが発生します。
親トピック: MLEモジュールのコール仕様の作成
ENV句
オプションのENV
句では、このコール仕様が実行されるモジュール・コンテキストのMLE環境を指定します。
指定した環境スキーマ・オブジェクトが存在しない場合は、ORA-04105
エラーがスローされます。
この句を省略した場合、デフォルトの環境が使用されます。デフォルトの環境は、モジュール・インポートや指定された言語オプションがない、最も基本的な状態の単純な環境になります。
親トピック: MLEモジュールのコール仕様の作成
SIGNATURE句
SIGNATURE
句には、指定したMLEモジュールによってエクスポートされる特定のファンクションにMLEコール仕様をマップするために必要なすべての情報が含まれます。
具体的には、次の2つの情報があります:
- 指定したMLEモジュール内のエクスポートされるファンクションの名前。
- ファンクションの(PL/SQLパラメータ型ではなく) MLE言語パラメータ型(オプション)。
SIGNATURE
句は、次の形式である必要があります:
パス指定は、コールされるファンクションを表し、次の2つの形式を使用できます:
-
パス指定は、インポート指定のみで構成できます。
-
インポート指定には、モジュールの名前付きエクスポートを識別するJavaScript識別子を使用でき、これはファンクションである必要があります。または、インポート指定に予約語
default
を使用することもできます。この場合、モジュールのデフォルト・エクスポートが使用され、これはファンクションである必要があります。
-
-
パス指定は、インポート指定と、その後に続くドットおよびJavaScript識別子で構成される複合形式にすることができます。
-
この場合、インポート指定は、ドットの後に示されている識別子と名前が一致するプロパティを持つオブジェクトを参照する必要があります。プロパティの値はファンクションである必要があります。
-
language-type
には、組込みのJavaScript型(文字列や数値など)、またはMLEで提供される、対応するPL/SQL引数との互換性がある型(OracleNumber
やOracleDate
など)を指定できます。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の型変換」を参照してください
親トピック: MLEモジュールのコール仕様の作成
インラインMLEコール仕様の作成
インラインMLEコール仕様では、CREATE FUNCTION
およびCREATE PROCEDURE
のDDLにJavaScriptコードが直接埋め込まれます。
JavaScriptを使用して単純な機能を迅速に実装する場合は、インラインMLEコール仕様が適切な選択である可能性があります。このオプションでは、JavaScriptコードを含む別のモジュールをデプロイする必要はありません。JavaScriptファンクションはコール仕様自体の定義に組み込まれています。
MLE LANGUAGE
句は、JavaScriptを使用してファンクションが実装されるように指定する際に使用します。JavaScriptファンクション本体は、デリミタのセットで囲む必要があります。二重中カッコは、この目的のために一般的に使用されますが、独自のものを選択することもできます。開始デリミタと終了デリミタは一致する必要があり、予約語またはドットは使用できません。{{...}}
、<<...>>
、((...))
などのデリミタの場合、終了デリミタは対応する終了記号であり、完全一致ではありません。
言語名に続く文字列は、コール仕様の機能を実装するJavaScriptファンクションの本体として扱われます。コードが実行されると、PL/SQLパラメータはデフォルトのJavaScript型に自動的に変換され、同じ名前のパラメータとしてJavaScriptファンクションに渡されます。引用符で囲まれていないパラメータ名は、すべて大文字のJavaScript名にマップされます。JavaScriptファンクションにより戻される値は、MLEモジュールのコール仕様と同様に、PL/SQLコール仕様の戻り型に変換されます。
関連項目:
インライン・コール仕様のDBMS_MLE
サブプログラムの詳細は、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』を参照してください
例6-2 単純なインラインMLEコール仕様
CREATE OR REPLACE FUNCTION date_to_epoch (
"theDate" TIMESTAMP WITH TIME ZONE
)
RETURN NUMBER
AS MLE LANGUAGE JAVASCRIPT
{{
const d = new Date(theDate);
//check if the input parameter turns out to be an invalid date
if (isNaN(d)){
throw new Error(`${theDate} is not a valid date`);
}
//Date.prototype.getTime() returns the number of milliseconds
//for a given date since epoch, which is defined as midnight
//on January 1, 1970, UTC
return d.getTime();
}};
/
次のSQL文を使用して、前述のインライン・コール仕様で作成されたファンクションをコールできます:
SELECT
date_to_epoch(
TO_TIMESTAMP_TZ(
'29.02.2024 11.34.22 -05:00',
'dd.mm.yyyy hh24:mi:ss tzh:tzm'
)
) epoch_date;
結果:
EPOCH_DATE
----------
1.7092E+12
例6-3 JSONを戻すインラインMLEコール仕様
例6-2で、ファンクション・パラメータ名strArgs
に二重引用符が使用されていることに注意してください。囲まれていると、パラメータの大文字と小文字が保持されます。引用符を使用しないと、この例に示すように、パラメータ名はすべて大文字のJavaScript名にマップされます。
CREATE OR REPLACE FUNCTION p_string_to_json(inputString VARCHAR2) RETURN JSON
AS MLE LANGUAGE JAVASCRIPT
{{
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;
}};
/
前述のインライン・コール仕様で作成されたファンクションは、次のSQL文を使用してコールできます:
SELECT p_string_to_json('Hello=Greeting');
結果:
P_STRING_TO_JSON('HELLO=GREETING')
------------------------------------------------------------
{"Hello":"Greeting"}
- インラインMLEコール仕様のコンポーネント
インラインMLEコール仕様の要素を説明とともに示します。 - JavaScriptグローバル変数を使用した組込みモジュールへのアクセス
MLE組込みモジュールをMLEモジュールのコール仕様と同じ方法でインポートするのではなく、インラインMLEコール仕様では、事前移入されたJavaScriptグローバルを使用して組込みモジュール機能にアクセスします。
親トピック: ファンクションのコール仕様
インラインMLEコール仕様のコンポーネント
インラインMLEコール仕様の要素を説明とともに示します。
表6-2 インラインMLEコール仕様のコンポーネント
要素名 | 説明 |
---|---|
OR REPLACE |
ファンクションがすでに存在する場合は置き換えることを指定します。この句を使用すると、既存のファンクションに以前に付与されたオブジェクト権限を削除、再作成および再付与することなしに、そのファンクションの定義を変更できます。再作成されたファンクションまたはプロシージャに対する権限を以前に付与されていたユーザーは、権限を再付与されなくても、そのファンクションに引き続きアクセスできます。 |
IF NOT EXISTS |
ファンクションが存在しない場合は作成することを指定します。同じ名前のファンクションが存在する場合、文はエラーなしで無視され、元のファンクション本体は変更されません。SQL*Plusでは、コマンドが無視されるか実行されるかに関係なく、同じ出力メッセージが表示され、DDLスクリプトのべき等性が確保されています。
|
schema |
コール仕様を含めるスキーマを指定します。スキーマを省略した場合は、現行のユーザーのスキーマ内にコール仕様が作成されます。 |
call_spec_name |
作成するコール仕様の名前を指定します。コール仕様は、専用のネームスペースを使用するMLEモジュールおよび環境とは異なり、デフォルトのネームスペースに作成されます。 |
param_declaration |
コール仕様のパラメータを指定します。パラメータを指定しない場合は、カッコを省略する必要があります。 |
RETURN datatype |
ファンクションにのみ使用され、ファンクションの戻り値のデータ型を指定します。戻り値には、MLEでサポートされている任意のデータ型を指定できます。データ型のみを指定します。長さ、精度またはスケール情報は省略する必要があります。 |
invoker_rights_clause |
ファンクションが実行者権限であるか、定義者権限であるかを指定します。
|
deterministic_clause |
ファンクションにのみ使用され、ファンクションがそのパラメータの同じ値でコールされたときに常に同じ結果値を戻すことを示します。PL/SQLファンクションと同様に、ファンクションから戻される結果に影響を与える可能性のある方法でデータベースにアクセスするファンクションには、この句を使用しないでください。データベースでファンクションを再実行しないことが選択された場合、このことを行った結果は取得されません。 |
MLE LANGUAGE |
後に続くコードの言語を指定します(例: JavaScript)。言語名に続く文字列は、必要な機能を実装するMLE言語コードと解釈されます。JavaScriptの場合、この埋込みコードはJavaScriptファンクションの本体として解釈されます。 |
PURE |
PURE キーワードは、関数またはプロシージャを制限された実行コンテキストで作成することを指定します。PUREでの実行中は、データベース状態へのアクセスは許可されず、データベース状態へのアクセスを必要としないユーザー定義関数にセキュリティ・レイヤーが追加されます。詳細は、「制限された実行コンテキストについて」を参照してください
|
親トピック: インラインMLEコール仕様の作成
JavaScriptグローバル変数を使用した組込みモジュールへのアクセス
MLE組込みモジュールをMLEモジュールのコール仕様と同じ方法でインポートするのではなく、インラインMLEコール仕様では、事前移入されたJavaScriptグローバルを使用して組込みモジュール機能にアクセスします。
インラインMLEコール仕様では、組込みでもカスタムでもMLEモジュールをインポートできません。かわりに、JavaScriptグローバル変数(session
変数など)を使用すると、JavaScript MLE SQLドライバなどの組込みモジュールの機能にアクセスできます。グローバル・スコープでのオブジェクトの可用性の詳細は、「MLE JavaScriptドライバの操作」を参照してください。
関連項目:
組込みJavaScriptモジュールの詳細は、サーバー側JavaScript APIのドキュメントを参照してください
親トピック: インラインMLEコール仕様の作成
インライン対モジュールのMLEコール仕様の選択の違い
各オプションには、ユースケースに応じて独自の長所と短所があります。
インラインMLEコール仕様では、JavaScriptコードを含む個別のモジュールをデプロイする必要がないため、開発ワークフローが簡略化され、単純なJavaScript機能を迅速に実装する方法が提供されます。これは、単一のJavaScriptファンクションのみを実装する必要がある場合に便利なオプションです。JavaScriptグローバル変数を使用してMLE組込みモジュールの機能にアクセスできますが、インラインMLEコール仕様はMLE環境に関連付けられていないため、モジュールをインポートできません。
MLEモジュールのコール仕様には、他のモジュール(組込み、カスタム)から機能をインポートするという複雑さと機能の点で、より柔軟性があります。また、デフォルトのJavaScript型マッピングをオーバーライドするオプションもあります。これは、MLEインライン・コール仕様ではできません。MLEモジュールのコール仕様は、より大きいJavaScriptコード部分や、インポートを使用して他のJavaScriptコードで再利用する予定のコードに使用してください。
関連項目:
MLEコール仕様のDBMS_MLE
サブプログラムの詳細は、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』を参照してください
親トピック: ファンクションのコール仕様
MLEコール仕様のランタイム分離
MLE実行コンテキストは、分離されたスタンドアロンのランタイム環境として機能します。実行コンテキストを共有するJavaScriptコードはすべて、そのランタイム状態のすべて(以前に定義されたグローバル変数など)に対するフル・アクセス権を持っています。それ以外の場合、ある実行コンテキストで実行されるコードが、別の実行コンテキストのランタイム状態を表示したり、変更する方法はありません。コール仕様の実行コンテキストは、対応するコール仕様のいずれかへの最初のコールで透過的に作成されます。詳細は、「MLE実行コンテキストについて」を参照してください
セッションでコール仕様を実行するときに、MLEは、コール仕様で指定されたモジュールをロードし、そのモジュールによってエクスポートされたファンクションをコールします。2つのコール仕様の実行で同じ実行コンテキストを共有するには、同じMLEモジュールからファンクションをエクスポートし、同じ環境を使用して、同じユーザーが実行する必要があります。同じセッション内の異なるユーザーの代理としてのSQLまたはPL/SQLコールが、同じ実行コンテキストで実行されることはありません。
モジュールのランタイム表現はステートフルです。状態には、JavaScriptモジュールの変数や、モジュール内のコードにアクセスできるグローバル・スコープの変数などが含まれます。同じセッション内で、MLEは複数のモジュール・コンテキストを使用してコール仕様を実行できます。コール仕様によって参照されるモジュールまたは環境が変更されると、実行コンテキストが無効になり、エラーがスローされます。例6-4に、この概念を示します。
セッション状態は、データの整合性のために非常に重要です。変更されたセッション状態に関連するエラー(モジュール変更の場合はORA-04106
、JavaScriptの環境変更の場合はORA-04107
、PL/SQLパッケージの場合はORA-04068
)を捕捉しないと、サイレント・データ破損が発生する可能性があります。初期化パラメータSESSION_EXIT_ON_PACKAGE_STATE_ERROR
をTRUE
に設定すると、セッション状態が無効になるとセッションが強制的に切断されます。多くのアプリケーションがセッション切断を取得するため、このオプションを使用すると、既存のセッション状態の無効化からのリカバリを簡略化できます。SESSION_EXIT_ON_PACKAGE_STATE_ERROR
の詳細は、『Oracle Databaseリファレンス』を参照してください。
ノート:
パッケージおよびJavaScriptモジュールに状態を格納することはお薦めしません。セッション状態は、データベースによって最適に処理されます。同じMLEモジュールからファンクションを公開する(および同じ環境を使用する)定義者権限のコール仕様はすべて、同じ実行コンテキストを共有します。これは、すべての実行が定義者の代理として発生するためです。逆に、コール仕様が実行者権限として宣言された場合は、コール・ユーザーごとに別個の実行コンテキストがあります。
コール仕様を作成する方法の詳細は、「MLEコール仕様のコンポーネント」を参照してください
関連項目:
SESSION_EXIT_ON_PACKAGE_STATE_ERROR
を使用して、PL/SQLパッケージの状態が無効化されている場合の動作を指定する方法の詳細は、『Oracle Database PL/SQL言語リファレンス』を参照してください
例6-4 実行コンテキストの依存関係
この例は、モジュールまたは環境が変更されると、関連する実行コンテキストが無効になることを示しています。
CREATE OR REPLACE MLE MODULE count_module
LANGUAGE JAVASCRIPT AS
let myCounter = 0;
export function incrementCounter(){
return ++myCounter;
}
/
CREATE OR REPLACE FUNCTION increment_and_get_counter
RETURN NUMBER
AS MLE MODULE count_module
SIGNATURE 'incrementCounter';
/
セッション1は、ファンクションincrement_and_get_counter
を起動して実行コンテキストを作成します。
SQL> SELECT increment_and_get_counter;
INCREMENT_AND_GET_COUNTER
-------------------------
1
SQL> SELECT increment_and_get_counter;
INCREMENT_AND_GET_COUNTER
-------------------------
2
別のセッション(セッション2とします)からファンクションを起動する別のユーザーが、最初のセッションのコンテキストとは関連がない別の実行コンテキストを作成します。
SQL> SELECT increment_and_get_counter;
INCREMENT_AND_GET_COUNTER
-------------------------
1
セッション1のユーザーは、いくつかの新しいコメントをファンクションに追加してMLEモジュールを再作成します。
CREATE OR REPLACE MLE MODULE count_module
LANGUAGE JAVASCRIPT AS
let myCounter = 0;
/**
* increments a counter before returning the value
* to the caller
*@returns {number} the value of the counter
*/
export function incrementCounter(){
return ++myCounter;
}
/
この操作は、セッション状態を無効にする必要があることを、count_module
を参照するすべての実行コンテキストに通知します。セッション2は、無効化に対応してエラーを取得します:
SQL> SELECT increment_and_get_counter;
SELECT increment_and_get_counter
*
ERROR at line 1:
ORA-04106: Module USER2.COUNT_MODULE referred to by INCREMENT_AND_GET_COUNTER has been modified since the execution context was created.
セッション2でのファンクションの次回の起動は、再初期化されたセッション状態で開始されます。
SQL> SELECT increment_and_get_counter;
INCREMENT_AND_GET_COUNTER
-------------------------
1
PL/SQLパッケージと同様に、セッション1からファンクションを起動してもエラーは発生しません。ただし、セッション状態は、ファンクションへの後続のコールで示されているように破棄されています。
SQL> SELECT increment_and_get_counter;
INCREMENT_AND_GET_COUNTER
-------------------------
1
セッション2で初期化パラメータSESSION_EXIT_ON_PACKAGE_STATE_ERROR
がTRUE
に設定されている場合、ORA-04106
エラーがスローされ、データベースへの接続が切断されます。
ALTER SESSION SET SESSION_EXIT_ON_PACKAGE_STATE_ERROR = TRUE;
SELECT increment_and_get_counter;
SELECT increment_and_get_counter
*
ERROR at line 1:
ORA-04106: Module USER2.COUNT_MODULE referred to by INCREMENT_AND_GET_COUNTER has been modified since the execution context was created.
ERROR:
ORA-03114: not connected to ORACLE
親トピック: ファンクションのコール仕様
コール仕様のディクショナリ・ビュー
JavaScriptコール仕様に関するメタデータは、[USER | ALL | DBA | CDB]_MLE_PROCEDURES
ビューを使用してデータ・ディクショナリで使用できます。ビューのファミリは、コール仕様(パッケージ、ファンクション、プロシージャ)をJavaScriptモジュールにマップします。このディクショナリ・ビューは、*_PROCEDURES
ビューによく似たモデルとなっています。
*_MLE_PROCEDURES
の詳細は、『Oracle Databaseリファレンス』を参照してください。
例6-5 JavaScriptコール仕様メタデータの表示
SELECT OBJECT_NAME, PROCEDURE_NAME, SIGNATURE, ENV_NAME, MODULE_NAME
FROM USER_MLE_PROCEDURES;
SQL*Plus出力:
OBJECT_NAME PROCEDURE_NAME SIGNATURE ENV_NAME MODULE_NAME
------------ --------------- ---------------------- --------- ------------
CONCATENATE concat(string, string) JSMODULE
DO_NOTHING doNothing(string) JSMODULE
親トピック: ファンクションのコール仕様