%INCLUDE が実行されると、そのステートメントで指定された外部テキストが、 プリプロセッサー入力の中に、%INCLUDE ステートメントの代わりとして 組み込まれます。 そのようなテキストがいったん組み込まれると、それは組み込み済み テキスト と呼ばれます。そのテキストは、プリプロセッサー・ステートメント、 リスト制御ステートメント、および PL/I 原始ステートメントで 構成することができます。
%INCLUDE ステートメントの構文は、%INCLUDE ディレクティブで説明しています。
dataset と member name の各ペアは、ソース・プログラムに組み込まれる 外部テキストを識別します。
走査は、包含されるテキストの最初の文字から続行されます。 包含されるテキストは、プリプロセッサー入力と同じ方法で走査されます。 ですから、包含されるテキストを、形成するプリプロセッサー出力の基にすることができます。
%INCLUDE ステートメントはネストすることができます。 つまり、組み込まれたテキストの中に、%INCLUDE ステートメントがあってもかまいません。
組み込み済みテキスト内の %GO TO ステートメントが制御権を移動することができる のは、同じ組み込みファイルの内部の点に限られています。 %GOTO ステートメントよりも、その %GOTO ステートメントのターゲット・ラベルが 先に来てはなりません。
組み込み済みテキスト内のプリプロセッサー・ステートメント、DO グループ、 SELECT グループ、およびプロシージャーは完結していなければなりません。 例えば、%IF ステートメントの半分が組み込みテキスト内にあり、残りの 半分がプリプロセッサー入力の別の部分にあるということは許されません。
プリプロセッサー入力と組み込み済みテキスト内に、%INCLUDE 以外には プリプロセッサー・ステートメントが含まれていない場合は、 プリプロセッサーの実行を省略することができます。 (その場合、INCLUDE コンパイル時オプションを使用する必要があります。)
例えば、データ・セット SYSLIB のメンバー PAYRL に下記のテキスト (構造体宣言) が収められているとします。
DECLARE 1 PAYROLL,
2 NAME,
3 LAST CHARACTER (30) VARYING,
3 FIRST CHARACTER (15) VARYING,
3 MIDDLE CHARACTER (3) VARYING,
2 CURR,
3 (REGLAR, OVERTIME) FIXED DECIMAL (8,2),
2 YTD LIKE CURR;
このとき、下記のプリプロセッサー・ステートメントが実行されると、
%DECLARE PAYROLL CHARACTER; %PAYROLL='CUM_PAY'; %INCLUDE PAYRL; %DEACTIVATE PAYROLL; %INCLUDE PAYRL;
2 つの構造体宣言がプリプロセッサー出力テキスト内に生成されます。 それら 2 つの構造体宣言は名前だけが異なっており、それぞれ CUM_PAY と PAYROLL という名前です。
最初の %INCLUDE ステートメントが実行されると、PAYRL 内のテキストが プリプロセッサー入力の中に組み込まれます。 この組み込み済みテキスト内の ID PAYROLL がプリプロセッサー走査で検出される と、ID PAYROLL はアクティブのプリプロセッサー変数 PAYROLL の現行値 (つまり CUM_PAY) で 置き換えられます。 それ以上の包含されたテキストを走査しても、追加の置換は行われません。 次に、%DEACTIVATE ステートメントがプリプロセッサー走査で検出され、 プリプロセッサー変数 PAYROLL が非活動化されます。 2 番目の %INCLUDE ステートメントが実行されると、PAYRL 内のストリングが もう一度プリプロセッサー入力の中に組み込まれます。 しかし、今回は、この組み込み済みテキストが走査されても置き換えはまったく 行われません。