OUTおよびIN OUTパラメータ
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-6のsubstitute()
ファンクションは、最初にIN OUT
引数sentence
でmatch()
をコールする前にそのvalue
プロパティを取得することにより、それをアンラップする必要があります。sentence
は値ラッパーにすぎないため、sentence
でmatch()
を直接コールしようとすると失敗します。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
親トピック: MLE JavaScriptファンクション