14.7. Příkaz MERGE Příkaz MERGE provádí setřídění logických vět, které vstupují z několika vstupních souborů, přičemž v každém z těchto vstupních souborů musí být logické věty již setříděné podle téhož kritéria, podle něhož příkaz MERGE provádí třídění (viz 14.3.). Pokud by tomu tak nebylo, ani výstupní soubor nebude setříděný. Formát: MERGE jméno-třídicího-souboru { ON {ASCENDING | DESCENDING} KEY položka ... } ... USING jméno-souboru ... { GIVING jméno-souboru ... | OUTPUT PROCEDURE IS procedura [THRU procedura] } Místo slova THRU lze psát i ekvivalentní slovo THROUGH. Za slovem MERGE musí být uvedeno jméno některého třídicího souboru, definovaného pomocí klauzule SD. Během třídění se pak musí na tento třídicí soubor odvolávat všechny příkazy RETURN, jakož i příkazy pracující s 01 popsanými za SD a s jejich podřízenými položkami. V klauzuli USING lze uvést libovolný počet (v praxi ovšem většinou alespoň dva) vstupních souborů. Příkaz MERGE pracuje následujícím způsobem: 1) Nejprve otevře všechny vstupní soubory uvedené za USING (příkazem OPEN INPUT) a z každého získá první logickou větu (příkazem READ). (Vstupní soubor, který by neměl ani jednu logickou větu, okamžitě uzavře a vyřadí z dalšího zpracování.) 2) Pak otevře všechny výstupní soubory uvedené za GIVING (příkazem OPEN OUTPUT) resp. inicializuje výstupní rutinu (tzn. provede na ni příkaz PERFORM, což způsobí aktivaci návratového můstku na konci výstupní rutiny a odskok na její začátek; pak vyčká, až tato výstupní rutina požádá o první logickou větu příkazem RETURN, čímž se dostane řízení opět do příkazu MERGE). 3) Dále ze všech logických vět, které jsou právě k dispozici (z každého vstupního souboru, který dosud není dočten až do konce, je to právě jedna), vybere tu nejmenší (ve smyslu kritéria třídění) a odešle ji na výstup. To znamená: a) Je-li výstupem soubor resp. více souborů (GIVING), zapíše se do nich do všech tuto nejmenší logickou větu příkazem WRITE. b) Je-li výstupem výstupní rutina (OUTPUT PROCEDURE), předá jí příkaz MERGE tuto nejmenší logickou větu (tzn. uloží ji do 01 a vrátí řízení do toho "rozpracovaného" příkazu RETURN, který naposledy žádal o logickou větu; tento příkaz RETURN se dokončí a provádějí se následující příkazy výstupní rutiny; jakmile výstupní rutina požádá o další logickou větu příkazem RETURN, dostane se řízení opět do příkazu MERGE). 4) Příkaz MERGE přečte další logickou větu z téhož vstupního souboru, z něhož pocházela právě odeslaná nejmenší logická věta. Je-li tento vstupní soubor již vyčerpán (tj. uplatní se klauzule AT END příkazu READ), příkaz MERGE jej uzavře příkazem CLOSE a vyřadí jej z dalšího zpracování. Má-li k dispozici ještě nějaké logické věty z ostatních dosud nevyčerpaných souborů, přechází na provádění bodu 3. Body 3 a 4 se opakují tak dlouho, až jsou získány všechny logické věty ze všech vstupních souborů a odeslány na výstup. 5) Po vyčerpání všech vstupních souborů příkaz MERGE uzavře výstupní soubor (příkazem CLOSE) resp. ukončí výstupní rutinu (tzn. nastaví příznak způsobující uplatnění klauzule AT END a vrátí řízení do toho "rozpracovaného" příkazu RETURN, který naposledy žádal o logickou větu; tento příkaz RETURN se dokončí, přičemž se uplatní jeho klauzule AT END - žádná logická věta se již nepředává - a provádějí se závěrečné příkazy výstupní rutiny; po dosažení aktivovaného návratového můstku vygenerovaného na konci výstupní rutiny se vrátí řízení zpět do příkazu MERGE). Příkaz MERGE nyní provede jisté závěrečné akce, načež se přechází na provádění příkazu následujícího za příkazem MERGE. Poznámka: Všechny vstupní soubory (kromě těch, které neměly ani jednu logickou větu), jakož i výstupní soubory resp. soubory zpracovávané ve vstupní rutině jsou při provádění příkazu MERGE otevřeny současně, takže žádné dva z nich nesmí mít přidělenu touž magnetickou pásku.