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ファンクション