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. --------