Domingo 19 Mai 2024

Para acesso sequencial, a instrução READ faz o próximo registro lógico de um arquivo disponível para o programa de objeto.

Para acesso aleatório, a instrução READ faz um registro especificado de um arquivo de acesso direto disponível para o programa de objeto.

 

Quando a instrução READ é executada, o arquivo associado deve estar aberto no modo INPUT ou IO.

Formato 1: Declaração lida para a recuperação sequencial

>>-READ--file-name-1--+----------+--+--------+------------------>
                      +-NEXT-----+  '-RECORD-'   
                      '-PREVIOUS-'               

>--+--------------------+--------------------------------------->
   '-INTO--identifier-1-'   

>--+-------------------------------------+---------------------->
   '-+----+--END--imperative-statement-1-'   
     '-AT-'                                  

>--+------------------------------------------+--+----------+--><
   '-NOT--+----+--END--imperative-statement-2-'  '-END-READ-'   
          '-AT-'                                                

 

Formato 2: Declaração lida para a recuperação aleatória

>>-READ--file-name-1--+--------+--+--------------------+-------->
                      '-RECORD-'  '-INTO--identifier-1-'   

>--+--------------------------+--------------------------------->
   '-KEY--+----+--data-name-1-'   
          '-IS-'                  

>--+------------------------------------------+----------------->
   '-INVALID--+-----+--imperative-statement-3-'   
              '-KEY-'                             

>--+----------------------------------------------+------------->
   '-NOT INVALID--+-----+--imperative-statement-4-'   
                  '-KEY-'                             

>--+----------+------------------------------------------------><
   '-END-READ-'   

 

file-name-1

Deve ser definido em uma divisão de dados FD entrada.

 

NEXT RECORD

Lê o próximo registro na seqüência lógica de registros. NEXT é opcional quando o modo de acesso é sequencial e não tem efeito na execução da instrução READ.

Você deve especificar a frase NEXT ou a frase PREVIOUS para recuperar registros sequencialmente de arquivos no modo de acesso dinâmico.

 

PREVIOUS RECORD

Lê o registro anterior na seqüência lógica de registros. PREVIOUS aplica-se a arquivos indexados e relativos com o modo de acesso dinâmico.

Para recuperar registros sequencialmente, você deve especificar a frase NEXT ou a frase PREVIOUS para arquivos no modo de acesso dinâmico.

Se você especificar READ ... PREVIOUS e nenhum registro lógico anterior existe, a condição AT END ocorre e a instrução READ é mal sucedida.

Quando você especifica READ ... PREVIOUS, a configuração do indicador de posição de arquivo é usada para determinar qual registro deve ser disponibilizado de acordo com as seguintes regras:

  • Se o indicador de posição do arquivo indicar que nenhum registro anterior válido foi estabelecido, o READ não é bem-sucedido.
  • Se o indicador de posição do arquivo for posicionado pela execução de uma instrução OPEN, ocorrerá a condição AT END.
  • Se o indicador de posição de arquivo for estabelecido por uma instrução START anterior, o primeiro registro existente no arquivo cujo número de registro relativo (se um arquivo relativo) ou cujo valor de chave (se um arquivo indexado) for menor ou igual ao indicador de posição de arquivo é selecionado.
  • Se o indicador de posição de arquivo for estabelecido por uma instrução READ anterior, o primeiro registro existente no arquivo cujo número de registro relativo (se um arquivo relativo) ou cujo valor de chave (se um arquivo indexado) for menor que o indicador de posição de arquivo é selecionado.

 

INTO identifier-1

identifier-1 é o campo de recepção.

identifier-1 deve ser um campo de recepção válido para o envio de registo de entrada descrição selecionados de acordo com as regras da declaração MOVE.

As áreas de registro associados com o file-name-1 e identifier-1 não deve ser a mesma área de armazenamento.

Quando há apenas descrição um registro associado com file-name-1 ou todos os registros e o item de dados referenciado pelo identifier-1 descrevem um item alfanumérico elementar ou um item de grupo alfanumérico, o resultado da execução de uma instrução de leitura com o INTO Frase é equivalente à aplicação das seguintes regras na ordem especificada:

  • A execução da mesma instrução READ sem a expressão INTO.
  • O recorde atual é movido da área de registro para a área especificada pelo identifier-1 de acordo com as regras para a declaração se mover sem CORRESPONDING. O tamanho do registro atual é determinado pelas regras especificadas para a cláusula RECORD. Se a entrada de descrição do arquivo contiver uma cláusula RECORD IS VARYING, o movimento implícito é um movimento de grupo. A instrução MOVE implícita não ocorre se a execução da instrução READ não teve êxito. Qualquer referência ou modificação associado com identifier-1 é avaliada após o registro foi lido e imediatamente antes de ser movido para o item de dados. O registro está disponível tanto na área do registro e o item de dados referenciado pelo identifier-1.

Se identificador-1 é um campo de data, então a declaração MOVE implícita é realizada de acordo com o comportamento descrito em MOVE envolvendo campos de data .

Quando há várias descrições de registro associados com o file-name-1 e nem todos eles descrevem um item de grupo alfanumérico ou item alfanumérico elementar, as seguintes regras se aplicam:

  1. Se o arquivo referenciado por file-name-1 é descrito como contendo registros de comprimento variável, a movimentação do grupo terá lugar.
  2. Se o arquivo referenciado por file-name-1 é descrito como contendo registros de comprimento fixo, um movimento terá lugar de acordo com as regras para uma declaração movimento usando, como um campo de descrição de envio, o registro que especifica o maior número de posições de caracteres . Se existir mais de um tal registro, o registro campo de envio selecionado será o único entre os registros que aparece pela primeira vez sob a descrição do file-name-1 .

 

KEY IS

A frase KEY IS pode ser especificada somente para arquivos indexados. Dados-name-1 deve identificar uma chave de registro associado com file-name-1 . Dados-name-1 pode ser qualificada; Não pode ser subscrita.

 

AT END

Para acesso seqüencial, a frase AT END e um procedimento EXCEPTION / ERROR aplicável podem ser omitidos.

 

INVALID KEY

Tanto a frase INVALID KEY como um procedimento EXCEPTION / ERROR aplicável podem ser omitidos.

 

END-READ

Este terminador de escopo explícito serve para delimitar o escopo da instrução READ. END-READ permite que uma instrução READ condicional seja aninhada em outra instrução condicional. END-READ também pode ser usado com uma instrução READ imperativa.

 

Processamento de vários registros

  • Se mais de um registro de entrada A é associado com file-name-1, os registros automaticamente compartilham a mesma área de armazenamento; ou seja, eles são implicitamente redefinidos.
  • Depois que uma instrução READ é executada, somente os itens de dados dentro do intervalo do registro atual são substituídos;
  • Os itens de dados armazenados além desse intervalo são indefinidos. Se o intervalo do registro atual excede as entradas de descrição de registro para file-name-1, o registro é truncado à direita para o tamanho máximo. Em qualquer um desses casos, a instrução READ é bem-sucedida e o status IO é definido como 04 indicando um conflito de comprimento de registro ocorreu.

 

Modo de acesso sequencial

Formato 1 deve ser usado para todos os arquivos no modo de acesso sequencial.

A execução de uma instrução READ recupera o próximo registro lógico do arquivo. O próximo registro acessado é determinado pela organização do arquivo.

 

Arquivos sequenciais

O NEXT RECORD é o próximo registro em uma seqüência lógica de registros. A frase NEXT não precisa ser especificada; Ele não tem efeito na execução de instrução READ.

Se SELECT OPTIONAL for especificado na entrada de controle de arquivo para este arquivo e o arquivo não estiver disponível durante esta execução do programa de objeto, a execução da primeira instrução READ causa uma condição de fim; No entanto, como nenhum arquivo está disponível, o processamento de fim-de-arquivo definido pelo sistema não é executado.

 

AT END condition

Se o indicador de posição de arquivo indicar que não existe nenhum registro lógico seguinte ou se um arquivo de entrada opcional não está disponível, o seguinte ocorre na ordem especificada:

  • Um valor derivado do ajuste do indicador de posição do arquivo é colocada no estado de IO associado com file-name-1 para indicar a condição de-final.
  • Se a frase END AT é especificado na declaração causando a condição, o controle é transferido para imperative-statement-1 na frase AT END. Qualquer uso após procedimento de exceção padrão associado com file-name-1 não é executado.
  • Se a frase AT END não for especificada e existir um procedimento aplicável USE APÓS A EXCEÇÃO DE PADRÃO, o procedimento será executado. Retornar desse procedimento é para a próxima instrução executável após o final da instrução READ.

Tanto a frase AT END como um procedimento EXCEPTION / ERROR aplicável podem ser omitidos.

Quando a condição de fim ocorre, a execução da instrução READ é malsucedida. O conteúdo da área de registro associada é indefinido eo indicador de posição do arquivo é definido para indicar que nenhum registro próximo válido foi estabelecido.

 

Se uma condição AT-END não ocorrer durante a execução de uma instrução READ, a frase AT END é ignorada, se especificado, e ocorrem as seguintes ações:

  • O indicador de posição do arquivo é definido e o estado IO associado com file-name-1 é atualizado.
  • Se uma condição de exceção que não é uma condição na ponta existe, o controle é transferido para o fim da instrução de leitura após a execução de qualquer uso após procedimento de exceção padrão aplicável a file-name-1.

Se nenhum uso após procedimento de exceção padrão é especificado, o controle é transferido para o fim da instrução READ ou imperative-statement-2, se especificado.

  • Se nenhuma condição de exceção existe, o registro é disponibilizado na área de registro e qualquer movimento implícito resultante da presença de uma frase INTO é executado. Controle é transferido para o fim da instrução de leitura ou imperative-statement-2, se especificado. Neste último caso, a execução continua de acordo com as regras de cada instrução especificada no imperative-statement-2. Se um procedimento ramificação ou declaração condicional que faz com que a transferência explícita de controle é executado, controle é transferido de acordo com as regras para essa declaração; caso contrário, após a conclusão da execução de imperative-statement-2, o controle é transferido para o fim da instrução de leitura.

Após a execução malsucedida de uma instrução READ, o conteúdo da área de registro associada é indefinido e o indicador de posição do arquivo é definido para indicar que nenhum registro válido seguinte foi estabelecido. As tentativas de acessar ou mover dados para a área de registro depois de uma leitura bem sucedida pode resultar em uma violação de segmentação.

 

Arquivos indexados ou relativos

O NEXT RECORD é o próximo registro lógico na seqüência de teclas.

O PREVIOUS RECORD é o registro lógico precedente na seqüência de teclas.

Para arquivos indexados, a seqüência de teclas é a seqüência de valores ascendentes da chave de referência atual. Para arquivos relativos, a seqüência de teclas é a seqüência de valores ascendentes de números de registros relativos para registros que existem no arquivo.

Antes da instrução READ ser executada, o indicador de posição do arquivo deve ter sido definido por uma instrução OPEN, START ou READ bem sucedida. Quando a instrução READ é executada, o registro indicado pelo indicador de posição do arquivo é disponibilizado se ele ainda estiver acessível através do caminho indicado pelo indicador de posição do arquivo.

Se o registro não está mais acessível (porque ele foi excluído, por exemplo), o indicador de posição do arquivo é atualizado para apontar para a próxima (ou anterior) registro existente no arquivo, e esse registro é disponibilizado.

Para arquivos no modo de acesso sequencial, a frase NEXT não precisa ser especificada.

Para arquivos em modo de acesso dinâmico, a frase NEXT (ou a frase PREVIOUS) deve ser especificado para recuperação de registros sequenciais.

 

AT END condition

Esta condição existe quando o indicador de posição do arquivo indica que não existe nenhum registro lógico seguinte (ou não existe nenhum registo anterior) ou que um arquivo de entrada opcional não está disponível. Veja a discussão de ANTERIOR RECORD acima.

Se nem um at-end nem uma condição de chave inválida ocorre durante a execução de uma instrução READ, a frase AT END ou a frase INVALID KEY é ignorada, se especificado. As mesmas ações ocorrem como quando a condição de-final não ocorre com arquivos sequenciais (ver AT condição END ).

 

Arquivos indexados sequencialmente acessados

Quando uma ALTERNATE RECORD KEY com DUPLICATE é a chave de referência, registros de arquivo com valores de chave duplicados são disponibilizados na ordem em que foram colocados no arquivo.

 

Arquivos relativos acessados ​​sequencialmente

Se a cláusula RELATIVE KEY for especificada para este arquivo, a execução da instrução READ atualiza o item de dados RELATIVE KEY para indicar o número de registro relativo do registro sendo disponibilizado.

 

RANDOM access mode

Formato 2 deve ser especificado para arquivos indexados e relativos no modo de acesso aleatório, e também para arquivos no modo de acesso dinâmico quando a recuperação de registros for aleatória.

A execução da instrução READ depende da organização do arquivo, conforme explicado nas seções a seguir.

 

Arquivos indexados

A execução de uma instrução READ format-2 faz com que o valor da chave de referência seja comparado com o valor do item de dados chave correspondente nos registros do arquivo, até que o primeiro registro com um valor igual seja encontrado. O indicador de posição do arquivo está posicionado para este registro, que é disponibilizado. Se nenhum registro pode ser identificado assim, existe uma condição INVALID KEY e a execução da instrução READ não é bem-sucedida.

Se a frase KEY não for especificada, a tecla principal RECORD KEY torna-se a chave de referência para esta solicitação. Quando o acesso dinâmico é especificado, a chave principal RECORD também é usada como a chave de referência para execuções subsequentes de instruções sequenciais READ, até que uma chave de referência diferente seja estabelecida.

Quando a palavra-chave for especificado, os data-name-1 se torna a chave de referência para este pedido. Quando o acesso dinâmico é especificado, esta chave de referência é utilizada para execuções subsequentes de instruções READ sequenciais, até que uma chave de referência diferente seja estabelecida.

 

Arquivos relativos

A execução de uma instrução READ format-2 define o ponteiro do indicador de posição do arquivo para o registro cujo número de registro relativo está contido no item de dados RELATIVE KEY e torna esse registro disponível.

Se o arquivo não contiver esse registro, a condição INVALID KEY existe e a execução da instrução READ não é bem-sucedida.

A frase KEY não deve ser especificada para arquivos relativos.

 

Modo de acesso dinâmico

Para arquivos com organização indexada ou relativa, o modo de acesso dinâmico pode ser especificado na entrada de controle de arquivo. No modo de acesso dinâmico, pode-se usar a recuperação de registros sequenciais ou aleatórios, dependendo do formato utilizado.

Formato 1 com a frase NEXT deve ser especificado para recuperação sequencial. Todas as outras regras para acesso sequencial se aplicam.

 

Notas:

  • Se a cláusula FILE-STATUS for especificada na entrada de controle de arquivo, a chave de status de arquivo associada será atualizada quando a instrução READ for executada.
  • Após a execução da instrução READ sem êxito, o conteúdo da área de registro associada e o valor do indicador de posição do arquivo são indefinidos. As tentativas de acessar ou mover dados para a área de registro depois de uma leitura bem sucedida pode resultar em uma violação de segmentação.