OUTおよびIN OUTパラメータ

MLE JavaScriptファンクションでOUTおよびIN OUTパラメータを使用します。

MLE JavaScriptファンクションでは、PL/SQLファンクションおよびプロシージャでサポートされているのと同様に、INパラメータに加えてIN OUTおよびOUTパラメータがサポートされています。これらは、MLEコール仕様の引数のリストでIN OUTおよびOUTとして宣言されます。

JavaScriptには出力パラメータという概念がないため、JavaScript実装はかわりに、パラメータ値をラップするオブジェクトを受け入れます。具体的には、これらのラッパー・オブジェクトの形式は、次に示す汎用的なTypeScriptインタフェースInOutおよびOutによって記述されます(それぞれIN OUTおよびOUTパラメータに対応します):

Interface InOut<T> {
    Value : T;
}
Interface Out<T> {
    Value : T;
}

OUTおよびIN OUTパラメータは、プロパティvalueのみが引数の値を公開するJavaScriptオブジェクトとしてJavaScriptファンクションに渡されます。つまり、OUTまたはIN OUT引数の値を読み取ったり、書き込んだり、使用するには、まず、そのvalueプロパティにアクセスして、引数をアンラップする必要があります。これは、JavaScriptに存在しない参照渡し実装をシミュレートするために行われます。たとえば、例6-6substitute()ファンクションは、最初にIN OUT引数sentencematch()をコールする前にそのvalueプロパティを取得することにより、それをアンラップする必要があります。sentenceは値ラッパーにすぎないため、sentencematch()を直接コールしようとすると失敗します。OUTおよびIN OUTパラメータを使用しないDBMS_MLEでは、これらのラッパー・クラスが必要になることはありません。

例6-6 JavaScriptでのOUTおよびIN OUTパラメータ

VARCHAR2 IN OUTパラメータsentenceを使用し、2番目のパラメータreplaceThisのすべての出現箇所を3番目のパラメータwithThatに置き換えて、sentenceにおけるreplaceThisの出現数を戻すMLEファンクションsubstitute()について考えてみます。

CREATE OR REPLACE MLE MODULE in_out_example_mod 
LANGUAGE JAVASCRIPT AS 

export function substitute (sentence, replaceThis, withThat) {
    /*
     *  substitute: substitutes `replaceThis` in `sentence` with
     *              `replaceThat`
     *
     * parameters: 
     * - sentence: the input sentence
     * - replaceThis: a word to be replaced in `sentence`
     * - withThat: the new word to be used instead of `replaceThis`
     */
    const occurrences = 
        (sentence.value.match(replaceThis) || []).length;
    sentence.value = sentence.value.replace(replaceThis, withThat);
    return occurrences;
}
/
CREATE OR REPLACE FUNCTION f_substitute(
    p_sentence       IN OUT VARCHAR2,
    p_replaceThis    IN VARCHAR2,
    p_withThat       IN VARCHAR2
)
RETURN NUMBER
AS MLE MODULE in_out_example_mod
SIGNATURE 'substitute(InOut<string>, string, string)';
/

コール仕様のSIGNATURE句では、JavaScriptファンクションのsentenceパラメータのパラメータ型がInOut<string>としてリストされています。したがって、入力VARCHAR2値はJavaScript stringに変換され、その後、オブジェクトにラップされて、JavaScriptファンクションsubstitute()に渡されます。

EXEC dbms_session.reset_package
SET SERVEROUTPUT ON

DECLARE
  l_sentence    varchar2(100) := 'people are enjoying the rain';
  l_replaceThis varchar2(100) := 'rain';
  l_withThat    varchar2(100) := 'sun';
  l_occurrences pls_integer;
BEGIN
  dbms_output.put_line('sentence before: ' || l_sentence);
  l_occurrences := f_substitute(
    l_sentence, l_replaceThis, l_withThat);
  if l_occurrences <> 0 then
    dbms_output.put_line('sentence after: ' || l_sentence);
  else
    dbms_output.put_line('no text replacement performed');
  end if;
END;
/

結果:

sentence before: people are enjoying the rain
sentence after: people are enjoying the sun