д. Если указатель позиции файла был установлен предыдущим оператором READ (ЧИТАТЬ) и текущий ключ ссылки допускает дублирование, выбирается первая запись в файле, значение ключа которой либо равно указателю позиции файла и логическая позиция которой во множестве дубликатов следует сразу после записи, которая стала доступной благодаря предыдущему оператору READ (ЧИТАТЬ), либо значение ключа которой больше чем указатель позиции файла.
Если найдена запись, удовлетворяющая вышеприведенным правилам, она становится доступной в области записи, связанной с именем-файла-1.
Если запись, удовлетворяющая приведенным выше правилам, не найдена, то указатель позиции файла устанавливается для указания того, что не существует следующей логической записи, и выполнение продолжается согласно общему правилу (10).
Если запись сделалась доступной, указателю позиции файла приписывается значение текущего ключа ссылки записи, ставшей доступной.
Функционирование оператора READ (ЧИТАТЬ) не зависит от метода, используемого для согласования времени доступа со временем обработки; запись доступна объектной программе до выполнения повелительного-оператора-2 или повелительного-опе- ратора-4, если они указаны, или до выполнения любого.оператора, следующего за оператором READ (ЧИТАТЬ), если ни повелитель- ный-оператор-2, ни повелительный-оператор-4 не указаны.
Когда логические записи описаны более чем одной статьей описания записи, эти записи автоматически используют одну и ту же область памяти; это эквивалентно неявному переопределению области. По завершении оператора READ (ЧИТАТЬ) значения всех данных, находящихся вне диапазона текущей записи данных, не определены.
Фраза INTO (В) может быть указана в операторе READ (ЧИТАТЬ), если:
только одно описание записи подчиняется статье описания файла;
все имена-записей, связанные с именем-файла-1, и данное, на которое ссылается идентификатор-1, описывают групповое данное или элементарное буквенно-цифровое данное.
(8) Результат выполнения оператора READ (ЧИТАТЬ) с фразой INTO (В) эквивалентен применению следующих правил в указанном порядке:
выполняется тот же оператор READ (ЧИТАТЬ) без фразы INTO (В);
текущая запись пересылается из области записи в область, указываемую идентификатором-1, в соответствии с правилами для оператора MOVE (ПОМЕСТИТЬ) без фразы CORRESPONDING (СООТВЕТСТВЕННО). Размер текущей записи определяется: правилами, указанными для фразы RECORD (В ЗАПИСИ). Если статья описания файла содержит фразу RECORD IS VARYING (В ЗАПИСИ ПЕРЕМЕННОЕ ЧИСЛО ЛИТЕР), неявная пересылка является групповой. | Неявный оператор MOVE (ПОМЕСТИТЬ) не выполняется, если выполнение оператора READ (ЧИТАТЬ) было неуспешным. Индексы, связанные с идентификатором-1, вычисляются после того, к&к запись была прочитана и непосредственно перед ее пересылкой в данное. Запись доступна в области записи и в данном, на которое ссылается идентификатор-1.
Если во время выполнения оператора READ (ЧИТАТЬ) формата 2 указатель позиции файла указывает, что нет необязательного входного файла, возникает условие ошибки ключа, а выполнение оператора READ (ЧИТАТЬ) является неуспешным (см. ч. 8, п. 1.3.5).
При использовании формата 1 оператора READ (ЧИТАТЬ), если указатель позиции файла показывает, что не сущест- вует последующей логической записи, [ или что необязательный входной файл отсутствует, | имеет место в соответствии с указанной последовательностью следующее:
значение, полученное по указателю позиции файла, помещается в состояние ввода-вывода, соответствующее имени-файла-1, и указывает на условие «в конце» (см. п. 1.3.4 настоящей части);
если в операторе, вызвавшем условие, задана фраза AT END (В КОНЦЕ), управление передается повелительному-оператору-1 фразы AT END (В КОНЦЕ).
Никакая процедура^ USE AFTER STANDARD EXCEPTION (ИСПОЛЬЗОВАТЬ ПОСЛЕ СТАНДАРТНОЙ ПРОЦЕДУРЫ ОШИБКИ), связанная с именем-файла-1 не выполняется;
если фраза AT END (В КОНЦЕ) не задана, процедура USE AFTER STANDARD EXCEPTION (ИСПОЛЬЗОВАТЬ ПОСЛЕ СТАНДАРТНОЙ ПРОЦЕДУРЫ ОШИБКИ) должна быть связана с именем-файла-1, и эта процедура выполняется. Возврат из этой процедуры осуществляется к следующему после оператора READ (ЧИТАТЬ) выполнимому оператору.
Если возникает условие «в конце», выполнение оператора READ (ЧИТАТЬ) неуспешно.
Если во время выполнения оператора READ (ЧИТАТЬ) не возникают ни условие конца, ни условие ошибки ключа, фразы AT END (В КОНЦЕ) и INVALID KEY (ПРИ ОШИБКЕ КЛЮЧА) игнорируются, если они указаны, и выполняются следующие действия:
устанавливается значение указателя позиции файла и обновляется значение состояния ввода-вывода, связанного с именем- файла-1;
если возникает условие особой ситуации, не являющееся ни условием конца, ни условием ошибки ключа, управление передается процедуре USE AFTER EXCEPTION (ИСПОЛЬЗОВАТЬ ПОСЛЕ ПРОЦЕДУРЫ ОШИБКИ) согласно правилам для оператора USE (ИСПОЛЬЗОВАТЬ), применимого к имени-файла-1 (п. 4.8 настоящей части);
если условие особой ситуации не существует, запись становится доступной в области записи и выполняются любые неявные пересылки, предопределенные фразой INTO (В). Управление передается в точку выхода оператора READ (ЧИТАТЬ) или повели- тельному-оператору-2, если он указан. В последнем случае выполнение продолжается согласно правилам для операторов, указанных в повелительном-операторе-2. Если выполняется ветвление процедуры или условный оператор, вызывающие явную передачу управления, оно передается в соответствии с правилами для этих операторов; в противном случае после завершения выполнения по- велительного-оператора-2 управление передается в точку выхода оператора READ (ЧИТАТЬ).
После неуспешного выполнения оператора READ (ЧИТАТЬ) содержимое соответствующей области записи не определено, ключ ссылки для индексного файла не определен, а указатель позиции файла показывает, что правильная следующая запись не установлена.
Для индексного файла, для которого задан динамический доступ, оператор READ (ЧИТАТЬ) формата 1 вызывает считывание следующей логической записи из этого файла.
Для индексного файла с последовательным доступом записи, имеющие одно и то же дублирующееся значение дополнительного ключа, являющегося ключом ссылки, становятся доступными в том порядке, в котором они передавались при выполнении операторов WRITE (ПИСАТЬ) или REWRITE (ОБНОВИТЬ), которые привели к возникновению этих дублирующихся значений.
Для индексного файла, если фраза KEY (КЛЮЧ) задана в формате 2 оператора READ (ЧИТАТЬ), в качестве ключа ссылки при извлечении записи учреждается имя-данного-1, указанное во фразе KEY (КЛЮЧ). Для файла с динамическим доступом этот же ключ ссылки используется для всех последующих выполнений операторов HEAD (ЧИТАТЬ) формата 1 до тех пор, пока для этого файла не будет учрежден другой ключ ссылки.
Для индексного файла , если в операторе READ (ЧИТАТЬ) формата'2 не указан вариант KEY (КЛЮЧ),/ в качестве ключа ссылки прй извлечении записи учреждается основной ключ записи. [ Для файла с динамическим доступом этот же ключ ссылки используется для всех последующих выполнений оператора READ (ЧИТАТЬ) формата 1 до тех пор, пока для этого файла не будет учрежден другой ключ ссылки.
Выполнение оператора READ формата 2 устанавливает указатель позиции файла равным значению ключа ссылки. Это значение сравнивается со значением соответствующего данного в записях файла до тех пор, пока не будет найдена первая запись с равным значением.
При использовании дополнительного ключа в случае дублирующихся значений первой найденной записью будет первая запись в последовательности дубликатов, которые были переданы системе управления массовой памятью. | Найденная таким образом запись становится доступной в области записи, соответствующей имени-файла-1. Если таким образом не удается найти ни одной записи, возникает условие ошибки ключа, и выполнение оператора READ (ЧИТАТЬ) считается неуспешным (см. п. 1.3.5 настоящей части).
Если число позиций литер в прочитанной записи меньше минимального размера, указанного статьями описания записей для имени-файла-1, участок области записи, находящийся справа от последней прочитанной литеры, не определен. Если число позиций литер в прочитанной записи больше максимального размера, указанного статьями описания записей для имени-файла-1, запись усекается справа до максимального размера. В обоих случаях выполнение оператора. READ (ЧИТАТЬ) считается успешным, а состояние ввода-вывода указывает, что возникло несоответствие длины записи (см. п. 1.3.4 настоящей части).
Фраза END-READ (КОНЕЦ-ЧИТАТЬ) ограничивает область действия оператора READ (ЧИТАТЬ) (см. ч. 4, п. 6.4.3).
4.6. Оператор REWRITE (ОБНОВИТЬ)
Назначение
Оператор REWRITE (ОБНОВИТЬ) логически заменяет запись в файле на устройстве массовой памяти.
Общий формат
REWRITE имя-записи-1 [FROM идентификатор-1]
[INVALID KEY повелительный-оператор-1]
[NOT INVALID KEY повелительный-оператор-2] [END-REWRITE]
ОБНОВИТЬ имя-записи-1 [ИЗ ПОЛЯ идентификатор-1]
[ПРИ ОШИБКЕ КЛЮЧА повелительный-оператор-1] [БЕЗ ОШИБКИ КЛЮЧА повелительный-оператор-2] [КОНЕЦ-ОБНОВИТЬ]
Синтаксические правила
Ймя-записи-1 и идентификатор-1 не должны относиться к одной и той же области памяти.
Имя-записи-1 — это имя логической записи в секции файлов раздела данных. Оно может быть уточнено.
Если для соответствующего имени-файла не указана процедура USE AFTER STANDARD EXCEPTION (ИСПОЛЬЗОВАТЬ ПОСЛЕ СТАНДАРТНОЙ ПРОЦЕДУРЫ ОШИБКИ), фразы INVALID KEY (ПРИ ОШИБКЕ КЛЮЧА) и NOT INVALID KEY (БЕЗ ОШИБКИ КЛЮЧА) должны указываться.
4.6;4. Общие правила
Файл, связанный с именем-записи-1, должен быть файлом массовой памяти и должен быть открыт как входной-выходной во время выполнения этого оператора (см. п. 4.4 настоящей части).
Для файлов с последовательным, доступом последним оператором ввода-вывода для соответствующего файла перед выполнением оператора REWRITE (ОБНОВИТЬ) должен быть успешно выполненный оператор READ (ЧИТАТЬ). СУМП логически заменяет запись, которая была извлечена оператором READ (ЧИТАТЬ).
На. уровне 1 число позиций литер в записи, представленной именем-записи-1, должно быть равно числу позиций литер в обновляемой записи. На уровне 2 число позиций литер в записи, представленной именем-записи-1, может совпадать, а может и не сов- падать с числом позиций литер в обновляемой записи.
Логическая запись, включенная в файл при успешном выполнении оператора REWRITE (ОБНОВИТЬ), становится недоступной в области записи , за исключением случая, когда имя- файла, связанное с именем-записи-1, описано во фразе SAME RECORD AREA (ОБЩАЯ ОБЛАСТЬ ЗАПИСИ). Логическая запись доступна программе и как запись файла, связанного с именем-записи-1, и как запись других файлов, указанных в той же фразе SAME RECORD AREA (ОБЩАЯ ОБЛАСТЬ ЗАПИСИ), что и соответствующий выходной файл.
Выполнение оператора REWRITE (ОБНОВИТЬ) с фразой FROM (ИЗ ПОЛЯ) эквивалентно выполнению следующих операторов в указанном порядке:
оператор
MOVE идентификатор-1 ТО имя-записи-1.
ПОМЕСТИТЬ идентификатор-1 В имя-записи-1 соответственно 'правилам, описанным для оператора MOVE (ПОМЕСТИТЬ);
тот же оператор REWRITE (ОБНОВИТЬ) без фразы FROM (ИЗ ПОЛЯ).
После завершения выполнения оператора REWRITE (ОБНОВИТЬ) информация в области, указанной идентификатором-1, остается доступной, Даже если информация в области, указанной именем-записи-1, не является доступной), за исключением слу- I чая, определенного фразой SAME RECORD AREA (ОБЩАЯ [ОБЛАСТЬ ЗАПИСИ)'-;
Выполнение оператора REWRITE (ОБНОВИТЬ) не влияет на указатель позиции файла.
Выполнение оператора REWRITE (ОБНОВИТЬ) вызыва- ■ет обновление состояния ввода-вывода для файла, связанного с именем-записи-1 (см. п. 1.3.4 настоящей части).
При выполнении оператора REWRITE (ОБНОВИТЬ) логическая запись передается операционной системе.
Передача управления после успешного или неуспешного выполнения оператора REWRITE (ОБНОВИТЬ) зависит от наличия или отсутствия в операторе REWRITE (ОБНОВИТЬ) необязательных фраз INVALID KEY (ПРИ ОШИБКЕ КЛЮЧА) и NOT INVALID KEY (БЕЗ ОШИБКИ КЛЮЧА) (см. п. 1.3.5 настоящей части).
Фраза END-REWRITE (КОНЕЦ-ОБНОВИТЬ) ограничивает область действия оператора REWRITE (ОБНОВИТЬ) (см. ч. 4, in. 6.4.3).
Число позиций литер в записи, представленной именем- записи-1, должно быть не больше, чем наибольшее, и не меньше, чем наименьшее число позиций литер, определенное фразой RECORD IS VARYING (В ЗАПИСИ ПЕРЕМЕННОЕ ЧИСЛО ЛИТЕР), относящейся к имени-файла, связанного с именем-записи-1. В обоих случаях выполнение оператора REWRITE (ОБНОВИТЬ) является неуспешным, обновление не происходит, содержимое области записи не изменяется, а состояние ввода-вывода файла, связанного с именем-записи-1, становится равным значению, указывающему на причину возникновения ситуации (см. п. 1.3.4 настоящей части).
Для файла с последовательным доступом запись, которая должна быть заменена, определяется значением основного ключа. При выполнении оператора REWRITE (ОБНОВИТЬ), значение основного ключа заменяющей записи должно быть равно значению •основного ключа последней прочитанной из этого файла записи
.Для файла с произвольным или динамическим доступом запись, подлежащая замене, указывается значением основного- ключа записи.
Выполнение оператора REWRITE (ОБНОВИТЬ) для записи, которая имеет дополнительный ключ, производится следующим образом:
если значение конкретного дополнительного ключа не изменилось, порядок чтения в случае, когда этот ключ является ключом ссылки, остается неизменным;
если значение конкретного дополнительного ключа изменилось, последующий порядок считывания этой записи может измениться, когда этот конкретный дополнительный ключ является ключом ссылки. Если допускается дублирование значений ключа, запись логически размещается последней среди множества записей дубликатов, содержащих такое же значение дополнительного ключа записи, которое было помещено в запись.