О б щ и е правила
Фраза DATA RECORDS (ЗАПИСИ ДАННЫХ) модуля сортировки-слияния аналогична фразе DATA RECORDS (ЗАПИСИ ДАННЫХ) модуля последовательного ввода-вывода. Поэтому правила для фразы DATA RECORDS (ЗАПИСИ ДАННЫХ) см. в ч. 7, п. 3.5. Фраза DATA RECORDS (ЗАПИСИ ДАННЫХ) рассматривается в настоящем стандарте как устаревший элемент и будет удалена в следующей редакции стандарта.
Фраза RECORD (В ЗАПИСИ) модуля сортировки-слияния аналогична фразе RECORD (В ЗАПИСИ) модуля последовательного ввода-вывода. Поэтому правила для фразы RECORD (В ЗАПИСИ) см. ч. 7, п.3.8.
РАЗДЕЛ ПРОЦЕДУР В МОДУЛЕ СОРТИРОВКИ-СЛИЯНИЯ
Оператор MERGE (СЛИТЬ)
Назначение
Оператор MERGE (СЛИТЬ) комбинирует два или более файлов, одинаково упорядоченных по указанному набору ключей, и во время этого процесса делает записи доступными в порядке слияния процедуре вывода или выходному файлу.
Общий формат
„ (гчхт (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
(^ (ВОЗРАСТАНИЮ ) VTTin„A , n ]
ПО убыванию КЛЮЧА {имя-данного-1}... .
[АЛФАВИТ имя-алфавита-1]
ИСПОЛЬЗУЯ имя-файла-2 {имя-файла-3}...
ПРОЦЕДУРА ВЫВОДА имя-процедуры-1
[ПО имя-процедуры-2] ПОЛУЧАЯ {имя-файла-4} ...
Синтаксические правила
Оператор MERGE (СЛИТЬ) может указываться в любом месте раздела процедур, кроме декларатив.
Имя-файла-1 должно быть описано в статье описания сор- тируемого-сливаемого файла в разделе данных.
Если файл, представленный именем-файла-1, содержит записи переменной длины, размер записей, содержащихся в файлах, представленных именем-файла-2 и именем-файла-3, должен быть не меньше самой короткой и не больше самой длинной из записей, описанных для имени-файла-1. Если файл, представленный именем-файла-1, содержит записи фиксированной длины, размер записей, содержащихся в файлах, представленных именем-файла-2 и именем-файла-3, должен быть не больше, чем самая длинная запись, описанная для имени-файла-1.
Имя-данного-1 является именем ключа и подчиняется следующим правилам:
имена ключей должны быть описаны в записях, связанных с именем-файла-1;
имена ключей могут уточняться;
имена ключей не должны быть групповыми данными, содержащими переменно повторяющиеся данные;
если имя-файла-1 имеет более одного описания записи, то имена-данных, указанных как имена ключей, должны быть описаны только в одном из описаний записей. Одни и те же позиции лиг тер, определяемые именами ключей в одной статье описания записи, считаются ключами всех записей этого файла;
описания ключей не должны содержать фразу OCCURS (ПОВТОРЯЕТСЯ) или быть подчиненными статьям, имеющим фразу OCCURS (ПОВТОРЯЕТСЯ);
если файл, представленный именем-файла-1, содержит записи переменной длины, все имена ключей должны содержаться в первых х позициях литер записи, где х равно минимальному размеру записи, определенному для файла, представленного именем- файла-1.
В разделе данных статьи описания имени-файла-2, имени- файла-3, имени-файла-4 не должны иметь индикатор уровня SD (ОС).
В операторе MERGE (СЛИТЬ) не может быть указано несколько файлов, размещенных на одной катушке.
В пределах одного оператора MERGE (СЛИТЬ) никакое из имен-файлов не может указываться несколько раз.
Никакие два имени-файла в операторе MERGE (СЛИТЬ) не могут быть указаны в одной и той же фразе SAME AREA (ОБЩАЯ ОБЛАСТЬ), SAME SORT AREA (ОБЩАЯ ОБЛАСТЬ СОРТИРОВКИ), SAME SORT-MERGE AREA (ОБЩАЯ ОБЛАСТЬ СОРТИРОВКИ-СЛИЯНИЯ). Исключение составляют только име- на-файлов, относящиеся к фразе GIVING (ПОЛУЧАЯ) (см. ч. 7, пп. 2.13 и 2.5 настоящей части).
Слова THRU и THROUGH являются синонимами.
Если имя-файла-4 определяет индексный файл, первое определение имени-дэнного-1 должно быть связано с фразой ASCENDING (ПО ВОЗРАСТАНИЮ), а данное, представленное именем-данного-1, должно занимать те же позиции литер в записи, что и данное, соответствующее основному ключу записи файла.
Если указана фраза GIVING (ПОЛУЧАЯ), а файл, представленный именем-файла-4, содержит записи переменной длины, размер записей, содержащихся в файле, представленном именем- файла-1, должен быть не меньше, чем самая короткая, и не больше, чем самая длинная запись, описанная для имени-файла-4. Если файл, представленный именем-файла-4, содержит записи фиксированной длины, размер записей, содержащихся в файле, представленном именем-файла-1, должен быть не больше, чем самая длинная запись, описанная для имени-файла-4.
Общие правила
Оператор MERGE (СЛИТЬ) объединяет в один файл все записи, содержащиеся в файлах, указанных именем-файла-2 и именем-файла-3.
Если файл, представленный именем-файла-1, содержит только записи фиксированной длины, всякая запись файла, представленного именем-файла-2 или именем-файла-3, содержащая меньше литерных позиций, чем значение фиксированной длины, дополняется пробелами справа, начиная с первой позиции после последней литеры в записи, когда эта запись помещается в файл, представленный именем-файла-1.Указанные во фразе KEY (ПО ВОЗРАСТАНИЮ/УБЫВА- НИЮ КЛЮЧА) имена-данных перечисляются в операторе MERGE (СЛИТЬ) в порядке уменьшения значимости, независимо от того, как они распределены между фразами KEY (ПО ВОЗРАСТА- НИЮ/УБЫВАНИЮ КЛЮЧА). Согласно формату, имя-данного-1 — самый главный ключ, имя-данного-2 — следующий по значимости ключ и т. д.
Если указана фраза ASCENDING (ПО ВОЗРАСТАНИЮ КЛЮЧА), то сливаемая последовательность будет создаваться от наименьшего значения данных, указанных именами ключей, к наибольшему значению в соответствии с правилами сравнения в условии отношения.
Если указана фраза DESCENDING (ПО УБЫВАНИЮ КЛЮЧА), то сливаемая последовательность будет создаваться от наибольшего значения данных, указанных именами ключей, к наименьшему значению в соответствии с правилами сравнения операндов в условии отношения.
Если, в соответствии с правилами сравнения операндов в условиях отношения, значения всех ключей одной записи данных равны соответствующим значениям ключей одной или нескольких других записей данных, порядок поступления этих записей соответствует порядку указания входных файлов в операторе MERGE (СЛИТЬ); при этом все записи, связанные с одним входным файлом, поступают до поступления записей других входных файлов.
Основная последовательность при сравнении нечисловых данных определяется в начале выполнения оператора MERGE (СЛИТЬ) в следующем порядке старшинства:
во-первых, основная последовательность, установленная фразой COLLATING SEQUENCE (АЛФАВИТ), если она указана в операторе MERGE (СЛИТЬ);
во-вторых, основная последовательность, установленная как программный алфавит.
Если записи файлов, представленных именем-файла-2 и именем-файла-3, не упорядочены в соответствии с фразами ASCENDING (ПО ВОЗРАСТАНИЮ КЛЮЧА) и DESCENDING (ПО УБЫВАНИЮ КЛЮЧА) оператора MERGE (СЛИТЬ), результат оператора слияния не определен.
Все записи файлов, представленных именем-файла-2 и именем-файла-3, переносятся в файл, представленный именем-файла- 1. В начале выполнения оператора MERGE (СЛИТЬ) файлы, представленные именем-файла-2 и именем-файла-3, не должны быть открыты. Для каждого из файлов, представленных именем- файла-2 и именем-файла-3, выполнение оператора MERGE (СЛИТЬ) приводит к следующим действиям:
начинается обработка файла так, как будто был выполнен оператор OPEN (ОТКРЫТЬ) с фразой INPUT (ВХОДНОЙ). Если 580указана процедура вывода, то обработка начинается до передачи управления процедуре вывода;
логические записи получаются и передаются операции слияния. Каждая запись получается таким образом, как будто был выполнен оператор READ (ЧИТАТЬ) с фразами NEXT (СЛЕДУЮЩУЮ) и AT END (В КОНЦЕ);
обработка файла завершается так, как будто был выполнен оператор CLOSE (ЗАКРЫТЬ) без каких-либо дополнительных фраз. Если указана процедура вывода, это завершение не выполт няется до тех пор, пока управление не будет возвращено после выполнения последнего оператора процедуры вывода.
Эти неявные функции выполняются таким образом, что выполняются все соответствующие процедуры USE AFTER EXCEPTION/ ERROR (ИСПОЛЬЗОВАТЬ ПОСЛЕ ПРОЦЕДУРЫ ОШИБКИ).
Процедура вывода может состоять из любой процедуры, необходимой для выбора, изменения или копирования записей, поочередно доступных посредством оператора RETURN (ВЕРНУТЬ) в порядке слияния из файла, представленного именем-файла-1.
Процедура включает все операторы, выполняемые в результате передачи управления по операторам CALL (ВЫЗВАТЬ), EXIT (ВЫЙТИ), GO ТО (ПЕРЕЙТИ) и PERFORM (ВЫПОЛНИТЬ) в рамках процедуры вывода, а также все операторы декларативных процедур, выполняемых в результате выполнения операторов, находящихся в области действия процедуры вывода. В области действия процедуры вывода не должен выполняться ни один из операторов MERGE (СЛИТЬ), RELEASE (ПЕРЕДАТЬ), SORT (СОРТИРОВАТЬ) (см. ч. 4, п. 4.4).
Если процедура вывода определена, то управление передается ей в процессе выполнения оператора MERGE (СЛИТЬ). Компилятор вставляет механизм возврата в конец последней секции процедуры вывода. Когда управление достигает последнего оператора в процедуре вывода, механизм возврата обеспечивает окончание слияния, а затем передает управление следующему после оператора MERGE (СЛИТЬ) выполнимому оператору, Перед входом в процедуру вывода процедура слияния доходит до точки, в которой она, если потребуется, может выбрать очередную запись в порядке слияния. Операторы RETURN (ВЕРНУТЬ) в процедуре вывода являются запросами на получение следующей записи.
Во время выполнения процедуры вывода нельзя выполнять операторы, ссылающиеся на файлы, представленные име- нем-файла-2 или именем-файла-3, или область записи, связанную с именем-файла-2 или именем-файла-3. Во время выполнения любой процедуры, определенной оператором USE AFTER EXCEPTION (ИСПОЛЬЗОВАТЬ ПОСЛЕ ПРОЦЕДУРЫ ОШИБКИ), неявно вызванной при выполнении оператора MERGE (СЛИТЬ), нельзя выполнять операторы, ссылающиеся на файлы, представленные именем-файла-2, именем-файла-3 или именем-файла- 4, или область записи, связанную с именем-файла-2, именем-файла-3 или именем-файла-4.
Если указана фраза GIVING (ПОЛУЧАЯ), сливаемые записи записываются в файл, представленный именем-файла-4, неявной процедурой вывода для оператора MERGE (СЛИТЬ). В начале выполнения оператора MERGE (СЛИТЬ) файл, представленный именем-файла-4, не должен быть открыт. Для каждого файла, представленного именем-файла-4, выполнение оператором MERGE (СЛИТЬ) приводит к следующим действиям:
начинается обработка файла так, как будто выполнился оператор OPEN (ОТКРЫТЬ) с фразой OUTPUT (ВЫХОДНОЙ);
сливаемые логические записи записываются в файл так, как будто выполнился оператор READ (ПИСАТЬ) без каких-либо необязательных фраз.
Для файла с относительной организацией относительный ключ первой пересылаемой записи содержит значение- 1; второй пересылаемой записи — значение 2 и т. д. После выполнения оператора MERGE (СЛИТЬ) содержимое данного, указанного именем относительного ключа, указывает на последнюю запись, возвращенную в файл;
обработка файла завершается так, как будто выполнился оператор CLOSE (ЗАКРЫТЬ) без каких-либо необязательных фраз.
Эти неявные функции выполняются так, что будут выполняться связанные с ними процедуры USE AFTER EXCEPTION/ERROR (ИСПОЛЬЗОВАТЬ ПОСЛЕ ПРОЦЕДУРЫ ОШИБКИ), однако выполнение таких процедур USE (ИСПОЛЬЗОВАТЬ) не должно приводить к выполнению каких-либо операторов, Ссылающихся на файл, представленный именем-файла-4, или область записи, соответствующую имени-файла-4. При первой попытке записи с нарушением внешне определенных границ файла выполняется указанная для файла процедура USE AFTER STANDARD EXCEPTION/ ERROR (ИСПОЛЬЗОВАТЬ ПОСЛЕ СТАНДАРТНОЙ ПРОЦЕДУРЫ ОШИБКИ); если управление возвращается из процедуры USE (ИСПОЛЬЗОВАТЬ) или если такая процедура не указана, обработка файла завершается, как указано выше в п. Пв.
Если файл, представленный именем-файла-4, содержит только записи фиксированной длины, любая запись файла, представленного именем-файла-1, имеющая меньше позиций литер, чем значение фиксированной длины, дополняется пробелами слева направо, начиная с первой позиции литеры после последней литеры записи, когда эта запись возвращается в файл, представленный именем-файла-4.В программах, содержащих оператор MERGE (СЛИТЬ), может применяться сегментация, однако, имеют место следующие ограничения:
если оператор MERGE (СЛИТЬ) указан в секции, которая не является независимым сегментом, то любая процедура вывода, указанная оператором MERGE (СЛИТЬ), должна быть указана либо полностью вне независимых сегментов, либо целиком содер- жаться в одном независимом сегменте;
если оператор MERGE (СЛИТЬ) указан в независимом сегменте, то любая процедура вывода, на которую ссылается этот оператор, должна содержаться либо полностью вне независимых сегментов, либо целиком в пределах того же независимого сегмента, что и оператор MERGE (СЛИТЬ).
Оператор RELEASE (ПЕРЕДАТЬ)
Назначение
Оператор RELEASE (ПЕРЕДАТЬ) передает записи в начальную фазу операции сортировки.
Общий формат
RELEASE имя-записи-1 [FROM идентификатор-1]
ПЕРЕДАТЬ имя-записи-1 [ИЗ ПОЛЯ идентификатор-1]
С и н т а к с и ч е с к и е правила
Имя-записи-1 должно быть именем логической записи в соответствующей статье описания сортируемого иди сливаемого файла и может уточняться.
Оператор RELEASE (ПЕРЕДАТЬ) может использоваться только в пределах процедуры ввода, связанной с оператором SORT (СОРТИРОВАТЬ), для сортируемого или сливаемого файла, статья описания файла которого содержит это имя-записи-1.
Имя-записи-1 и идентификатор-1 не должны ссылаться на одну и ту же область памяти.