STRING ステートメント・ストリングは、 2 つ以上のデータ項目やリテラルの内容の一部または全部を一緒にして 1 つのデータ項目にまとめます。
MOVE ステートメントをいくつも並べる代わりに 1 つの STRING ステートメントで済ませることができます。
フォーマット >>-STRING-------------------------------------------------------> .-------------------------------------------------------. | .----------------. | V V | | >------+-ID-1-------+-+--DELIMITED--+----+--+-ID-2-------+-+----> '-リテラル-1--' '-BY-' +-リテラル-2--+ '-SIZE-------' >--INTO--ID-3--+-------------------------+----------------------> '-+------+--POINTER--ID-4-' '-WITH-' >--+--------------------------------------+-------------------> '-+----+--OVERFLOW--命令ステートメント-1-' '-ON-' >--+-------------------------------------------+--------------> '-NOT--+----+--OVERFLOW--命令ステートメント-2-' '-ON-' >--+------------+---------------------------------------------->< '-END-STRING-'
次の規則が適用されます。
添え字、参照変更、可変長、可変位置、および関数 ID の評価は、STRING ステートメントの実行開始時に 1 回のみ行われます。したがって、ID-3 または ID-4 が、STRING ステートメントの中で添え字、参照修飾子、または関数引数として使用されているか、あるいは STRING ステートメントの中のいずれかの ID の長さまたは位置に影響する場合、これらの添え字、参照修飾子、可変長、可変位置、および関数について計算される値は、STRING ステートメントの結果によって影響されません。
ID-3 および ID-4 が同じストレージ域を占めると、 たとえそれらの ID が同じデータ記述項目によって定義されていても、 未定義の結果が生じます。
ID-1 または ID-2 が、ID-3 または ID-4 と同じストレージ域を占めると、 たとえそれらの ID が同じデータ記述項目によって定義されていても、未定義の結果が生じます。
STRING ステートメントの処理の詳細については、データ・フローを参照してください。
上記の状態のいずれかが生じると、オーバーフロー条件が起こり、 データはそれ以上転送されません。 ついで STRING 処理が終了し、NOT ON OVERFLOW 句が指定されている場合には、 それが無視され、制御は STRING ステートメントの終わりに移されるか、 または ON OVERFLOW 句が指定されていれば、命令ステートメント-1 に制御が移されます。
制御が命令ステートメント-1 に移された場合、命令ステートメント-1 に指定された各ステートメントの規則に従って、実行が継続されます。 プロシージャー・ブランチまたは明示的な制御の移動を引き起こす条件ステートメントが実行される場合、 制御はそれを起こすステートメントの規則に従って移されます。 そうでない場合、命令ステートメント-1 の実行完了時に、 制御は STRING ステートメントの最後に転送されます。
STRING ステートメントの実行時にオーバーフロー条件を生じる状態にならなければ、 データ転送の完了後、ON OVERFLOW 句は指定されていても無視されます。そして、制御は STRING ステートメントの終わりか、 または NOT ON OVERFLOW 句が指定されていれば命令ステートメント-2 に移されます。
制御が命令ステートメント-2 に移された場合、命令ステートメント-2 に指定された各ステートメントの規則に従って、実行が継続されます。 明示的な制御の移動を起こす、プロシージャーのブランチ・ステートメントや条件ステートメントが実行された場合は、制御はそのステートメントの規則に従って移されます。それ以外の場合は、命令ステートメント-2 の実行が完了すると、 制御は STRING ステートメントの終わりに移されます。
この明示的範囲終了符号は、STRING ステートメントの範囲を区切るために使用されます。 END-STRING 句を使用することによって、 条件 STRING ステートメントを他の条件ステートメントの中にネストすることができます。 END-STRING 句は、命令 STRING ステートメントと共に使用することもできます。
詳しくは、範囲区切りステートメントを参照してください。
STRING ステートメントの実行時に、文字は送り出しフィールドから受け取りフィールドに転送されます。送り出しフィールドが処理される順序は、それらが指定されている順序です。 次の規則が適用されます。
使用上の注意: ポインター・フィールドは、受け取りフィールドの長さに 1 を加えた値を入れられる十分な大きさに定義する必要があります。これは、転送終了時にシステムがポインターを更新する際の算術オーバーフローを防止します。
STRING ステートメントの実行が完了すると受け取りフィールドは、 データが移動された部分だけが変更されます。 受け取りフィールドの残りの部分には、 STRING ステートメントの今回の実行以前に存在していたデータが入っています。
次に示す STRING ステートメントを実行すると得られる結果は、ステートメントの後の図に図解したようなものになります。
STRING ID-1 ID-2 DELIMITED BY ID-3
ID-4 ID-5 DELIMITED BY SIZE
INTO ID-7 WITH POINTER ID-8
END-STRING
