1. О б щ и е правила

  1. Фраза DATA RECORDS (ЗАПИСИ ДАННЫХ) модуля сор­тировки-слияния аналогична фразе DATA RECORDS (ЗАПИСИ ДАННЫХ) модуля последовательного ввода-вывода. Поэтому правила для фразы DATA RECORDS (ЗАПИСИ ДАННЫХ) см. в ч. 7, п. 3.5. Фраза DATA RECORDS (ЗАПИСИ ДАННЫХ) рас­сматривается в настоящем стандарте как устаревший элемент и будет удалена в следующей редакции стандарта.

  2. Фраза RECORD (В ЗАПИСИ) модуля сортировки-слияния аналогична фразе RECORD (В ЗАПИСИ) модуля последователь­ного ввода-вывода. Поэтому правила для фразы RECORD (В ЗА­ПИСИ) см. ч. 7, п.3.8.

  1. РАЗДЕЛ ПРОЦЕДУР В МОДУЛЕ СОРТИРОВКИ-СЛИЯНИЯ

    1. Оператор MERGE (СЛИТЬ)

      1. Назначение

Оператор MERGE (СЛИТЬ) комбинирует два или более фай­лов, одинаково упорядоченных по указанному набору ключей, и во время этого процесса делает записи доступными в порядке слия­ния процедуре вывода или выходному файлу.

  1. Общий формат

„ (гчхт (ASCENDING 1 17т^Г

MERGE имя-фаила-1 ON ; пс-сргмпшг } KEY

DESCENDING

{имя-данного-1}...

[COLLATING SEQUENCE IS имя-алфавита-1] USING имя-файла-2 {имя-файла-3} ...OUTPUT PROCEDURE IS имя-процедуры-1

Г ( THROUGH 1

THRU 1 имя-проце дуры-2

GIVING {имя-файла-4}...

СЛИТЬ имя-файла-1

(^ (ВОЗРАСТАНИЮ ) VTTinA , n ]

ПО убыванию КЛЮЧА {имя-данного-1}... .

[АЛФАВИТ имя-алфавита-1]

ИСПОЛЬЗУЯ имя-файла-2 {имя-файла-3}...

ПРОЦЕДУРА ВЫВОДА имя-процедуры-1

[ПО имя-процедуры-2] ПОЛУЧАЯ {имя-файла-4} ...

  1. Синтаксические правила

  1. Оператор MERGE (СЛИТЬ) может указываться в любом месте раздела процедур, кроме декларатив.

  2. Имя-файла-1 должно быть описано в статье описания сор- тируемого-сливаемого файла в разделе данных.

  3. Если файл, представленный именем-файла-1, содержит за­писи переменной длины, размер записей, содержащихся в файлах, представленных именем-файла-2 и именем-файла-3, должен быть не меньше самой короткой и не больше самой длинной из записей, описанных для имени-файла-1. Если файл, представленный име­нем-файла-1, содержит записи фиксированной длины, размер за­писей, содержащихся в файлах, представленных именем-файла-2 и именем-файла-3, должен быть не больше, чем самая длинная за­пись, описанная для имени-файла-1.

  4. Имя-данного-1 является именем ключа и подчиняется сле­дующим правилам:

  1. имена ключей должны быть описаны в записях, связанных с именем-файла-1;

  2. имена ключей могут уточняться;

  3. имена ключей не должны быть групповыми данными, содер­жащими переменно повторяющиеся данные;

  4. если имя-файла-1 имеет более одного описания записи, то имена-данных, указанных как имена ключей, должны быть описа­ны только в одном из описаний записей. Одни и те же позиции лиг тер, определяемые именами ключей в одной статье описания запи­си, считаются ключами всех записей этого файла;

  5. описания ключей не должны содержать фразу OCCURS (ПОВТОРЯЕТСЯ) или быть подчиненными статьям, имеющим фразу OCCURS (ПОВТОРЯЕТСЯ);

  6. если файл, представленный именем-файла-1, содержит за­писи переменной длины, все имена ключей должны содержаться в первых х позициях литер записи, где х равно минимальному раз­меру записи, определенному для файла, представленного именем- файла-1.

  1. В разделе данных статьи описания имени-файла-2, имени- файла-3, имени-файла-4 не должны иметь индикатор уровня SD (ОС).

  2. В операторе MERGE (СЛИТЬ) не может быть указано не­сколько файлов, размещенных на одной катушке.

  3. В пределах одного оператора MERGE (СЛИТЬ) никакое из имен-файлов не может указываться несколько раз.

  4. Никакие два имени-файла в операторе MERGE (СЛИТЬ) не могут быть указаны в одной и той же фразе SAME AREA (ОБ­ЩАЯ ОБЛАСТЬ), SAME SORT AREA (ОБЩАЯ ОБЛАСТЬ СОР­ТИРОВКИ), SAME SORT-MERGE AREA (ОБЩАЯ ОБЛАСТЬ СОРТИРОВКИ-СЛИЯНИЯ). Исключение составляют только име- на-файлов, относящиеся к фразе GIVING (ПОЛУЧАЯ) (см. ч. 7, пп. 2.13 и 2.5 настоящей части).

  5. Слова THRU и THROUGH являются синонимами.

  6. Если имя-файла-4 определяет индексный файл, первое оп­ределение имени-дэнного-1 должно быть связано с фразой ASCENDING (ПО ВОЗРАСТАНИЮ), а данное, представленное именем-данного-1, должно занимать те же позиции литер в записи, что и данное, соответствующее основному ключу записи файла.

  7. Если указана фраза GIVING (ПОЛУЧАЯ), а файл, пред­ставленный именем-файла-4, содержит записи переменной длины, размер записей, содержащихся в файле, представленном именем- файла-1, должен быть не меньше, чем самая короткая, и не боль­ше, чем самая длинная запись, описанная для имени-файла-4. Ес­ли файл, представленный именем-файла-4, содержит записи фик­сированной длины, размер записей, содержащихся в файле, пред­ставленном именем-файла-1, должен быть не больше, чем самая длинная запись, описанная для имени-файла-4.

  1. Общие правила

  1. Оператор MERGE (СЛИТЬ) объединяет в один файл все записи, содержащиеся в файлах, указанных именем-файла-2 и именем-файла-3.

  2. Если файл, представленный именем-файла-1, содержит только записи фиксированной длины, всякая запись файла, пред­ставленного именем-файла-2 или именем-файла-3, содержащая меньше литерных позиций, чем значение фиксированной длины, до­полняется пробелами справа, начиная с первой позиции после пос­ледней литеры в записи, когда эта запись помещается в файл, пред­ставленный именем-файла-1.Указанные во фразе KEY (ПО ВОЗРАСТАНИЮ/УБЫВА- НИЮ КЛЮЧА) имена-данных перечисляются в операторе MERGE (СЛИТЬ) в порядке уменьшения значимости, независимо от того, как они распределены между фразами KEY (ПО ВОЗРАСТА- НИЮ/УБЫВАНИЮ КЛЮЧА). Согласно формату, имя-данного-1 — самый главный ключ, имя-данного-2 — следующий по значи­мости ключ и т. д.

  1. Если указана фраза ASCENDING (ПО ВОЗРАСТАНИЮ КЛЮЧА), то сливаемая последовательность будет создаваться от наименьшего значения данных, указанных именами ключей, к наи­большему значению в соответствии с правилами сравнения в ус­ловии отношения.

  2. Если указана фраза DESCENDING (ПО УБЫВАНИЮ КЛЮЧА), то сливаемая последовательность будет создаваться от наибольшего значения данных, указанных именами ключей, к наи­меньшему значению в соответствии с правилами сравнения опе­рандов в условии отношения.

  1. Если, в соответствии с правилами сравнения операндов в условиях отношения, значения всех ключей одной записи данных равны соответствующим значениям ключей одной или нескольких других записей данных, порядок поступления этих записей соот­ветствует порядку указания входных файлов в операторе MERGE (СЛИТЬ); при этом все записи, связанные с одним входным фай­лом, поступают до поступления записей других входных файлов.

  2. Основная последовательность при сравнении нечисловых данных определяется в начале выполнения оператора MERGE (СЛИТЬ) в следующем порядке старшинства:

  1. во-первых, основная последовательность, установленная фразой COLLATING SEQUENCE (АЛФАВИТ), если она указана в операторе MERGE (СЛИТЬ);

  2. во-вторых, основная последовательность, установленная как программный алфавит.

  1. Если записи файлов, представленных именем-файла-2 и именем-файла-3, не упорядочены в соответствии с фразами ASCEN­DING (ПО ВОЗРАСТАНИЮ КЛЮЧА) и DESCENDING (ПО УБЫВАНИЮ КЛЮЧА) оператора MERGE (СЛИТЬ), результат оператора слияния не определен.

  2. Все записи файлов, представленных именем-файла-2 и име­нем-файла-3, переносятся в файл, представленный именем-файла- 1. В начале выполнения оператора MERGE (СЛИТЬ) файлы, представленные именем-файла-2 и именем-файла-3, не должны быть открыты. Для каждого из файлов, представленных именем- файла-2 и именем-файла-3, выполнение оператора MERGE (СЛИТЬ) приводит к следующим действиям:

начинается обработка файла так, как будто был выполнен оператор OPEN (ОТКРЫТЬ) с фразой INPUT (ВХОДНОЙ). Если 580указана процедура вывода, то обработка начинается до передачи управления процедуре вывода;

  1. логические записи получаются и передаются операции сли­яния. Каждая запись получается таким образом, как будто был выполнен оператор READ (ЧИТАТЬ) с фразами NEXT (СЛЕДУ­ЮЩУЮ) и AT END (В КОНЦЕ);

  2. обработка файла завершается так, как будто был выполнен оператор CLOSE (ЗАКРЫТЬ) без каких-либо дополнительных фраз. Если указана процедура вывода, это завершение не выполт няется до тех пор, пока управление не будет возвращено после вы­полнения последнего оператора процедуры вывода.

Эти неявные функции выполняются таким образом, что выпол­няются все соответствующие процедуры USE AFTER EXCEPTION/ ERROR (ИСПОЛЬЗОВАТЬ ПОСЛЕ ПРОЦЕДУРЫ ОШИБКИ).

  1. Процедура вывода может состоять из любой процедуры, необходимой для выбора, изменения или копирования записей, по­очередно доступных посредством оператора RETURN (ВЕРНУТЬ) в порядке слияния из файла, представленного именем-файла-1.

Процедура включает все операторы, выполняемые в результа­те передачи управления по операторам CALL (ВЫЗВАТЬ), EXIT (ВЫЙТИ), GO ТО (ПЕРЕЙТИ) и PERFORM (ВЫПОЛНИТЬ) в рамках процедуры вывода, а также все операторы декларативных процедур, выполняемых в результате выполнения операторов, на­ходящихся в области действия процедуры вывода. В области дей­ствия процедуры вывода не должен выполняться ни один из опе­раторов MERGE (СЛИТЬ), RELEASE (ПЕРЕДАТЬ), SORT (СОР­ТИРОВАТЬ) (см. ч. 4, п. 4.4).

  1. Если процедура вывода определена, то управление пере­дается ей в процессе выполнения оператора MERGE (СЛИТЬ). Компилятор вставляет механизм возврата в конец последней секции процедуры вывода. Когда управление достигает послед­него оператора в процедуре вывода, механизм возврата обеспе­чивает окончание слияния, а затем передает управление следую­щему после оператора MERGE (СЛИТЬ) выполнимому операто­ру, Перед входом в процедуру вывода процедура слияния дохо­дит до точки, в которой она, если потребуется, может выбрать оче­редную запись в порядке слияния. Операторы RETURN (ВЕР­НУТЬ) в процедуре вывода являются запросами на получение следующей записи.

  2. Во время выполнения процедуры вывода нельзя вы­полнять операторы, ссылающиеся на файлы, представленные име- нем-файла-2 или именем-файла-3, или область записи, связанную с именем-файла-2 или именем-файла-3. Во время выполнения любой процедуры, определенной оператором USE AFTER EXCEP­TION (ИСПОЛЬЗОВАТЬ ПОСЛЕ ПРОЦЕДУРЫ ОШИБКИ), неявно вызванной при выполнении оператора MERGE (СЛИТЬ), нельзя выполнять операторы, ссылающиеся на файлы, пред­ставленные именем-файла-2, именем-файла-3 или именем-файла- 4, или область записи, связанную с именем-файла-2, именем-фай­ла-3 или именем-файла-4.

  3. Если указана фраза GIVING (ПОЛУЧАЯ), сливаемые за­писи записываются в файл, представленный именем-файла-4, не­явной процедурой вывода для оператора MERGE (СЛИТЬ). В начале выполнения оператора MERGE (СЛИТЬ) файл, представ­ленный именем-файла-4, не должен быть открыт. Для каждого файла, представленного именем-файла-4, выполнение оператором MERGE (СЛИТЬ) приводит к следующим действиям:

  1. начинается обработка файла так, как будто выполнился оператор OPEN (ОТКРЫТЬ) с фразой OUTPUT (ВЫХОДНОЙ);

  2. сливаемые логические записи записываются в файл так, как будто выполнился оператор READ (ПИСАТЬ) без каких-либо не­обязательных фраз.

Для файла с относительной организацией относительный ключ первой пересылаемой записи содержит значение- 1; второй пере­сылаемой записи — значение 2 и т. д. После выполнения операто­ра MERGE (СЛИТЬ) содержимое данного, указанного именем от­носительного ключа, указывает на последнюю запись, возвращен­ную в файл;

  1. обработка файла завершается так, как будто выполнился оператор CLOSE (ЗАКРЫТЬ) без каких-либо необязательных фраз.

Эти неявные функции выполняются так, что будут выполнять­ся связанные с ними процедуры USE AFTER EXCEPTION/ERROR (ИСПОЛЬЗОВАТЬ ПОСЛЕ ПРОЦЕДУРЫ ОШИБКИ), однако выполнение таких процедур USE (ИСПОЛЬЗОВАТЬ) не должно приводить к выполнению каких-либо операторов, Ссылающихся на файл, представленный именем-файла-4, или область записи, соот­ветствующую имени-файла-4. При первой попытке записи с нару­шением внешне определенных границ файла выполняется указан­ная для файла процедура USE AFTER STANDARD EXCEPTION/ ERROR (ИСПОЛЬЗОВАТЬ ПОСЛЕ СТАНДАРТНОЙ ПРОЦЕ­ДУРЫ ОШИБКИ); если управление возвращается из процедуры USE (ИСПОЛЬЗОВАТЬ) или если такая процедура не указана, обработка файла завершается, как указано выше в п. Пв.

  1. Если файл, представленный именем-файла-4, содержит только записи фиксированной длины, любая запись файла, пред­ставленного именем-файла-1, имеющая меньше позиций литер, чем значение фиксированной длины, дополняется пробелами слева направо, начиная с первой позиции литеры после последней лите­ры записи, когда эта запись возвращается в файл, представленный именем-файла-4.В программах, содержащих оператор MERGE (СЛИТЬ), может применяться сегментация, однако, имеют место следующие ограничения:

  1. если оператор MERGE (СЛИТЬ) указан в секции, которая не является независимым сегментом, то любая процедура вывода, указанная оператором MERGE (СЛИТЬ), должна быть указана либо полностью вне независимых сегментов, либо целиком содер- жаться в одном независимом сегменте;

  2. если оператор MERGE (СЛИТЬ) указан в независимом сег­менте, то любая процедура вывода, на которую ссылается этот опе­ратор, должна содержаться либо полностью вне независимых сег­ментов, либо целиком в пределах того же независимого сегмента, что и оператор MERGE (СЛИТЬ).

  1. Оператор RELEASE (ПЕРЕДАТЬ)

    1. Назначение

Оператор RELEASE (ПЕРЕДАТЬ) передает записи в началь­ную фазу операции сортировки.

  1. Общий формат

RELEASE имя-записи-1 [FROM идентификатор-1]

ПЕРЕДАТЬ имя-записи-1 [ИЗ ПОЛЯ идентификатор-1]

  1. С и н т а к с и ч е с к и е правила

  1. Имя-записи-1 должно быть именем логической записи в соответствующей статье описания сортируемого иди сливаемого файла и может уточняться.

  2. Оператор RELEASE (ПЕРЕДАТЬ) может использоваться только в пределах процедуры ввода, связанной с оператором SORT (СОРТИРОВАТЬ), для сортируемого или сливаемого файла, ста­тья описания файла которого содержит это имя-записи-1.

  3. Имя-записи-1 и идентификатор-1 не должны ссылаться на одну и ту же область памяти.