Vsam
Vsam
Vsam
ARQUIVOS VSAM
O VSAM é um método de acesso de alta performance para uso com dispositivos de
acesso direto em ambiente de acesso virtual
TIPOS DE ORGANIZAÇÃO
ORGANIZAÇÃO SEQÜENCIAL
ORGANIZAÇÃO INDEXADA
Nesta organização, cada registro tem uma ou mais chaves incluídas, cada uma das
quais é associada a um índice. Cada índice provê um caminho lógico para o registro de
dados, de acordo com o conteúdo das KEYS incluídas nos registros. Os registro podem
ser de tamanho fixo ou variável.
Cada registro num arquivo indexado precisa ter uma KEY primária incluída. Quando
são incluídos, atualizados ou deletados registros, eles são identificados unicamente
pêlos valores de suas KEYS primárias. Assim, o valor de cada KEY primária precisa ser
único e não pode ser alterado quando o registro é atualizado. Cada registro num
arquivo indexado pode conter uma ou mais KEYS alternadas incluídas, possibilitando
um caminho alternativo de acesso aos registros, os valores contidos numa KEY
alternada não precisam ser únicos.
ORGANIZAÇÃO RELATIVA
Com esta organização, cada registro no arquivo é identificado pelo seu numero
relativo de registro. O arquivo pode ser imaginado como uma série de áreas, cada
uma das quais pode conter um registro lógico. Cada uma destas áreas é identificada
por um número relativo de registro, através do qual é feito o armazenamento ou a
pesquisa do registro.
TIPOS DE ARQUIVOS
O VSAM suporta três tipos de organização : Entry Sequence Data Set (ESDS), Key
Sequence Data Set (KSDS) e Relative Record Data Set (RRDS). Seus equivalentes em
COBOL, são, respectivamente : organização seqüencial, indexada e relativa.
ACESSO SEQÜENCIAL
REGISTROS CARREGADOS NA ORDEM DE ENTRADA
TODAS AS INSERÇÕES SÃO FEITAS NO FIM DO ARQUIVO
AS ATUALIZAÇÕES PODEM SER FEITAS SEM ALTERAÇÃO NO TAMANHO DO
REGISTRO
NÃO PODE SER FEITAS EXCLUSÕES
NÃO PRECISA SER RESERVADO FREE SPACE
Neste parágrafo devemos especificar a cláusula SELECT para arquivos INDEXADOS (KSDS), da
seguinte forma:
Formato:
SELECT nome-arquivo ASSIGN TO nome-externo
ORGANIZATION IS tipo-de-organização
ACCESS MODE IS tipo-de-acesso
RECORD KEY IS key-principal
[ALTERNATE RECORD KEY IS key-alternada[WITH DUPLICATES]]
[FILE STATUS IS campo-status].
Regras:
ORGANIZATION:
ACCESS MODE:
RECORD KEY: Campo do registro escolhido para identificar a chave de gravação e acesso
principal do arquivo. O arquivo só pode ter uma RECORD KEY. A variável referenciada como
RECORD KEY deve obrigatoriamente ser declarada como parte do registro na File Section.
ALTERNATE RECORD KEY: Qualquer outro campo do registro usado para pesquisa de
registros. Pode-se acrescentar a esta cláusula a declaração WITH DUPLICATES, que indica que
a pesquisa por esta chave pode conduzir a mais de um registro. O arquivo pode ter várias chaves
alternativas. A chave alternativa deve ser usada com cuidado porque aumenta o processamento
nas atualizações por manter mais índices no arquivo. A variável referenciada como ALTERNATE
RECORD KEY deve obrigatoriamente ser declarada como parte do registro na File Section.
Como já vimos, a FILE SECTION é usada para detalhar o conteúdo dos registros dos arquivos
que o programa irá ler/gravar. Na INPUT-OUTPUT SECTION (ENVIRONMENT DIVISION), cada
arquivo a ser tratado no programa tem uma instrução SELECT especificando e definindo um nome
para o arquivo. Na FILE SECTION precisamos agora detalhar cada um destes arquivos. Isto é
feito usando o parágrafo padrão FD – FILE DESCRIPTION.
Formato:
FD nome-do-arquivo.
01 nome-do-registro.
03 key-principal PIC
[03 key-alternada-1 ... PIC]
A regra para definição da estrutura do arquivo segue o mesmo padrão dos arquivos seqüenciais.
Deve ser observado que é obrigatório a definição da key-principal e das key-alternadas no
registro (caso existam).
PROCEDURE DIVISION
OPEN
Formato:
Regras:
2. OUTPUT: Permite abrir o arquivo para operações de gravação. Esta operação pode ser
especificada quando o arquivo estiver sendo criado. Um arquivo VSAM somente pode ser aberto
omo output uma única vez.Esta opção não permite comandos de leitura no arquivo.
Exemplo:
READ
Formato:
READ nome-arquivo
NEXT
[INTO nome-area-working]
[AT END instrução-imperativa]
[NOT AT END instrução imperativa]
[END-READ].
Regras:
2. INTO: O registro lido é movido para uma área de trabalho, de acordo com as regras da
instrução MOVE.
4. NOT AT END: Se esta condição existir serão executadas as instruções após a leitura do
registro.
Exemplo:
LER-ARQ-SEQENT.
PERFORM UNTIL WS-FIM = “N”
READ SEQENT01 NEXT INTO WS-REGISTRO-SEQENT01
AT END MOVE “S” TO WS-FIM
END-READ
END-PERFORM.
WRITE
Formato:
Regras:
1. O arquivo VSAM associado à instrução WRITE deve ser aberto no modo OUTPUT ou I-O.
Já existe no arquivo um registro com a mesma RECORD KEY primaria do registro a ser
gravado.
Já existe no arquivo um registro com a mesma ALTERNATE RECORD KEY para a qual
WITH DUPLICATES não foi especificada.
Exemplo:
WRITE REGISTRO-ARQUIVO FROM REGISTRO-AUXILIAR
INVALID KEY
PERFORM ROTINA-ERRO-GRAVAÇÃO
END-WRITE.
Formato:
READ nome-arquivo
[INTO nome-area-working]
Regras:
2. INTO: O registro lido é movido para uma área de trabalho, de acordo com as regras da
instrução MOVE
3. KEY IS: O NOME-CHAVE deve identificar uma chave de registro associada ao NOME-
ARQUIVO (chave primaria do registro ou qualquer chave alternada). Quando a opção KEY IS não
é declarada a leitura é feita pela chave primaria do arquivo.
4. INVALID KEY: Quando a opção INVALID KEY for especificada a instrução será executada
quando a chave de leitura, movida antes do comando READ, não for encontrada.
Exemplo:
REWRITE
A instrução REWRITE regrava o conteúdo de um registro já existente em um arquivo VSAM.
Formato:
Importante:
VSAM INDEXED FILE: O dado da RECORD KEY definida para o arquivo não pode ser
alterado. Os valores da ALTERNATE RECORD KEY no registro podem ser diferentes daquele no
registro a ser atualizado. O sistema assegura que acessos posteriores ao registro possam ser
baseados em qualquer das chaves do registro. Se uma condição INVALID KEY ocorrer é porque a
execução da instrução REWRITE não obteve sucesso na operação de atualização. Nesta situação
o registro no arquivo não foi afetado.
Regras:
1. O arquivo VSAM associado à instrução REWRITE deve ser aberto no modo I-O e um
comando de leitura (READ KEY IS) deve ter sido executado antes do comando REWRITE.
Exemplo:
DELETE
A instrução DELETE exclui um registro de um arquivo indexado ou relativo.
Formato:
DELETE nome-de-arquivo
[INVALID KEY instrução-imperativa]
[END-DELETE] ]
Regras:
1. NOME-DE-ARQUIVO: Deve estar definido na DATA DIVISION e deve ser de um arquivo
VSAM.
Nome-de-arquivo deve ser aberto como I-O.
2. INVALID KEY: Quando a instrução DELETE é executada, o VSAM tenta remover o registro
identificado pelo conteúdo da RECORD KEY. Se o arquivo não contiver o registro, uma
condição INVALID KEY irá ocorrer e instrução-imperativa será executada.
Exemplos:
MOVE ‘A001’ TO CODIGO-AGENCIA
DELETE CADAGENCIA
INVALID KEY
MOVE "N" TO WS-FLAG-DELETOU
END-DELETE.
FILE STATUS
Campo com o código de retorno dos comandos executados sobre o arquivo. Devem ter formato
PIC XX e os valores retornados estão na tabela abaixo:
STATUS DESCRIÇÃO
'00' 'SUCCESSFUL COMPLETION'
'02' 'DUPLICATE KEY, NON UNIQ. ALT INDX'
'04' 'READ, WRONG LENGTH RECORD'
'05' 'OPEN, FILE NOT PRESENT'
'CLOSE OPTION INCOMPAT FILE DEVICE OPEN IMPLIES TAPE; TAPE NOT
'07'
USED'
'10' 'END OF FILE'
'14' 'RRN > RELATIVE KEY DATA'
'20' 'INVALID KEY VSAM KSDS OR RRDS'
'21' 'SEQUENCE ERROR, ON WRITE OR CHANGING KEY ON REWRITE'
'22' 'DUPLICATE KEY'
'23' 'RECORD OR FILE NOT FOUND'
'BOUNDARY VIOLATION. WRITE PAST END OF KSDS RECORD. COBOL 370:
'24'
REL: REC# TOO BIG. OUT OF SPACE ON KSDS/RRDS FILE'
'30' 'PERMANENT DATA ERROR. DATA CHECK, PARITY CHK, HARDW'
'BOUNDARY VIOLATION. WRITE PAST END OF ESDS RECORD OR NO SPACE
'34'
TO ADD KSDS/RRDS RECORD. OUT OF SPACE ON SEQUENTIAL FILE'
'35' '35' 'OPEN, FILE NOT PRESENT'
'37' 'OPEN MODE INCOMPAT WITH DEVICE'
'38' 'OPENING FILE CLOSED WITH LOCK'
'39' 'OPEN, FILE ATTRIB CONFLICTING'
'41' 'OPEN, FILE IS OPEN'
'42' 'CLOSE, FILE IS CLOSED'
'43' 'DELETE OR REWRITE & NO GOOD READ FIRST'
'44' 'BOUNDARY VIOLATION/REWRITE REC TOO BIG'
'46' 'SEQUENTIAL READ WITHOUT POSITIONING'
'47' 'READING FILE NOT OPEN AS INPUT/IO/EXTEND'
'48' 'WRITE WITHOUT OPEN IO'
'49' 'DELETE OR REWRITE WITHOUT OPEN IO'
'90' 'UNKNOWN'
'91' 'VSAM - PASSWORD FAILURE'
'LOGIC ERROR/OPENING AN OPEN FILE OR READING OUTPUT FILE OR
'92'
WRITE INPUT FILE OR DEL/REW BUT NO PRIOR READ '
'93' 'VSAM - VIRTSTOR. RESOURCE NOT AVAILABLE'
000003 *-------------------------------------------------
000004 * EXEMPLO DE MANIPULACAO DE ARQUIVO VSAM - KSDS
000005 * LEITURA ALEATORIA DE REGISTROS
000006 *-------------------------------------------------
000007 ENVIRONMENT DIVISION.
000008 CONFIGURATION SECTION.
000009 SPECIAL-NAMES. DECIMAL-POINT IS COMMA.
000010 INPUT-OUTPUT SECTION.
000011 FILE-CONTROL.
000012 SELECT ARQTESTE ASSIGN ARQTESTE
000013 ORGANIZATION IS INDEXED
000014 ACCESS MODE IS DYNAMIC
000015 RECORD KEY IS ARQ-CHAVE
000016 FILE STATUS IS WRK-FS-ARQTESTE.
000017 DATA DIVISION.
000018 FILE SECTION.
000019 FD ARQTESTE.
000020 01 REG-ARQTESTE.
000021 03 ARQ-CHAVE.
000022 05 ARQ-CHV PIC 9(03).
000023 03 ARQ-NOME PIC X(30).
000024 WORKING-STORAGE SECTION.
000025 77 WRK-FS-ARQTESTE PIC X(02) VALUE SPACES.
000026 PROCEDURE DIVISION.
000027 OPEN INPUT ARQTESTE
000028 IF WRK-FS-ARQTESTE NOT EQUAL ZEROS
000029 DISPLAY 'ERRO NA ABERTURA'
000030 PERFORM ROTINA-ERRO
000031 END-IF.
000032 ACCEPT ARQ-CHV
000033 READ ARQTESTE
000034 IF WRK-FS-ARQTESTE NOT EQUAL ZEROS
000035 DISPLAY 'ERRO NA LEITURA'
000036 PERFORM ROTINA-ERRO
000037 ELSE
000038 PERFORM ROTINA-MOSTRADADOS
000039 END-IF.
000040 CLOSE ARQTESTE
000041 IF WRK-FS-ARQTESTE NOT EQUAL ZEROS
000042 DISPLAY 'ERRO NO FECHAMENTO'
000043 PERFORM ROTINA-ERRO
000044 END-IF.
000045 STOP RUN.
000003 *----------------------------------------------------------
000004 * EXEMPLO DE MANIPULACAO DE ARQUIVO VSAM - KSDS
000005 * GRAVACAO DE REGISTRO
000006 *----------------------------------------------------------
000007 ENVIRONMENT DIVISION.
000008 CONFIGURATION SECTION.
000009 SPECIAL-NAMES. DECIMAL-POINT IS COMMA.
000010 INPUT-OUTPUT SECTION.
000011 FILE-CONTROL.
000012 SELECT ARQTESTE ASSIGN ARQTESTE
000013 ORGANIZATION IS INDEXED
000014 ACCESS MODE IS DYNAMIC
000015 RECORD KEY IS ARQ-CHAVE
000016 FILE STATUS IS WRK-FS-ARQTESTE.
000017 DATA DIVISION.
000018 FILE SECTION.
000019 FD ARQTESTE.
000020 01 REG-ARQTESTE.
000021 03 ARQ-CHAVE.
000022 05 ARQ-CHV PIC 9(03).
000023 03 ARQ-NOME PIC X(30).
000024 WORKING-STORAGE SECTION.
000025 77 WRK-FS-ARQTESTE PIC X(02) VALUE SPACES.
000026 77 WRK-ERROABRE PIC X(20) VALUE 'ERRO ABERT. '.
000027 77 WRK-ERROFECHA PIC X(20) VALUE 'ERRO FECHAM.'.
000028 77 WRK-ERROGRAVA PIC X(20) VALUE 'ERRO GRAVACAO'.
000029 77 WRK-ERRO PIC X(20) VALUE SPACES.
000030 PROCEDURE DIVISION.
000031 OPEN I-O ARQTESTE
000032 IF WRK-FS-ARQTESTE NOT EQUAL ZEROS
000033 MOVE WRK-ERROABRE TO WRK-ERRO
000034 PERFORM ROTINA-ERRO
000035 END-IF.
000036 ACCEPT REG-ARQTESTE FROM SYSIN.
000037 WRITE REG-ARQTESTE.
000038 IF WRK-FS-ARQTESTE NOT EQUAL ZEROS
000039 MOVE WRK-ERROGRAVA TO WRK-ERRO
000040 PERFORM ROTINA-ERRO
000041 ELSE
000042 DISPLAY ARQ-CHV ' - ' ARQ-NOME ' = GRAVADO'
000043 END-IF.
000044 CLOSE ARQTESTE
000045 IF WRK-FS-ARQTESTE NOT EQUAL ZEROS
000046 MOVE WRK-ERROFECHA TO WRK-ERRO
000047 PERFORM ROTINA-ERRO
000048 END-IF.
000049 STOP RUN.
000050 ROTINA-ERRO.
000051 DISPLAY WRK-ERRO ' - ' WRK-FS-ARQTESTE.
000003 *------------------------------------------------
000004 * EXEMPLO DE MANIPULACAO DE ARQUIVO VSAM - KSDS
000005 * EXCLUSAO ALEATORIA DE REGISTROS
000006 *------------------------------------------------
000007 ENVIRONMENT DIVISION.
000008 CONFIGURATION SECTION.
000009 SPECIAL-NAMES. DECIMAL-POINT IS COMMA.
000010 INPUT-OUTPUT SECTION.
000011 FILE-CONTROL.
000012 SELECT ARQTESTE ASSIGN ARQTESTE
000013 ORGANIZATION IS INDEXED
000014 ACCESS MODE IS DYNAMIC
000015 RECORD KEY IS ARQ-CHAVE
000016 FILE STATUS IS WRK-FS-ARQTESTE.
000017 DATA DIVISION.
000018 FILE SECTION.
000019 FD ARQTESTE.
000020 01 REG-ARQTESTE.
000021 03 ARQ-CHAVE.
000022 05 ARQ-CHV PIC 9(03).
000023 03 ARQ-NOME PIC X(30).
000024 WORKING-STORAGE SECTION.
000025 77 WRK-FS-ARQTESTE PIC X(02) VALUE SPACES.
000026 PROCEDURE DIVISION.
000027 OPEN I-O ARQTESTE
000028 IF WRK-FS-ARQTESTE NOT EQUAL ZEROS
000029 DISPLAY 'ERRO NA ABERTURA'
000030 PERFORM ROTINA-ERRO
000031 END-IF.
000032 ACCEPT ARQ-CHV
000033 READ ARQTESTE
000034 IF WRK-FS-ARQTESTE NOT EQUAL ZEROS
000035 DISPLAY 'NAO ENCONTRADO - ' ARQ-CHV
000036 PERFORM ROTINA-ERRO
000037 ELSE
000038 DELETE ARQTESTE
000039 IF WRK-FS-ARQTESTE NOT EQUAL ZEROS
000040 DISPLAY 'NAO FOI POSSIVEL DELETAR '
000041 PERFORM ROTINA-ERRO
000042 ELSE
000043 DISPLAY ARQ-CHV ' - ' ARQ-NOME '= APAGADO'
000044 END-IF.
000045 CLOSE ARQTESTE
000046 IF WRK-FS-ARQTESTE NOT EQUAL ZEROS
000047 DISPLAY 'ERRO NO FECHAMENTO'
000048 PERFORM ROTINA-ERRO
000049 END-IF.
000050 STOP RUN.
000051 ROTINA-ERRO.
000052 DISPLAY WRK-FS-ARQTESTE.
000003 *-------------------------------------------------
000004 * EXEMPLO DE MANIPULACAO DE ARQUIVO VSAM - KSDS
000005 * LEITURA ALEATORIA DE REGISTROS
000006 *-------------------------------------------------
000007 ENVIRONMENT DIVISION.
000008 CONFIGURATION SECTION.
000009 SPECIAL-NAMES. DECIMAL-POINT IS COMMA.
000010 INPUT-OUTPUT SECTION.
000011 FILE-CONTROL.
000012 SELECT ARQTESTE ASSIGN ARQTESTE
000013 ORGANIZATION IS INDEXED
000014 ACCESS MODE IS SEQUENTIAL
000015 RECORD KEY IS ARQ-CHAVE
000016 FILE STATUS IS WRK-FS-ARQTESTE.
000017 DATA DIVISION.
000018 FILE SECTION.
000019 FD ARQTESTE.
000020 01 REG-ARQTESTE.
000021 03 ARQ-CHAVE.
000022 05 ARQ-CHV PIC 9(03).
000023 03 ARQ-NOME PIC X(30).
000024 WORKING-STORAGE SECTION.
000025 77 WRK-FS-ARQTESTE PIC X(02) VALUE SPACES.
000026 PROCEDURE DIVISION.
000027 OPEN INPUT ARQTESTE
000028 IF WRK-FS-ARQTESTE NOT EQUAL ZEROS
000029 DISPLAY 'ERRO NA ABERTURA'
000030 PERFORM ROTINA-ERRO
000031 END-IF.
000032 READ ARQTESTE
000033 IF WRK-FS-ARQTESTE NOT EQUAL ZEROS
000034 DISPLAY 'ERRO NA LEITURA'
000035 PERFORM ROTINA-ERRO
000036 ELSE
000037 PERFORM UNTIL WRK-FS-ARQTESTE = '10'
000038 DISPLAY 'ARQ-CHAVE = ' ARQ-CHAVE ' NOME = ' ARQ-NOME
000039 READ ARQTESTE
000040 END-PERFORM
000041 END-IF.
000042 CLOSE ARQTESTE
000043 IF WRK-FS-ARQTESTE NOT EQUAL ZEROS
000044 DISPLAY 'ERRO NO FECHAMENTO'
000045 PERFORM ROTINA-ERRO
000046 END-IF.
000047 STOP RUN.
000048 ROTINA-ERRO.
000049 DISPLAY WRK-FS-ARQTESTE.