OPTIONAL 属性は、パラメーター記述子リストの一部として、またはパラメーター宣言の属性として指定できます。
OPTIONAL
OPTIONAL 引数を呼び出しおよび関数参照で省略するには、アスタリスク (*) を使用します。引数リストのどの位置にある項目でも省略することができます。省略された項目は引数として数えられます。引数の数は、エントリに許可されている最大数を超えてはいけません。
受け取り側のプロシージャは、OMITTED または PRESENT 組み込み関数を使用して、OPTIONAL パラメーター/引数がエントリの呼び出しで省略されたかどうかを判別できます。
エントリの宣言の対応するパラメーターも OPTIONAL であれば、省略された OPTIONAL パラメーターをそのエントリの引数として渡すことができます。
ENTRY 宣言の最終パラメーターが OPTIONAL として宣言されている場合、それらのパラメーターは ENTRY の呼び出しで省略することができます。それらのパラメーターを呼び出しで省略する際に、対応する数のアスタリスクを指定する必要もありません。そのため、たとえば、6 つのパラメーターを含む ENTRY の宣言で、そのうちの最後の 3 つが OPTIONAL として宣言されている場合、3 つ、4 つ、5 つ、または 6 つの引数を指定して呼び出すことができます。
この例では、いくつかのオプションのパラメーターを含む一連の呼び出しを繰り返します。各呼び出しで OPTIONAL パラメーターが指定されているかどうかが OMITTED 組み込み関数を使用して判別され、結果が出力されます。
pgm: proc options (main);
dcl subr entry ( fixed bin, char(1) optional, float, char(40) optional);
dcl c char(1);
call subr(99, *, 3.14, 'OPTIONAL attribute & OMITTED built-in');
call subr(99, *, 3.14, *);
call subr(99, c, 3.14);
call subr(99, *, 3.14, *);
call subr(99, c, 3.14, 'Done.');
end pgm;
subr: proc (i, c1, f, str);
dcl i fixed bin,
c1 char(1) optional,
f float bin,
str char(40) optional;
if omitted(str) then
put skip list('Arg str Omitted.');
else
put skip data(str);
if omitted(c1) then
put skip list('Arg c1 Omitted.');
else
put skip list('Arg c1 not Omitted.');
put skip list ('--------');
end subr;
このコード例を実行すると、次のように出力されます。
STR='OPTIONAL attribute & OMITTED built-in ' ; Arg c1 Omitted. -------- Arg str Omitted. Arg c1 Omitted. -------- Arg str Omitted. Arg c1 not Omitted. -------- Arg str Omitted. Arg c1 Omitted. -------- STR='Done. ' ; Arg c1 not Omitted. --------