Перейти до вмісту
ГОСТ 22558-89
/ 116

[В ЗАПИСИ { [ДО целое-3] ЛИТЕР]

[В ЗАВИСИМОСТИ ОТ имя-данного-1[

ОТ целое-4 ДО целое-5 ЛИТЕР

[ЗАПИСЬ 1 n<ULI,Tv t m I

I ЗАПИСИ / ДАННЫХ {имяанн0Г02/ • ■ • I ■

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

Индикатор уровня SD (ОС) указывает начало статьи опи­сания сортируемого или сливаемого файла и должен предшество­вать имени-файла.

Фразы, следующие за именем-файла-1, необязательны, и порядок их следования не существенен.

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

Возможность использования формата 2 фразы RECORD (В ЗАПИСИ) зависит от уровня модуля последовательного вво­да-вывода, поддерживаемого реализацией.

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

Фраза 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

(^ (ВОЗРАСТАНИЮ ) VTTinA , 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, не упорядочены в соответствии с фразами ASCEN­DING (ПО ВОЗРАСТАНИЮ КЛЮЧА) и 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 EXCEP­TION (ИСПОЛЬЗОВАТЬ ПОСЛЕ ПРОЦЕДУРЫ ОШИБКИ), неявно вызванной при выполнении оператора 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.

Побачили розбіжність з офіційним текстом?

Повідомити про неточність

Напишіть, що саме розходиться з офіційною публікацією. Код документа вкажіть у повідомленні — так ми швидше знайдемо потрібне місце.

Перейти до форми зворотного зв'язку

Дивіться також

Весь розділ →