インライン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コール仕様の戻り型に変換されます。

このファンクションの構文はコンパイル時にチェックされます。JavaScriptコードに構文エラーが含まれている場合、ファンクションまたはプロシージャは作成されますが、無効な状態になります。構文エラーは実行前に捕捉されますが、それでも、インライン・コール仕様を実行する前に任意のlintツールを使用してコードを分析することをお薦めします。

関連項目:

インライン・コール仕様のDBMS_MLEサブプログラムの詳細は、Oracle AI 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コール仕様の要素を説明とともに示します。

図6-5 MLEインライン・コール仕様の構文



表6-2 インライン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 LANGUAGE 後に続くコードの言語を指定します(例: JavaScript)。言語名に続く文字列は、必要な機能を実装するMLE言語コードと解釈されます。JavaScriptの場合、この埋込みコードはJavaScriptファンクションの本体として解釈されます。
PURE PUREキーワードは、関数またはプロシージャを制限された実行コンテキストで作成することを指定します。PUREでの実行中は、データベース状態へのアクセスは許可されず、データベース状態へのアクセスを必要としないユーザー定義関数にセキュリティ・レイヤーが追加されます。詳細は、「制限された実行コンテキストについて」を参照してください

JavaScriptグローバル変数を使用した組込みモジュールへのアクセス

MLE組込みモジュールをMLEモジュールのコール仕様と同じ方法でインポートするのではなく、インラインMLEコール仕様では、事前移入されたJavaScriptグローバルを使用して組込みモジュール機能にアクセスします。

インラインMLEコール仕様では、組込みでもカスタムでもMLEモジュールをインポートできません。かわりに、JavaScriptグローバル変数(session変数など)を使用すると、JavaScript MLE SQLドライバなどの組込みモジュールの機能にアクセスできます。グローバル・スコープでのオブジェクトの可用性の詳細は、「MLE JavaScriptドライバの操作」を参照してください。

関連項目:

組込みJavaScriptモジュールの詳細は、サーバー側JavaScript APIのドキュメントを参照してください