Você está na página 1de 70

COBOL - Visão gerãl

Introdução ao COBOL
COBOL é uma linguagem de alto nível. É preciso entender como o COBOL funciona. Computadores só
entendem código de máquina, um fluxo binário de 0s e 1s. O código COBOL deve ser convertido em código
de máquina usando um compilador. Execute a fonte do programa por meio de um compilador. O compilador
primeiro verifica se há erros de sintaxe e depois os converte em linguagem de máquina. O compilador cria
um arquivo de saída que é conhecido como módulo de carga. Este arquivo de saída contém código
executável na forma de 0s e 1s.

Importância do COBOL
 COBOL foi a primeira linguagem de programação de alto nível amplamente utilizada. É uma
linguagem semelhante ao inglês que é amigável. Todas as instruções podem ser codificadas em
palavras simples em inglês.
 COBOL também é usado como uma linguagem de autodocumentação.
 COBOL pode lidar com grande processamento de dados.
 COBOL é compatível com suas versões anteriores.
 O COBOL possui mensagens de erro eficazes e, portanto, a resolução de bugs é mais fácil.

Características do COBOL
Linguagem padrão

COBOL é uma linguagem padrão que pode ser compilada e executada em máquinas como IBM AS/400,
computadores pessoais, etc.

Orientado à Negócios

COBOL foi projetado para aplicações orientadas a negócios relacionadas ao domínio financeiro, domínio de
defesa, etc. Ele pode lidar com grandes volumes de dados devido aos seus recursos avançados de
manipulação de arquivos.

Linguagem robusta

COBOL é uma linguagem robusta, pois suas inúmeras ferramentas de depuração e teste estão disponíveis
para quase todas as plataformas de computador.

Linguagem estruturada

Estruturas de controle lógico estão disponíveis em COBOL, o que facilita a leitura e modificação. COBOL
tem divisões diferentes, por isso é fácil de depurar.
COBOL – Configurãção do Ambiente
Instalando COBOL no Windows/Linux
Existem muitos emuladores de mainframe gratuitos disponíveis para Windows que podem ser usados para
escrever e aprender programas COBOL simples. Um desses emuladores é o Hercules, que pode ser
facilmente instalado no Windows seguindo algumas etapas simples. Hercules é uma implementação de
software de código aberto das arquiteturas System/370 e ESA/390 de mainframe, além da mais recente
arquitetura z/Architecture de 64 bits. Hercules é executado em Linux, Windows, Solaris, FreeBSD e Mac
OS X. Um usuário pode se conectar a um servidor mainframe de várias maneiras, como thin client, terminal
fictício, Virtual Client System (VCS) ou Virtual Desktop System (VDS). Cada usuário válido recebe um id
de login para entrar na interface Z/OS (TSO/E ou ISPF).

Compilando programas COBOL


Para executar um programa COBOL em modo batch usando JCL, o programa precisa ser compilado e um
módulo de carregamento é criado com todos os subprogramas. A JCL usa o módulo de carregamento e não o
programa real no momento da execução. As bibliotecas de carregamento são concatenadas e fornecidas ao
JCL no momento da execução usando JCLLIB ou STEPLIB.

Existem muitos utilitários de compilador de mainframe disponíveis para compilar um programa COBOL.
Algumas empresas corporativas usam ferramentas de Gerenciamento de Mudanças como o Endevor, que
compila e armazena todas as versões do programa. Isso é útil para rastrear as alterações feitas no programa.

//COMPILE JOB ,CLASS=6,MSGCLASS=X,NOTIFY=&SYSUID


//*
//STEP1 EXEC IGYCRCTL,PARM=RMODE,DYNAM,SSRANGE
//SYSIN DD DSN=MYDATA.URMI.SOURCES(MYCOBB),DISP=SHR
//SYSLIB DD DSN=MYDATA.URMI.COPYBOOK(MYCOPY),DISP=SHR
//SYSLMOD DD DSN=MYDATA.URMI.LOAD(MYCOBB),DISP=SHR
//SYSPRINT DD SYSOUT=*
//*

IGYCRCTL é um utilitário de compilador IBM COBOL. As opções do compilador são passadas usando o
parâmetro PARM. No exemplo acima, RMODE instrui o compilador a usar o modo de endereçamento
relativo no programa. O programa COBOL é transmitido usando o parâmetro SYSIN. Copybook é a
biblioteca usada pelo programa no SYSLIB.

Executando programas COBOL


Abaixo está um exemplo de JCL onde o programa MYPROG é executado usando o arquivo de entrada
MYDATA.URMI.INPUT e produz dois arquivos de saída gravados no spool.

//COBBSTEP JOB CLASS=6,NOTIFY=&SYSUID


//
//STEP10 EXEC PGM=MYPROG,PARM=ACCT5000
//STEPLIB DD DSN=MYDATA.URMI.LOADLIB,DISP=SHR
//INPUT1 DD DSN=MYDATA.URMI.INPUT,DISP=SHR
//OUT1 DD SYSOUT=*
//OUT2 DD SYSOUT=*
//SYSIN DD *
//CUST1 1000
//CUST2 1001
/*
O módulo de carregamento de MYPROG está localizado em MYDATA.URMI.LOADLIB. Isso é
importante observar que o JCL acima pode ser usado apenas para um módulo COBOL não-DB2.

Executando programas COBOL-DB2


Para executar um programa COBOL-DB2, um utilitário IBM especializado é usado no JCL e no programa;
A região do DB2 e os parâmetros necessários são passados como entrada para o utilitário.

As etapas seguidas na execução de um programa COBOL-DB2 são as seguintes:

 Quando um programa COBOL-DB2 é compilado, um DBRM (Database Request Module) é criado


junto com o módulo de carregamento. O DBRM contém as instruções SQL dos programas COBOL
com sua sintaxe verificada para estar correta.
 O DBRM está vinculado à região do DB2 (ambiente) na qual o COBOL será executado. Isso pode
ser feito usando o utilitário IKJEFT01 em um JCL.
 Após a etapa de ligação, o programa COBOL-DB2 é executado usando IKJEFT01 (novamente) com
a biblioteca de carregamento e a biblioteca DBRM como entrada para a JCL.

//STEP001 EXEC PGM=IKJEFT01


//*
//STEPLIB DD DSN=MYDATA.URMI.DBRMLIB,DISP=SHR
//*
//input files
//output files
//SYSPRINT DD SYSOUT=*
//SYSABOUT DD SYSOUT=*
//SYSDBOUT DD SYSOUT=*
//SYSUDUMP DD SYSOUT=*
//DISPLAY DD SYSOUT=*
//SYSOUT DD SYSOUT=*
//SYSTSPRT DD SYSOUT=*
//SYSTSIN DD *
DSN SYSTEM(SSID)
RUN PROGRAM(MYCOBB) PLAN(PLANNAME) PARM(parameters to cobol program) -
LIB('MYDATA.URMI.LOADLIB')
END
/*

No exemplo acima, MYCOBB é o programa COBOL-DB2 executado usando IKJEFT01. Observe que o
nome do programa, DB2 Sub-System Id (SSID) e o nome do plano DB2 são passados na instrução
SYSTSIN DD. A biblioteca DBRM é especificada no STEPLIB.
COBOL – Estruturã do Progrãmã
Uma estrutura de programa COBOL consiste em divisões, conforme mostrado na imagem a seguir:

Uma breve introdução dessas divisões é dada abaixo:

 SECTIONS: são a subdivisão lógica da lógica do programa. Uma seção é uma coleção de
parágrafos.
 PARAGRAPHS: são a subdivisão de uma seção ou divisão. É um nome definido pelo usuário ou
predefinido seguido por um ponto e consiste em zero ou mais frases/entradas.
 SENTENCES: são a combinação de uma ou mais declarações. As sentenças aparecem apenas na
divisão Procedimento. Uma frase deve terminar com um ponto.
 STATEMENTS: são instruções COBOL significativas que executam algum processamento.
 CHARACTERS: são os mais baixos na hierarquia e não podem ser divisíveis.

Você pode correlacionar os termos mencionados acima com o programa COBOL no exemplo a seguir.

PROCEDURE DIVISION.
A0000-FIRST-PARA SECTION.
FIRST-PARAGRAPH.
ACCEPT WS-ID - Statement-1 -----|
MOVE '10' TO WS-ID - Statement-2 |-- Sentence - 1
DISPLAY WS-ID - Statement-3 -----|
.
Divisões
Um programa COBOL consiste em quatro divisões.

Identification Division (Divisão de Identificação)

É a primeira e única divisão obrigatória de todo programa COBOL. O programador e o compilador usam
essa divisão para identificar o programa. Nesta divisão, PROGRAM-ID é o único parágrafo obrigatório.
PROGRAM-ID especifica o nome do programa que pode consistir de 1 a 30 caracteres.

Environment Division (Divisão de Meio Ambiente)

A divisão de ambiente é usada para especificar arquivos de entrada e saída para o programa. Consiste em
duas seções:

 Configuration section (seção de configuração): fornece informações sobre o sistema no qual o


programa é escrito e executado. É composto por dois parágrafos:
o Source computer (Computador de origem): Sistema usado para compilar o programa.
o Object computer (Computador objeto): Sistema usado para executar o programa.
 Input-Output section (seção de entrada-saída): fornece informações sobre os arquivos a serem
usados no programa. É composto por dois parágrafos:
o File control (Controle de arquivos): Fornece informações de conjuntos de dados externos
usados no programa.
o IO control (Controle de Entrada/Saída): Fornece informações dos arquivos usados no
programa.

ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SOURCE-COMPUTER. XXX-ZOS.
OBJECT-COMPUTER. XXX-ZOS.

INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT FILEN ASSIGN TO DDNAME
ORGANIZATION IS SEQUENTIAL.

Data Division (Divisão de dados)

A divisão de dados é usada para definir as variáveis usadas no programa. Consiste em quatro seções:

 File section (Seção do arquivo): é usado para definir a estrutura de registro do arquivo.
 Working-Storage section (Seção de armazenamento de trabalho): é usado para declarar variáveis
temporárias e estruturas de arquivos que são usadas no programa.
 Local-Storage section (Seção de armazenamento local): é semelhante à seção Working-Storage. A
única diferença é que as variáveis serão alocadas e inicializadas toda vez que um programa iniciar a
execução.
 Linkage section (Seção de ligação): é usado para descrever os nomes de dados recebidos de um
programa externo.
Programa COBOL

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT FILEN ASSIGN TO INPUT.
ORGANIZATION IS SEQUENTIAL.
ACCESS IS SEQUENTIAL.

DATA DIVISION.
FILE SECTION.
FD FILEN
01 NAME PIC A(25).

WORKING-STORAGE SECTION.
01 WS-STUDENT PIC A(30).
01 WS-ID PIC 9(5).

LOCAL-STORAGE SECTION.
01 LS-CLASS PIC 9(3).

LINKAGE SECTION.
01 LS-ID PIC 9(5).

PROCEDURE DIVISION.
DISPLAY 'Executing COBOL program using JCL'.
STOP RUN.

O JCL para executar o programa COBOL acima é o seguinte -

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C


//STEP1 EXEC PGM = HELLO
//INPUT DD DSN = ABC.EFG.XYZ,DISP = SHR

Quando você compila e executa o programa acima, ele produz o seguinte resultado -

Executing COBOL program using JCL

Procedure Division (Divisão de Procedimentos)

A divisão de procedimentos é usada para incluir a lógica do programa. Consiste em instruções executáveis
usando variáveis definidas na divisão de dados. Nesta divisão, os nomes de parágrafos e seções são
definidos pelo usuário.

Deve haver pelo menos uma instrução na divisão de procedimento. A última instrução para terminar a
execução nesta divisão é STOP RUN que é usada nos programas de chamada ou EXIT PROGRAM que é
usada nos programas chamados.
COBOL – Sintãxe Bãsicã
Conjunto de caracteres
'Characters' são os itens mais baixos na hierarquia e não podem ser divididos mais. O conjunto de
caracteres COBOL inclui 78 caracteres que são mostrados abaixo:

Sr. No. Descrição do Character


AZ
1
Alfabetos (maiúsculas)
az
2
Alfabetos (minúsculas)
0-9
3
Numérico
4 Space
+
5
Sinal de mais

6
Sinal de menos ou hífen
*
7
Asterisco
/
8
Barra para frente
$
9
Sinal de moeda
,
10
Vírgula
;
11
Ponto e vírgula
.
12
Ponto ou período decimal

13
Aspas
(
14
Parêntese Esquerdo

)
15
Parêntese Direito
>
16
Maior que
<
17
Menor que
:
18
Dois pontos
'
19
Apóstrofo
=
20
Sinal de igual
Folha de codificação (Coding Sheet)
O programa fonte do COBOL deve ser escrito em um formato aceitável para os compiladores. Os programas
COBOL são escritos em folhas de codificação COBOL. Existem 80 posições de caracteres em cada linha de
uma folha de codificação.

As posições dos caracteres são agrupadas nos cinco campos a seguir.

Posições Campo Descrição


Números de
1-6 Reservado para números de linha.
coluna
Pode ter asterisco (*) indicando comentários, hífen (-) indicando continuação e
7 Indicador
barra ( / ) indicando alimentação do formulário.
Todas as divisões, seções, parágrafos e algumas entradas especiais do COBOL
8-11 Área A
devem começar na Área A.
12-72 Área B Todas as instruções COBOL devem começar na área B.
Área de
73-80 Pode ser usado conforme a necessidade do programador.
Identificação

Exemplo

O exemplo a seguir mostra uma folha de codificação COBOL -

000100 IDENTIFICATION DIVISION. 000100


000200 PROGRAM-ID. HELLO. 000101
000250* THIS IS A COMMENT LINE 000102
000300 PROCEDURE DIVISION. 000103
000350 A000-FIRST-PARA. 000104
000400 DISPLAY “Coding Sheet”. 000105
000500 STOP RUN. 000106

JCLpara executar o programa COBOL acima -

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C


//STEP1 EXEC PGM = HELLO

Quando você compila e executa o programa acima, ele produz o seguinte resultado -

Coding Sheet

Cadeias de caracteres
As cadeias de caracteres são formadas pela combinação de caracteres individuais. Uma cadeia de caracteres
pode ser um

 Comentário,
 Literal, ou
 palavra resrvada COBOL.

Todas as cadeias de caracteres devem ser terminadas com separadores. Um separador é usado para separar
cadeias de caracteres.

Separadores usados com frequência: Espaço, Vírgula, Ponto, Apóstrofo, Parêntese Esquerdo/Direito e
Aspas.
Comentários (Comment)
Um comentário é uma cadeia de caracteres que não afeta a execução de um programa. Pode ser qualquer
combinação de caracteres.

Existem dois tipos de comentários -

Linha de comentários

Uma linha de comentário pode ser escrita em qualquer coluna. O compilador não verifica a sintaxe de uma
linha de comentário e a trata para documentação.

Entrada de comentário

As entradas de comentários são aquelas que estão incluídas nos parágrafos opcionais de uma Divisão de
Identificação. Eles são escritos na Área B e os programadores a utilizam como referência.

O texto destacado em negrito são as entradas comentadas no exemplo a seguir -

000100 IDENTIFICATION DIVISION. 000100


000150 PROGRAM-ID. HELLO. 000101
000200 AUTHOR. TUTORIALSPOINT. 000102
000250* THIS IS A COMMENT LINE 000103
000300 PROCEDURE DIVISION. 000104
000350 A000-FIRST-PARA. 000105
000360/ First Para Begins - Documentation Purpose 000106
000400 DISPLAY “Comment line”. 000107
000500 STOP RUN. 000108

JCLpara executar o programa COBOL acima -

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C


//STEP1 EXEC PGM = HELLO

Quando você compila e executa o programa acima, ele produz o seguinte resultado -

Comment Line

Literal
Literal é uma constante que é diretamente codificada em um programa. No exemplo a seguir, “Hello World”
é um literal.

PROCEDURE DIVISION.
DISPLAY 'Hello World'.

Existem dois tipos de literais, conforme discutido abaixo: Literal Alfanumérico e Literal Numérico.
Literal Alfanumérico

Os literais alfanuméricos são colocados entre aspas ou apóstrofos. O comprimento pode ser de até 160
caracteres. Um apóstrofo ou uma citação pode fazer parte de um literal somente se estiver emparelhado. O
início e o fim do literal devem ser iguais, apóstrofo ou aspas.

Exemplo

O exemplo a seguir mostra literais alfanuméricos válidos e inválidos -

Valid:
‘This is valid’
"This is valid"
‘This isn’’t invalid’

Invalid:
‘This is invalid”
‘This isn’t valid’

Literal Numérico

Um Literal Numérico é uma combinação de dígitos de 0 a 9, +, – ou ponto decimal. O comprimento pode


ser de até 18 caracteres. O sinal não pode ser o caractere mais à direita. O ponto decimal não deve aparecer
no final.

Exemplo

O exemplo a seguir mostra literais numéricos válidos e inválidos -

Valid:
100
+10.9
-1.9

Invalid:
1,00
10.
10.9-

Palavra COBOL
COBOL Word é uma cadeia de caracteres que pode ser uma palavra reservada (Reserved Words) ou uma
palavra definida pelo usuário (user-defined). O comprimento pode ser de até 30 caracteres.

User-Defined (Definido pelo Usuário)

Palavras definidas pelo usuário são usadas para nomear arquivos, dados, registros, nomes de parágrafos e
seções. Alfabetos, dígitos e hífens são permitidos ao formar palavras definidas pelo usuário. Você não pode
usar palavras reservadas COBOL.
Reserved Words (Palavras reservadas)

Palavras reservadas são palavras predefinidas em COBOL. Diferentes tipos de palavras reservadas que
usamos com frequência são os seguintes −

 Palavras-chave: como ADD, ACCEPT, MOVE, etc.


 Caracteres especiais: palavras como +, -, *, <, <=, etc.
 Constantes figurativas: são valores constantes como ZERO, SPACES, etc. Todos os valores
constantes de constantes figurativas são mencionados na tabela a seguir.

Constantes Figurativas

Sr. No. Constantes Figurativas e Descrição


HIGH-VALUES
1
Um ou mais caracteres que estarão na posição mais alta em ordem decrescente.
LOW-VALUES
2
Um ou mais caracteres têm zeros na representação binária.
ZERO/ZEROES
3
Um ou mais zeros dependendo do tamanho da variável.
SPACES
4
Um ou mais espaços.
QUOTES
5
Aspas simples ou duplas.
ALL literal
6
Preenche o item de dados com Literal.
COBOL - Tipos de dãdos
A Divisão de Dados é usada para definir as variáveis usadas em um programa. Para descrever dados em
COBOL, deve-se entender os seguintes termos -

 Nome dos dados


 Número do Nível
 Cláusula de Imagem
 Cláusula de Valor

01 TOTAL-STUDENTS PIC9(5) VALUE '125'.


Level Number Data Name Picture Clause Value Clause

Data Name (Nome dos dados)


Os Data names devem ser definidos na Data Division antes de serem usados na Procedure Division. Eles
devem ter um nome definido pelo usuário; palavras reservadas não podem ser usadas. Os Data names
fornecem referência aos locais de memória onde os dados reais são armazenados. Podem ser do tipo
elementar ou de grupo.

Exemplo

O exemplo a seguir mostra nomes de dados válidos e inválidos -

Valid:
WS-NAME
TOTAL-STUDENTS
A100
100B

Invalid:
MOVE (Reserved Words)
COMPUTE (Reserved Words)
100 (No Alphabet)
100+B (+ is not allowed)

Level Number (Número do Nível)


O level number é usado para especificar o nível de dados em um registro. Eles são usados para diferenciar
entre itens elementares e itens de grupo. Itens elementares podem ser agrupados para criar itens de grupo.

Sr. No. Level Number e Descrição


01
1
Entrada de descrição do registro
02 a 49
2
Itens de grupo e elementares
66
3
Renomear itens de cláusula
77
4
Itens que não podem ser subdivididos
88
5
Entrada do nome da condição
 Elementary items (Itens elementares): não pode ser mais dividido. Número de nível, nome de
dados, cláusula de imagem e cláusula de valor (opcional) são usados para descrever um item
elementar.

 Group items (Itens de Grupo): consistem em um ou mais itens elementares. Número de nível,
nome de dados e cláusula de valor (opcional) são usados para descrever um item de grupo. O número
do nível do grupo é sempre 01.

Exemplo

O exemplo a seguir mostra os itens Grupo e Elementar -

DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-NAME PIC X(25). ---> ELEMENTARY ITEM
01 WS-CLASS PIC 9(2) VALUE '10'. ---> ELEMENTARY ITEM

01 WS-ADDRESS. ---> GROUP ITEM


05 WS-HOUSE-NUMBER PIC 9(3). ---> ELEMENTARY ITEM
05 WS-STREET PIC X(15). ---> ELEMENTARY ITEM
05 WS-CITY PIC X(15). ---> ELEMENTARY ITEM
05 WS-COUNTRY PIC X(15) VALUE 'INDIA'. ---> ELEMENTARY ITEM

Picture Clause
A cláusula Picture (PIC) é usada para definir os seguintes itens -

 Tipo de dados: pode ser numérico, alfabético ou alfanumérico. O tipo numérico consiste apenas em
dígitos de 0 a 9. O tipo alfabético consiste em letras de A a Z e espaços. O tipo alfanumérico consiste
em dígitos, letras e caracteres especiais.
 Sinal: pode ser usado com dados numéricos. Pode ser + ou –.
 Posição do ponto decimal: pode ser usado com dados numéricos. A posição assumida é a posição
do ponto decimal e não incluída nos dados.
 Comprimento: define o número de bytes usados pelo item de dados.

Símbolos usados em uma cláusula Picture −

Sr. No. Símbolo e Descrição


9
1
Numérico
UMA
2
Alfabético
X
3
Alfanumérico
V
4
Decimal Implícito
S
5
Sinal
P
6
Decimal Presumido
Exemplo

O exemplo a seguir mostra o uso da cláusula PIC -

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-NUM1 PIC S9(3)V9(2).
01 WS-NUM2 PIC PPP999.
01 WS-NUM3 PIC S9(3)V9(2) VALUE -123.45.
01 WS-NAME PIC A(6) VALUE 'ABCDEF'.
01 WS-ID PIC X(5) VALUE 'A121$'.

PROCEDURE DIVISION.
DISPLAY "WS-NUM1 : "WS-NUM1.
DISPLAY "WS-NUM2 : "WS-NUM2.
DISPLAY "WS-NUM3 : "WS-NUM3.
DISPLAY "WS-NAME : "WS-NAME.
DISPLAY "WS-ID : "WS-ID.
STOP RUN.

JCLpara executar o programa COBOL acima -

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C


//STEP1 EXEC PGM = HELLO

Quando você compila e executa o programa acima, ele produz o seguinte resultado -

WS-NUM1 : +000.00
WS-NUM2 : .000000
WS-NUM3 : -123.45
WS-NAME : ABCDEF
WS-ID : A121$

Value Clause (Cláusula de Valor)


A cláusula Value é uma cláusula opcional que é usada para inicializar os itens de dados. Os valores podem
ser literal numérico, literal alfanumérico ou constante figurativa. Pode ser usado com itens de grupo e
elementares.

Exemplo

O exemplo a seguir mostra o uso da cláusula VALUE −

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-NUM1 PIC 99V9 VALUE IS 3.5.
01 WS-NAME PIC A(6) VALUE 'ABCD'.
01 WS-ID PIC 99 VALUE ZERO.

PROCEDURE DIVISION.
DISPLAY "WS-NUM1 : "WS-NUM1.
DISPLAY "WS-NAME : "WS-NAME.
DISPLAY "WS-ID : "WS-ID.
STOP RUN.
JCLpara executar o programa COBOL acima -

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C


//STEP1 EXEC PGM = HELLO

Quando você compila e executa o programa acima, ele produz o seguinte resultado -

WS-NUM1 : 03.5
WS-NAME : ABCD
WS-ID : 00

COBOL – Layout de Dados (Data Layout)

O layout COBOL é a descrição de uso de cada campo e os valores presentes nele. A seguir estão as entradas
de descrição de dados usadas no COBOL -

 Redefines Clause
 Renames Clause
 Usage Clause
 Copybooks

Redefines Clause (Cláusula de Redefinição)


A cláusula Redefines é usada para definir um armazenamento com descrição de dados diferente. Se um ou
mais itens de dados não forem usados simultaneamente, o mesmo armazenamento poderá ser utilizado para
outro item de dados. Assim, o mesmo armazenamento pode ser referido com diferentes itens de dados.

Sintaxe

A seguir está a sintaxe para a cláusula Redefines −

01 WS-OLD PIC X(10).


01 WS-NEW1 REDEFINES WS-OLD PIC 9(8).
01 WS-NEW2 REDEFINES WS-OLD PIC A(10).

A seguir estão os detalhes dos parâmetros usados -

 WS-OLD é um item redefinido


 WS-NEW1 e WS-NEW2 estão redefinindo o item

IMPORTANTE:

Os números de nível do item redefinido e do item redefinido devem ser os mesmos e não podem ser o
número de nível 66 ou 88.

Não use a cláusula VALUE com um item de redefinição.

Na Seção de Arquivo (File Section), não use uma cláusula redefine com número de nível 01.

A definição de redefine deve ser a próxima descrição de dados que você deseja redefinir.

Um item redefinido sempre terá o mesmo valor de um item redefinido.


Exemplo

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-DESCRIPTION.
05 WS-DATE1 VALUE '20140831'.
10 WS-YEAR PIC X(4).
10 WS-MONTH PIC X(2).
10 WS-DATE PIC X(2).
05 WS-DATE2 REDEFINES WS-DATE1 PIC 9(8).

PROCEDURE DIVISION.
DISPLAY "WS-DATE1 : "WS-DATE1.
DISPLAY "WS-DATE2 : "WS-DATE2.

STOP RUN.

JCLpara executar o programa COBOL acima -

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C


//STEP1 EXEC PGM = HELLO

Quando você compila e executa o programa acima, ele produz o seguinte resultado -

WS-DATE1: 20140831
WS-DATE2: 20140831

Cláusula de renomeação
A cláusula Renames é usada para dar nomes diferentes a itens de dados existentes. Ele é usado para
reagrupar os nomes de dados e dar um novo nome a eles. Os novos nomes de dados podem ser renomeados
em grupos ou itens elementares. O nível número 66 é reservado para renomeações.

Sintaxe

A seguir está a sintaxe para a cláusula Renames -

01 WS-OLD.
10 WS-A PIC 9(12).
10 WS-B PIC X(20).
10 WS-C PIC A(25).
10 WS-D PIC X(12).
66 WS-NEW RENAMES WS-A THRU WS-C.

A renomeação só é possível no mesmo nível. No exemplo acima, WS-A, WS-B e WS-C estão no mesmo
nível.

A definição de renomeação deve ser a próxima descrição de dados que você deseja renomear.

Não use Renames com os números de nível 01 ou 77.

Os nomes de dados usados para renomeações devem vir em sequência.

Itens de dados com cláusula de ocorrência não podem ser renomeados.


Exemplo

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-DESCRIPTION.
05 WS-NUM.
10 WS-NUM1 PIC 9(2) VALUE 20.
10 WS-NUM2 PIC 9(2) VALUE 56.
05 WS-CHAR.
10 WS-CHAR1 PIC X(2) VALUE 'AA'.
10 WS-CHAR2 PIC X(2) VALUE 'BB'.
66 WS-RENAME RENAMES WS-NUM2 THRU WS-CHAR2.

PROCEDURE DIVISION.
DISPLAY "WS-RENAME : " WS-RENAME.

STOP RUN.

JCLpara executar o programa COBOL acima -

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C


//STEP1 EXEC PGM = HELLO

Quando você compila e executa o programa acima, ele produz o seguinte resultado -

WS-RENAME: 56AABB

Cláusula de uso
A cláusula de uso especifica o sistema operacional no qual os dados de formato são armazenados. Não pode
ser usado com números de nível 66 ou 88. Se a cláusula de uso for especificada em um grupo, todos os
itens elementares terão a mesma cláusula de uso. As diferentes opções disponíveis com a cláusula de uso são
as seguintes −

Display

O item de dados é armazenado no formato ASCII e cada caractere ocupará 1 byte. É o uso padrão.

O exemplo a seguir calcula o número de bytes necessários -

01 WS-NUM PIC S9(5)V9(3) USAGE IS DISPLAY.


It requires 8 bytes as sign and decimal doesn't require any byte.

01 WS-NUM PIC 9(5) USAGE IS DISPLAY.


It requires 5 bytes as sign.

COMPUTACIONAL / COMP

O item de dados é armazenado em formato binário. Aqui, os itens de dados devem ser inteiros.

O exemplo a seguir calcula o número de bytes necessários -

01 WS-NUM PIC S9(n) USAGE IS COMP.

If 'n' = 1 to 4, it takes 2 bytes.


If 'n' = 5 to 9, it takes 4 bytes.
If 'n' = 10 to 18, it takes 8 bytes.
COMP-1

O item de dados é semelhante a Real ou Float e é representado como um número de ponto flutuante de
precisão única. Internamente, os dados são armazenados em formato hexadecimal. COMP-1 não aceita
cláusula PIC. Aqui 1 palavra é igual a 4 bytes.

COMP-2

O item de dados é semelhante a Longo ou Duplo e é representado como número de ponto flutuante de
precisão dupla. Internamente, os dados são armazenados em formato hexadecimal. COMP-2 não especifica a
cláusula PIC. Aqui 2 palavra é igual a 8 bytes.

COMP-3

O item de dados é armazenado em formato decimal compactado. Cada dígito ocupa meio byte (1 nibble) e o
sinal é armazenado no nibble mais à direita.

O exemplo a seguir calcula o número de bytes necessários -

01 WS-NUM PIC 9(n) USAGE IS COMP.


Number of bytes = n/2 (If n is even)
Number of bytes = n/2 + 1(If n is odd, consider only integer part)

01 WS-NUM PIC 9(4) USAGE IS COMP-3 VALUE 21.


It requires 2 bytes of storage as each digit occupies half a byte.

01 WS-NUM PIC 9(5) USAGE IS COMP-3 VALUE 21.


It requires 3 bytes of storage as each digit occupies half a byte.

Copybooks
Um copybook COBOL é uma seleção de código que define estruturas de dados. Se uma estrutura de dados
específica é usada em muitos programas, em vez de escrever a mesma estrutura de dados novamente,
podemos usar copybooks. Usamos a instrução COPY para incluir um copybook em um programa. A
instrução COPY é usada na seção WorkingStorage.

O exemplo a seguir inclui um copybook dentro de um programa COBOL -

DATA DIVISION.
WORKING-STORAGE SECTION.
COPY ABC.

Aqui ABC é o nome do copybook. Os seguintes itens de dados no copybook ABC podem ser usados dentro
de um programa.

01 WS-DESCRIPTION.
05 WS-NUM.
10 WS-NUM1 PIC 9(2) VALUE 20.
10 WS-NUM2 PIC 9(2) VALUE 56.
05 WS-CHAR.
10 WS-CHAR1 PIC X(2) VALUE 'AA'.
10 WS-CHAR2 PIC X(2) VALUE 'BB'.
COBOL - Declãrãçoes Condicionãis
As instruções condicionais são usadas para alterar o fluxo de execução dependendo de certas condições
especificadas pelo programador. Declarações condicionais sempre serão avaliadas como verdadeiras ou
falsas. As condições são usadas nas instruções IF, Evaluate e Perform. Os diferentes tipos de condições são
os seguintes -

 Declaração de Condição IF
 Condição de Relação
 Condição do Sinal
 Condição de Classe
 Condição-Nome Condição
 Condição Negada
 Condição Combinada

IF Condition Statement (Declaração de Condição IF)


A instrução IF verifica as condições. Se uma condição for verdadeira, o bloco IF é executado; e se a
condição for falsa, o bloco ELSE é executado.

END-IF é usado para finalizar o bloco IF. Para finalizar o bloco IF, um ponto pode ser usado em vez de
END-IF. Mas é sempre preferível usar END-IF para vários blocos IF.

IF ANINHADO: Blocos IF que aparecem dentro de outro bloco IF. Não há limite para a profundidade das
instruções IF aninhadas.

Sintaxe

A seguir está a sintaxe das declarações de condição IF -

IF [condition] THEN
[COBOL statements]
ELSE
[COBOL statements]
END-IF.

Exemplo

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-NUM1 PIC 9(9).
01 WS-NUM2 PIC 9(9).
01 WS-NUM3 PIC 9(5).
01 WS-NUM4 PIC 9(6).

PROCEDURE DIVISION.
A000-FIRST-PARA.
MOVE 25 TO WS-NUM1 WS-NUM3.
MOVE 15 TO WS-NUM2 WS-NUM4.

IF WS-NUM1 > WS-NUM2 THEN


DISPLAY 'IN LOOP 1 - IF BLOCK'

IF WS-NUM3 = WS-NUM4 THEN


DISPLAY 'IN LOOP 2 - IF BLOCK'
ELSE
DISPLAY 'IN LOOP 2 - ELSE BLOCK'
END-IF

ELSE
DISPLAY 'IN LOOP 1 - ELSE BLOCK'
END-IF.

STOP RUN.

JCLpara executar o programa COBOL acima -

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C


//STEP1 EXEC PGM = HELLO

Quando você compila e executa o programa acima, ele produz o seguinte resultado -

IN LOOP 1 - IF BLOCK
IN LOOP 2 - ELSE BLOCK

Condição de Relação
A condição de relação compara dois operandos, qualquer um dos quais pode ser um identificador, literal ou
expressão aritmética. A comparação algébrica de campos numéricos é feita independentemente do tamanho
e da cláusula de uso.

Para operandos não numéricos

Se dois operandos não numéricos de igual tamanho são comparados, então os caracteres são comparados da
esquerda com as posições correspondentes até o final ser alcançado. O operando que contém maior número
de caracteres é declarado maior.

Se dois operandos não numéricos de tamanho desigual são comparados, então o item de dados mais curto é
anexado com espaços no final até que o tamanho dos operandos se torne igual e então comparado de acordo
com as regras mencionadas no ponto anterior.

Sintaxe

Dada a seguir é a sintaxe das declarações de condição de relação -

[Data Name/Arithmetic Operation]

[IS] [NOT]

[Equal to (=),Greater than (>), Less than (<),


Greater than or Equal (>=), Less than or equal (<=) ]

[Data Name/Arithmetic Operation]


Exemplo

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-NUM1 PIC 9(9).
01 WS-NUM2 PIC 9(9).

PROCEDURE DIVISION.
A000-FIRST-PARA.
MOVE 25 TO WS-NUM1.
MOVE 15 TO WS-NUM2.

IF WS-NUM1 IS GREATER THAN OR EQUAL TO WS-NUM2 THEN


DISPLAY 'WS-NUM1 IS GREATER THAN WS-NUM2'
ELSE
DISPLAY 'WS-NUM1 IS LESS THAN WS-NUM2'
END-IF.

STOP RUN.

JCLpara executar o programa COBOL acima -

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C


//STEP1 EXEC PGM = HELLO

Quando você compila e executa o programa acima, ele produz o seguinte resultado -

WS-NUM1 IS GREATER THAN WS-NUM2

Sign Condition (Condição do Sinal)


A condição de sinal é usada para verificar o sinal de um operando numérico. Determina se um determinado
valor numérico é maior, menor ou igual a ZERO.

Sintaxe

A seguir está a sintaxe das declarações de condição de sinal -

[Data Name/Arithmetic Operation]

[IS] [NOT]

[Positive, Negative or Zero]

[Data Name/Arithmetic Operation]

Exemplo

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-NUM1 PIC S9(9) VALUE -1234.
01 WS-NUM2 PIC S9(9) VALUE 123456.

PROCEDURE DIVISION.
A000-FIRST-PARA.
IF WS-NUM1 IS POSITIVE THEN
DISPLAY 'WS-NUM1 IS POSITIVE'.

IF WS-NUM1 IS NEGATIVE THEN


DISPLAY 'WS-NUM1 IS NEGATIVE'.

IF WS-NUM1 IS ZERO THEN


DISPLAY 'WS-NUM1 IS ZERO'.

IF WS-NUM2 IS POSITIVE THEN


DISPLAY 'WS-NUM2 IS POSITIVE'.

STOP RUN.

JCLpara executar o programa COBOL acima -

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C


//STEP1 EXEC PGM = HELLO

Quando você compila e executa o programa acima, ele produz o seguinte resultado -

WS-NUM1 IS NEGATIVE
WS-NUM2 IS POSITIVE

Class Condition (Condição de Classe)


A condição de classe é usada para verificar se um operando contém apenas alfabetos ou dados numéricos.
Os espaços são considerados em ALFABÉTICO, ALFABÉTICO-INFERIOR e ALFABÉTICO-UPPER.

Sintaxe

A seguir está a sintaxe das instruções de condição de classe -

[Data Name/Arithmetic Operation>]

[IS] [NOT]

[NUMERIC, ALPHABETIC, ALPHABETIC-LOWER, ALPHABETIC-UPPER]

[Data Name/Arithmetic Operation]

Exemplo

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-NUM1 PIC X(9) VALUE 'ABCD '.
01 WS-NUM2 PIC 9(9) VALUE 123456789.

PROCEDURE DIVISION.
A000-FIRST-PARA.
IF WS-NUM1 IS ALPHABETIC THEN
DISPLAY 'WS-NUM1 IS ALPHABETIC'.

IF WS-NUM1 IS NUMERIC THEN


DISPLAY 'WS-NUM1 IS NUMERIC'.

IF WS-NUM2 IS NUMERIC THEN


DISPLAY 'WS-NUM2 IS NUMERIC'.

STOP RUN.

JCLpara executar o programa COBOL acima -

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C


//STEP1 EXEC PGM = HELLO

Quando você compila e executa o programa acima, ele produz o seguinte resultado -

WS-NUM1 IS ALPHABETIC
WS-NUM2 IS NUMERIC

Condition-name (Condição-nome)
Um nome de condição é um nome definido pelo usuário. Ele contém um conjunto de valores especificados
pelo usuário. Ele se comporta como variáveis booleanas. Eles são definidos com o número de nível 88.
Não terá uma cláusula PIC.

Sintaxe

A seguir está a sintaxe das declarações de condição definidas pelo usuário -

88 [Condition-Name] VALUE [IS, ARE] [LITERAL] [THRU LITERAL].

Exemplo

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-NUM PIC 9(3).
88 PASS VALUES ARE 041 THRU 100.
88 FAIL VALUES ARE 000 THRU 40.

PROCEDURE DIVISION.
A000-FIRST-PARA.
MOVE 65 TO WS-NUM.

IF PASS
DISPLAY 'Passed with ' WS-NUM ' marks'.

IF FAIL
DISPLAY 'FAILED with ' WS-NUM 'marks'.

STOP RUN.
JCLpara executar o programa COBOL acima -

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C


//STEP1 EXEC PGM = HELLO

Quando você compila e executa o programa acima, ele produz o seguinte resultado -

Passed with 065 marks

Condição Negada
A condição negada é fornecida usando a palavra-chave NOT. Se uma condição for verdadeira e dermos
NOT na frente dela, seu valor final será falso.

Sintaxe

A seguir está a sintaxe das declarações de condição negada -

IF NOT [CONDITION]
COBOL Statements
END-IF.

Exemplo

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-NUM1 PIC 9(2) VALUE 20.
01 WS-NUM2 PIC 9(9) VALUE 25.

PROCEDURE DIVISION.
A000-FIRST-PARA.

IF NOT WS-NUM1 IS LESS THAN WS-NUM2 THEN


DISPLAY 'IF-BLOCK'
ELSE
DISPLAY 'ELSE-BLOCK'
END-IF.

STOP RUN.

JCLpara executar o programa COBOL acima -

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C


//STEP1 EXEC PGM = HELLO

Quando você compila e executa o programa acima, ele produz o seguinte resultado -

ELSE-BLOCK
Condição Combinada
Uma condição combinada contém duas ou mais condições conectadas usando operadores lógicos AND ou
OR.

Sintaxe

A seguir está a sintaxe das declarações de condição combinadas -

IF [CONDITION] AND [CONDITION]


COBOL Statements
END-IF.

Exemplo

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-NUM1 PIC 9(2) VALUE 20.
01 WS-NUM2 PIC 9(2) VALUE 25.
01 WS-NUM3 PIC 9(2) VALUE 20.

PROCEDURE DIVISION.
A000-FIRST-PARA.

IF WS-NUM1 IS LESS THAN WS-NUM2 AND WS-NUM1=WS-NUM3 THEN


DISPLAY 'Both condition OK'
ELSE
DISPLAY 'Error'
END-IF.

STOP RUN.

JCLpara executar o programa COBOL acima -

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C


//STEP1 EXEC PGM = HELLO

Quando você compila e executa o programa acima, ele produz o seguinte resultado -

Both condition OK

Evaluate Verb
Avaliar verbo é uma substituição da série de instrução IF-ELSE. Pode ser usado para avaliar mais de uma
condição. É semelhante à instrução SWITCH em programas C.

Exemplo

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-A PIC 9 VALUE 0.
PROCEDURE DIVISION.
MOVE 3 TO WS-A.

EVALUATE TRUE
WHEN WS-A > 2
DISPLAY 'WS-A GREATER THAN 2'

WHEN WS-A < 0


DISPLAY 'WS-A LESS THAN 0'

WHEN OTHER
DISPLAY 'INVALID VALUE OF WS-A'
END-EVALUATE.

STOP RUN.

JCLpara executar o programa COBOL acima -

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C


//STEP1 EXEC PGM = HELLO

Quando você compila e executa o programa acima, ele produz o seguinte resultado -

WS-A GREATER THAN 2


COBOL - Declãrãçoes de Loop
Existem algumas tarefas que precisam ser feitas repetidamente, como ler cada registro de um arquivo até o
final. As instruções de loop usadas no COBOL são -

 Perform Thru
 Perform Until
 Perform Times
 Perform Varying

Perform Thru (Executar através)


Perform Thru é usado para executar uma série de parágrafos fornecendo os nomes do primeiro e do último
parágrafo na sequência. Após executar o último parágrafo, o controle é retornado.

In-line Perform

As instruções dentro do PERFORM serão executadas até que END-PERFORM seja alcançado.

Sintaxe

A seguir está a sintaxe do In-line perform -

PERFORM
DISPLAY 'HELLO WORLD'
END-PERFORM.

Out-of-line Perform

Aqui, uma instrução é executada em um parágrafo e, em seguida, o controle é transferido para outro
parágrafo ou seção.

Sintaxe

A seguir está a sintaxe de execução fora de linha -

PERFORM PARAGRAPH1 THRU PARAGRAPH2

Exemplo

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

PROCEDURE DIVISION.
A-PARA.
PERFORM DISPLAY 'IN A-PARA'
END-PERFORM.
PERFORM C-PARA THRU E-PARA.

B-PARA.
DISPLAY 'IN B-PARA'.
STOP RUN.

C-PARA.
DISPLAY 'IN C-PARA'.

D-PARA.
DISPLAY 'IN D-PARA'.

E-PARA.
DISPLAY 'IN E-PARA'.

JCLpara executar o programa COBOL acima.

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C


//STEP1 EXEC PGM = HELLO

Quando você compila e executa o programa acima, ele produz o seguinte resultado -

IN A-PARA
IN C-PARA
IN D-PARA
IN E-PARA
IN B-PARA

Perform Until (Executar até)


Em 'executar até', um parágrafo é executado até que a condição dada se torne verdadeira. 'Com teste antes' é
a condição padrão e indica que a condição é verificada antes da execução de instruções em um parágrafo.

Sintaxe

A seguir está a sintaxe de perform until -

PERFORM A-PARA UNTIL COUNT=5

PERFORM A-PARA WITH TEST BEFORE UNTIL COUNT=5

PERFORM A-PARA WITH TEST AFTER UNTIL COUNT=5

Exemplo

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-CNT PIC 9(1) VALUE 0.

PROCEDURE DIVISION.
A-PARA.
PERFORM B-PARA WITH TEST AFTER UNTIL WS-CNT>3.
STOP RUN.

B-PARA.
DISPLAY 'WS-CNT : 'WS-CNT.
ADD 1 TO WS-CNT.
JCLpara executar o programa COBOL acima -

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C


//STEP1 EXEC PGM = HELLO

Quando você compila e executa o programa acima, ele produz o seguinte resultado -

WS-CNT: 0
WS-CNT: 1
WS-CNT: 2
WS-CNT: 3

Perform Times
Em ‘perform times’, um parágrafo será executado o número de vezes especificado.

Sintaxe

A seguir está a sintaxe dos tempos de execução -

PERFORM A-PARA 5 TIMES.

Exemplo

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

PROCEDURE DIVISION.
A-PARA.
PERFORM B-PARA 3 TIMES.
STOP RUN.

B-PARA.
DISPLAY 'IN B-PARA'.

JCLpara executar o programa COBOL acima -

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C


//STEP1 EXEC PGM = HELLO

Quando você compila e executa o programa acima, ele produz o seguinte resultado -

IN B-PARA
IN B-PARA
IN B-PARA

Perform Varying (Executar Variação)


Na variação de execução, um parágrafo será executado até que a condição na frase Até se torne verdadeira.

Sintaxe

A seguir está a sintaxe de executar variando -


PERFORM A-PARA VARYING A FROM 1 BY 1 UNTIL A = 5.

Exemplo

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-A PIC 9 VALUE 0.

PROCEDURE DIVISION.
A-PARA.
PERFORM B-PARA VARYING WS-A FROM 1 BY 1 UNTIL WS-A=5
STOP RUN.

B-PARA.
DISPLAY 'IN B-PARA ' WS-A.

JCLpara executar o programa COBOL acima -

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C


//STEP1 EXEC PGM = HELLO

Quando você compila e executa o programa acima, ele produz o seguinte resultado -

IN B-PARA 1
IN B-PARA 2
IN B-PARA 3
IN B-PARA 4

GO TO Statement (IR PARA Declaração)


A instrução GO TO é usada para alterar o fluxo de execução em um programa. Nas instruções GO TO, a
transferência ocorre apenas na direção direta. É usado para sair de um parágrafo. Os diferentes tipos de
instruções GO TO usados são os seguintes −

Unconditional GO TO
GO TO para-name.

Conditional GO TO
GO TO para-1 para-2 para-3 DEPENDING ON x.

Se 'x' for igual a 1, o controle será transferido para o primeiro parágrafo; e se 'x' for igual a 2, então o
controle será transferido para o segundo parágrafo, e assim sucessivamente.

Exemplo

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-A PIC 9 VALUE 2.
PROCEDURE DIVISION.
A-PARA.
DISPLAY 'IN A-PARA'
GO TO B-PARA.

B-PARA.
DISPLAY 'IN B-PARA '.
GO TO C-PARA D-PARA DEPENDING ON WS-A.

C-PARA.
DISPLAY 'IN C-PARA '.

D-PARA.
DISPLAY 'IN D-PARA '.
STOP RUN.

JCLpara executar o programa COBOL acima:

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C


//STEP1 EXEC PGM = HELLO

Quando você compila e executa o programa acima, ele produz o seguinte resultado:

IN A-PARA
IN B-PARA
IN D-PARA
COBOL - Mãnipulãção de Strings
As instruções de manipulação de strings em COBOL são usadas para realizar várias operações funcionais
em strings. A seguir estão as instruções de manipulação de string -

 Inspect
 String
 Unstring

Inspect (Inspecionar)
O verbo inspecionar é usado para contar ou substituir os caracteres em uma string. As operações de string
podem ser executadas em valores alfanuméricos, numéricos ou alfabéticos. As operações de inspeção são
executadas da esquerda para a direita. As opções usadas para as operações de string são as seguintes -

Tallying

A opção Tallying (contagem) é usada para contar os caracteres da string.

Sintaxe

A seguir está a sintaxe da opção Tallying -

INSPECT input-string
TALLYING output-count FOR ALL CHARACTERS

Os parâmetros usados são -

 input-string: A string cujos caracteres devem ser contados.


 output-count: Item de dados para manter a contagem de caracteres.

Exemplo

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-CNT1 PIC 9(2) VALUE 0.
01 WS-CNT2 PIC 9(2) VALUE 0.
01 WS-STRING PIC X(15) VALUE 'ABCDACDADEAAAFF'.

PROCEDURE DIVISION.
INSPECT WS-STRING TALLYING WS-CNT1 FOR CHARACTER.
DISPLAY "WS-CNT1 : "WS-CNT1.
INSPECT WS-STRING TALLYING WS-CNT2 FOR ALL 'A'.
DISPLAY "WS-CNT2 : "WS-CNT2

STOP RUN.

JCLpara executar o programa COBOL acima.

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C


//STEP1 EXEC PGM = HELLO
Quando você compila e executa o programa acima, ele produz o seguinte resultado -

WS-CNT1: 15
WS-CNT2 : 06

Replacing (Substituindo)

A opção de substituição é usada para substituir os caracteres da string.

Sintaxe

A seguir está a sintaxe da opção Substituindo -

INSPECT input-string REPLACING ALL char1 BY char2.

O parâmetro usado é -

input-string: A string cujos caracteres devem ser substituídos de char1 para char2.

Exemplo

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-STRING PIC X(15) VALUE 'ABCDACDADEAAAFF'.

PROCEDURE DIVISION.
DISPLAY "OLD STRING : "WS-STRING.
INSPECT WS-STRING REPLACING ALL 'A' BY 'X'.
DISPLAY "NEW STRING : "WS-STRING.

STOP RUN.

JCLpara executar o programa COBOL acima.

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C


//STEP1 EXEC PGM = HELLO

Quando você compila e executa o programa acima, ele produz o seguinte resultado -

OLD STRING : ABCDACDADEAAAFF


NEW STRING : XBCDXCDXDEXXXFF

String
O verbo String é usado para concatenar as strings. Usando a instrução STRING, duas ou mais strings de
caracteres podem ser combinadas para formar uma string mais longa. A cláusula “Delimited By” é
obrigatória.
Sintaxe

A seguir está a sintaxe do verbo String -

STRING ws-string1 DELIMITED BY SPACE


ws-string2 DELIMITED BY SIZE
INTO ws-destination-string
WITH POINTER ws-count
ON OVERFLOW DISPLAY message1
NOT ON OVERFLOW DISPLAY message2
END-STRING.

A seguir estão os detalhes dos parâmetros usados -

 ws-string1 e ws-string2 : strings de entrada a serem concatenadas


 ws-string: string de saída
 ws-count : Usado para contar o comprimento da nova string concatenada
 Delimited especifica o fim da string
 Pointer e Overflow são opcionais

Exemplo

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-STRING PIC A(30).
01 WS-STR1 PIC A(15) VALUE 'Tutorialspoint'.
01 WS-STR2 PIC A(7) VALUE 'Welcome'.
01 WS-STR3 PIC A(7) VALUE 'To AND'.
01 WS-COUNT PIC 99 VALUE 1.

PROCEDURE DIVISION.
STRING WS-STR2 DELIMITED BY SIZE
WS-STR3 DELIMITED BY SPACE
WS-STR1 DELIMITED BY SIZE
INTO WS-STRING
WITH POINTER WS-COUNT
ON OVERFLOW DISPLAY 'OVERFLOW!'
END-STRING.

DISPLAY 'WS-STRING : 'WS-STRING.


DISPLAY 'WS-COUNT : 'WS-COUNT.

STOP RUN.

JCLpara executar o programa COBOL acima -

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C


//STEP1 EXEC PGM = HELLO

Quando você compila e executa o programa acima, ele produz o seguinte resultado -

WS-STRING: Bem-vindo
WS-COUNT: 25
Unstring
O verbo Unstring é usado para dividir uma string em várias substrings. A cláusula “Delimited By” é
obrigatória.

Sintaxe

A seguir está a sintaxe do verbo Unstring -

UNSTRING ws-string DELIMITED BY SPACE


INTO ws-str1, ws-str2
WITH POINTER ws-count
ON OVERFLOW DISPLAY message
NOT ON OVERFLOW DISPLAY message
END-UNSTRING.

Exemplo

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-STRING PIC A(30) VALUE 'WELCOME '.
01 WS-STR1 PIC A(7).
01 WS-STR2 PIC A(2).
01 WS-STR3 PIC A(15).
01 WS-COUNT PIC 99 VALUE 1.

PROCEDURE DIVISION.
UNSTRING WS-STRING DELIMITED BY SPACE
INTO WS-STR1, WS-STR2, WS-STR3
END-UNSTRING.

DISPLAY 'WS-STR1 : 'WS-STR1.


DISPLAY 'WS-STR2 : 'WS-STR2.
DISPLAY 'WS-STR3 : 'WS-STR3.

STOP RUN.

JCLpara executar o programa COBOL acima -

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C


//STEP1 EXEC PGM = HELLO
COBOL – Processãmento de Tãbelãs
Arrays em COBOL são conhecidos como tabelas. Uma matriz é uma estrutura de dados linear e é uma
coleção de itens de dados individuais do mesmo tipo. Os itens de dados de uma tabela são classificados
internamente.

Declaração de Tabela
A tabela é declarada na Data Division (Divisão de Dados). A cláusula Occurs é usada para definir uma
tabela. A cláusula Occurs indica a repetição da definição do nome dos dados. Pode ser usado somente com
números de nível que vão de 02 a 49. Não use cláusula Occurs com Redefines. A descrição da tabela
unidimensional e bidimensional é a seguinte.

Tabela Unidimensional

Em uma tabela unidimensional, a cláusula ocorre é usada apenas uma vez na declaração. WSTABLE é o
item do grupo que contém a tabela. O WS-B nomeia os elementos da tabela que ocorrem 10 vezes.

Sintaxe

A seguir está a sintaxe para definir uma tabela unidimensional -

01 WS-TABLE.
05 WS-A PIC A(10) OCCURS 10 TIMES.

Exemplo

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-TABLE.
05 WS-A PIC A(10) VALUE 'TUTORIALS' OCCURS 5 TIMES.

PROCEDURE DIVISION.
DISPLAY "ONE-D TABLE : "WS-TABLE.
STOP RUN.

JCLpara executar o programa COBOL acima -

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C


//STEP1 EXEC PGM = HELLO

Quando você compila e executa o programa acima, ele produz o seguinte resultado -

ONE-D TABLE : TUTORIALS TUTORIALS TUTORIALS TUTORIALS TUTORIALS


Tabela Bidimensional

Uma tabela bidimensional é criada com ambos os elementos de dados sendo de comprimento variável. Para
referência, percorra a sintaxe e tente analisar a tabela. A primeira matriz (WS-A) pode ocorrer de 1 a 10
vezes e a matriz interna (WS-C) pode ocorrer de 1 a 5 vezes. Para cada entrada de WS-A, haverá 5 entradas
correspondentes de WS-C.

Sintaxe

A seguir está a sintaxe para definir uma tabela bidimensional -

01 WS-TABLE.
05 WS-A OCCURS 10 TIMES.
10 WS-B PIC A(10).
10 WS-C OCCURS 5 TIMES.
15 WS-D PIC X(6).

Exemplo

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-TABLE.
05 WS-A OCCURS 2 TIMES.
10 WS-B PIC A(10) VALUE ' TUTORIALS'.
10 WS-C OCCURS 2 TIMES.
15 WS-D PIC X(6) VALUE ' POINT'.

PROCEDURE DIVISION.
DISPLAY "TWO-D TABLE : "WS-TABLE.

STOP RUN.

JCLpara executar o programa COBOL acima -

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C


//STEP1 EXEC PGM = HELLO

Subscript (Subscrito)
Os elementos individuais da tabela podem ser acessados usando subscript. Os valores subscritos podem
variar de 1 ao número de vezes que a tabela ocorre. Um subscript pode ser qualquer número positivo. Não
requer nenhuma declaração na divisão de dados. Ele é criado automaticamente com a cláusula occurs.

Exemplo

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-TABLE.
05 WS-A OCCURS 3 TIMES.
10 WS-B PIC A(2).
10 WS-C OCCURS 2 TIMES.
15 WS-D PIC X(3).
PROCEDURE DIVISION.
MOVE '12ABCDEF34GHIJKL56MNOPQR' TO WS-TABLE.
DISPLAY 'WS-TABLE : ' WS-TABLE.
DISPLAY 'WS-A(1) : ' WS-A(1).
DISPLAY 'WS-C(1,1) : ' WS-C(1,1).
DISPLAY 'WS-C(1,2) : ' WS-C(1,2).
DISPLAY 'WS-A(2) : ' WS-A(2).
DISPLAY 'WS-C(2,1) : ' WS-C(2,1).
DISPLAY 'WS-C(2,2) : ' WS-C(2,2).
DISPLAY 'WS-A(3) : ' WS-A(3).
DISPLAY 'WS-C(3,1) : ' WS-C(3,1).
DISPLAY 'WS-C(3,2) : ' WS-C(3,2).

STOP RUN.

JCLpara executar o programa COBOL acima -

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C


//STEP1 EXEC PGM = HELLO

Quando você compila e executa o programa acima, ele produz o seguinte resultado -

WS-TABLE : 12ABCDEF34GHIJKL56MNOPQR
WS-A(1) : 12ABCDEF
WS-C(1,1) : ABC
WS-C(1,2) : DEF
WS-A(2) : 34GHIJKL
WS-C(2,1) : GHI
WS-C(2,2) : JKL
WS-A(3) : 56MNOPQR
WS-C(3,1) : MNO
WS-C(3,2) : PQR

Index (Índice)
Elementos de tabela também podem ser acessados usando index. Um índice é um deslocamento de elemento
do início da tabela. Um index é declarado com a cláusula Occurs usando a cláusula INDEXED BY. O valor
do índice pode ser alterado usando a instrução SET e a opção PERFORM Varying.

Sintaxe

A seguir está a sintaxe para definir Índice em uma tabela -

01 WS-TABLE.
05 WS-A PIC A(10) OCCURS 10 TIMES INDEXED BY I.

Exemplo

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-TABLE.
05 WS-A OCCURS 3 TIMES INDEXED BY I.
10 WS-B PIC A(2).
10 WS-C OCCURS 2 TIMES INDEXED BY J.
15 WS-D PIC X(3).
PROCEDURE DIVISION.
MOVE '12ABCDEF34GHIJKL56MNOPQR' TO WS-TABLE.
PERFORM A-PARA VARYING I FROM 1 BY 1 UNTIL I >3
STOP RUN.

A-PARA.
PERFORM C-PARA VARYING J FROM 1 BY 1 UNTIL J>2.

C-PARA.
DISPLAY WS-C(I,J).

JCLpara executar o programa COBOL acima -

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C


//STEP1 EXEC PGM = HELLO

Quando você compila e executa o programa acima, ele produz o seguinte resultado -

ABC
DEF
GHI
JKL
MNO
PQR

Set Statement (Definir Declaração)


A instrução set é usada para alterar o valor do índice. O verbo set é usado para inicializar, incrementar ou
decrementar o valor do índice. É usado com Search e Search All para localizar elementos na tabela.

Sintaxe

A seguir está a sintaxe para usar uma instrução Set -

SET I J TO positive-number
SET I TO J
SET I TO 5
SET I J UP BY 1
SET J DOWN BY 5

Exemplo

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-TABLE.
05 WS-A OCCURS 3 TIMES INDEXED BY I.
10 WS-B PIC A(2).
10 WS-C OCCURS 2 TIMES INDEXED BY J.
15 WS-D PIC X(3).

PROCEDURE DIVISION.
MOVE '12ABCDEF34GHIJKL56MNOPQR' TO WS-TABLE.
SET I J TO 1.
DISPLAY WS-C(I,J).
SET I J UP BY 1.
DISPLAY WS-C(I,J).

STOP RUN.
JCLpara executar o programa COBOL acima.

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C


//STEP1 EXEC PGM = HELLO

Quando você compila e executa o programa acima, ele produz o seguinte resultado -

ABC
JKL

Search (Procurar)
Search é um método de pesquisa linear, que é usado para localizar elementos dentro da tabela. Ele pode ser
executado em tabelas classificadas e não classificadas. É usado apenas para tabelas declaradas por frase de
index. Ele começa com o valor inicial de index. Se o elemento procurado não for encontrado, então o index
é incrementado automaticamente em 1 e continua até o final da tabela.

Exemplo

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-TABLE.
05 WS-A PIC X(1) OCCURS 18 TIMES INDEXED BY I.
01 WS-SRCH PIC A(1) VALUE 'M'.

PROCEDURE DIVISION.
MOVE 'ABCDEFGHIJKLMNOPQR' TO WS-TABLE.
SET I TO 1.
SEARCH WS-A
AT END DISPLAY 'M NOT FOUND IN TABLE'
WHEN WS-A(I) = WS-SRCH
DISPLAY 'LETTER M FOUND IN TABLE'
END-SEARCH.

STOP RUN.

JCLpara executar o programa COBOL acima.

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C


//STEP1 EXEC PGM = HELLO

Quando você compila e executa o programa acima, ele produz o seguinte resultado -

LETTER M FOUND IN TABLE

Search All (Pesquisar tudo)


Search All é um método de busca binário, que é usado para encontrar elementos dentro da tabela. A tabela
deve estar em ordem de classificação para a opção Pesquisar tudo. O índice não requer inicialização. Na
busca binária, a tabela é dividida em duas metades e determina em qual metade do elemento procurado está
presente.

Este processo se repete até que o elemento seja encontrado ou o fim seja alcançado.
Exemplo

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-TABLE.
05 WS-RECORD OCCURS 10 TIMES ASCENDING KEY IS WS-NUM INDEXED BY I.
10 WS-NUM PIC 9(2).
10 WS-NAME PIC A(3).

PROCEDURE DIVISION.
MOVE '12ABC56DEF34GHI78JKL93MNO11PQR' TO WS-TABLE.
SEARCH ALL WS-RECORD
AT END DISPLAY 'RECORD NOT FOUND'
WHEN WS-NUM(I) = 93
DISPLAY 'RECORD FOUND '
DISPLAY WS-NUM(I)
DISPLAY WS-NAME(I)

END-SEARCH.

JCLpara executar o programa COBOL acima -

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C


//STEP1 EXEC PGM = HELLO

Quando você compila e executa o programa acima, ele produz o seguinte resultado -

RECORD FOUND
93
MNO
COBOL – Mãnipulãção de Arquivos
O conceito de arquivos em COBOL é diferente daquele em C/C++. Ao aprender o básico de 'Arquivo' em
COBOL, os conceitos de ambas as linguagens não devem ser correlacionados. Arquivos de texto simples
não podem ser usados em COBOL, em vez disso, arquivos PS (Physical Sequential) e VSAM são usados.
Os arquivos PS serão discutidos neste módulo.

Para entender o manuseio de arquivos em COBOL, deve-se conhecer os termos básicos. Esses termos
servem apenas para entender os fundamentos do manuseio de arquivos. A terminologia mais detalhada será
discutida no capítulo 'Verbos de Manipulação de Arquivos'. A seguir estão os termos básicos -

 Field
 Record
 Physical Record
 Logical Record
 File

O exemplo a seguir ajuda a entender esses termos -

Field
Campo é usado para indicar os dados armazenados sobre um elemento. Ele representa um único elemento,
conforme mostrado no exemplo acima, como ID do aluno, nome, notas, notas totais e porcentagem. O
número de caracteres em qualquer campo é conhecido como tamanho do campo, por exemplo, o nome do
aluno pode ter 10 caracteres. Os campos podem ter os seguintes atributos -

 Chaves primárias: são os campos exclusivos de cada registro e usados para identificar um registro
específico. Por exemplo, no arquivo de notas dos alunos, cada aluno terá uma identificação de aluno
exclusiva que forma a chave primária.
 Chaves secundárias: são campos exclusivos ou não exclusivos usados para pesquisar dados
relacionados. Por exemplo, no arquivo de notas dos alunos, o nome completo do aluno pode ser
usado como chave secundária quando a identificação do aluno não é conhecida.
 Descritores: campos são usados para descrever uma entidade. Por exemplo, no arquivo de notas dos
alunos, os campos de notas e percentuais que adicionam significado ao registro são descritores
conhecidos.

Record
Registro é uma coleção de campos que é usada para descrever uma entidade. Um ou mais campos juntos
formam um registro. Por exemplo, no arquivo de notas dos alunos, a identificação do aluno, nome, notas,
notas totais e porcentagem formam um registro. O tamanho cumulativo de todos os campos em um registro é
conhecido como tamanho do registro. Os registros presentes em um arquivo podem ser de tamanho fixo ou
variável.

Physical Record (Registro Físico)

O registro físico é a informação que existe no dispositivo externo. Também é conhecido como bloco.

Logical Record (Registro Lógico)

Registro lógico é a informação usada pelo programa. Em programas COBOL, apenas um registro pode ser
tratado em qualquer ponto do tempo e é chamado de registro lógico.

File
Arquivo é uma coleção de registros relacionados. Por exemplo, o arquivo de notas dos alunos consiste em
registros de todos os alunos.
COBOL – Orgãnizãção de ãrquivos
A organização do arquivo indica como os registros são organizados em um arquivo. Existem diferentes tipos
de organizações de arquivos para aumentar sua eficiência de acesso aos registros. A seguir estão os tipos de
esquemas de organização de arquivos -

 Sequential file organization


 Indexed sequential file organization
 Relative file organization

As sintaxes deste módulo, mencionadas junto com seus respectivos termos, referem-se apenas à sua
utilização no programa. Os programas completos usando essas sintaxes serão discutidos no capítulo 'Verbos
de manipulação de arquivos'.

Sequential File Organization (Organização Sequencial de Arquivos)


Um arquivo sequencial consiste em registros que são armazenados e acessados em ordem sequencial. A
seguir estão os principais atributos da organização sequencial de arquivos -

 Os registros podem ser lidos em ordem sequencial. Para a leitura do 10º registro, todos os 9 registros
anteriores devem ser lidos.
 Os registros são escritos em ordem sequencial. Um novo registro não pode ser inserido no meio. Um
novo registro é sempre inserido no final do arquivo.
 Depois de colocar um registro em um arquivo sequencial, não é possível excluir, encurtar ou
aumentar um registro.
 A ordem dos registros, uma vez inseridos, nunca poderá ser alterada.
 A atualização do registro é possível. Um registro pode ser sobrescrito, se o comprimento do novo
registro for igual ao comprimento do registro antigo.
 Arquivos de saída sequencial são uma boa opção para impressão.

Sintaxe

A seguir está a sintaxe da organização sequencial de arquivos -

INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT file-name ASSIGN TO dd-name-jcl
ORGANIZATION IS SEQUENTIAL

Indexed Sequential File Organization (Organização de arquivos


sequenciais indexados)
Um arquivo sequencial indexado consiste em registros que podem ser acessados sequencialmente. O acesso
direto também é possível. Consiste em duas partes -

 Arquivo de dados: contém registros em esquema sequencial.


 Arquivo de índice: contém a chave primária e seu endereço no arquivo de dados.
A seguir estão os principais atributos da organização sequencial de arquivos -

 Os registros podem ser lidos em ordem sequencial, assim como na organização sequencial de
arquivos.
 Os registros podem ser acessados aleatoriamente se a chave primária for conhecida. O arquivo de
índice é usado para obter o endereço de um registro e, em seguida, o registro é obtido do arquivo de
dados.
 O índice classificado é mantido neste sistema de arquivos que relaciona o valor da chave à posição
do registro no arquivo.
 O índice alternativo também pode ser criado para buscar os registros.

Sintaxe

A seguir está a sintaxe da organização de arquivos sequenciais indexados -

INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT file-name ASSIGN TO dd-name-jcl
ORGANIZATION IS INDEXED
RECORD KEY IS primary-key
ALTERNATE RECORD KEY IS rec-key

Relative File Organization (Organização Relativa de Arquivos)


Um arquivo relativo consiste em registros ordenados por seu endereço relativo. A seguir estão os principais
atributos da organização relativa de arquivos -

 Os registros podem ser lidos em ordem sequencial, assim como na organização de arquivos
sequenciais e indexados.
 Os registros podem ser acessados usando a chave relativa. A chave relativa representa a localização
do registro em relação ao endereço de início do arquivo.
 Os registros podem ser inseridos usando a chave relativa. O endereço relativo é calculado usando a
chave relativa.
 O arquivo relativo fornece o acesso mais rápido aos registros.
 A principal desvantagem desse sistema de arquivos é que, se alguns registros intermediários
estiverem ausentes, eles também ocuparão espaço.

Sintaxe

A seguir está a sintaxe da organização relativa de arquivos -

INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT file-name ASSIGN TO dd-name-jcl
ORGANIZATION IS RELATIVE
RELATIVE KEY IS rec-key
COBOL – Modo de ãcesso ã ãrquivos
Até agora, os esquemas de organização de arquivos foram discutidos. Para cada esquema de organização de
arquivos, diferentes modos de acesso podem ser usados. A seguir estão os tipos de modos de acesso a
arquivos -

 Sequential Access
 Random Access
 Dynamic Access

As sintaxes deste módulo, mencionadas junto com seus respectivos termos, referem-se apenas à sua
utilização no programa. Os programas completos que usam essas sintaxes serão discutidos no próximo
capítulo.

Sequential Access (Acesso Sequencial)


Quando o modo de acesso é sequencial, o método de recuperação de registros muda conforme a organização
de arquivos selecionada.

 Para sequential files (arquivos sequenciais), os registros são acessados na mesma ordem em que
foram inseridos.
 Para indexed files (arquivos indexados), o parâmetro usado para buscar os registros são os valores da
chave de registro.
 Para relative files (arquivos relativos), as chaves de registro relativas são usadas para recuperar os
registros.

Sintaxe

A seguir está a sintaxe do modo de acesso sequencial -

ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT file-name ASSIGN TO dd-name
ORGANIZATION IS SEQUENTIAL
ACCESS MODE IS SEQUENTIAL

ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT file-name ASSIGN TO dd-name
ORGANIZATION IS INDEXED
ACCESS MODE IS SEQUENTIAL
RECORD KEY IS rec-key1
ALTERNATE RECORD KEY IS rec-key2

ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT file-name ASSIGN TO dd-name
ORGANIZATION IS RELATIVE
ACCESS MODE IS SEQUENTIAL
RELATIVE KEY IS rec-key1
Random Access (Acesso aleatório)
Quando o modo de acesso é RANDOM, o método de recuperação de registros muda de acordo com a
organização de arquivos selecionada.

 Para indexed files (arquivos indexados), os registros são acessados de acordo com o valor colocado
em um campo de chave que pode ser chave primária ou alternativa. Pode haver um ou mais índices
alternativos.
 Para relative files (arquivos relativos), os registros são recuperados por meio de chaves de registro
relativas.

Sintaxe

A seguir está a sintaxe do modo de acesso aleatório -

ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT file-name ASSIGN TO dd-name
ORGANIZATION IS INDEXED
ACCESS MODE IS RANDOM
RECORD KEY IS rec-key1
ALTERNATE RECORD KEY IS rec-key2

ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT file-name ASSIGN TO dd-name
ORGANIZATION IS RELATIVE
ACCESS MODE IS RANDOM
RELATIVE KEY IS rec-key1

Dynamic Access (Acesso dinâmico)


Dynamic access suporta acesso sequencial e aleatório no mesmo programa. Com o acesso dinâmico, uma
definição de arquivo é usada para executar processamento sequencial e aleatório, como acessar alguns
registros em ordem sequencial e outros registros por suas chaves.

Com arquivos relativos e indexados, o modo de acesso dinâmico permite alternar entre o modo de acesso
sequencial e o modo de acesso aleatório durante a leitura de um arquivo usando a frase NEXT na instrução
READ. As funcionalidades NEXT e READ serão discutidas no próximo capítulo.

Sintaxe

A seguir está a sintaxe do modo de acesso dinâmico -

ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT file-name ASSIGN TO dd-name
ORGANIZATION IS SEQUENTIAL
ACCESS MODE IS DYNAMIC
RECORD KEY IS rec-key1
ALTERNATE RECORD KEY IS rec-key2
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT file-name ASSIGN TO dd-name
ORGANIZATION IS RELATIVE
ACCESS MODE IS DYNAMIC
RELATIVE KEY IS rec-key1
COBOL - Verbos de mãnipulãção de ãrquivos
Verbos de manipulação de arquivos são usados para executar várias operações em arquivos. A seguir estão
os verbos de manipulação de arquivos -

 Open
 Read
 Write
 Rewrite
 Delete
 Start
 Close

Open verb
Open é a primeira operação de arquivo que deve ser executada. Se Abrir for bem-sucedido, somente outras
operações serão possíveis em um arquivo. Somente após a abertura de um arquivo, as variáveis na estrutura
do arquivo ficam disponíveis para processamento. A variável FILE STATUS é atualizada após cada
operação de arquivo.

Sintaxe
OPEN "mode" file-name.

Aqui, file-name é uma string literal, que você usará para nomear seu arquivo. Um arquivo pode ser aberto
nos seguintes modos

Sr. No. Modo e Descrição


Input
1 O modo de entrada é usado para arquivos existentes. Neste modo, podemos apenas ler o arquivo,
nenhuma outra operação é permitida no arquivo.
Output
O modo de saída é usado para inserir registros em arquivos. Se um arquivo sequencial for usado e
2 o arquivo estiver contendo alguns registros, os registros existentes serão excluídos primeiro e, em
seguida, novos registros serão inseridos no arquivo. Isso não acontecerá no caso de um arquivo
indexado ou um arquivo relativo.
Extend
O modo de extensão é usado para anexar registros em um arquivo sequencial. Neste modo, os
3
registros são inseridos no final. Se o modo de acesso ao arquivo for Aleatório ou Dinâmico, o
modo de extensão não poderá ser usado.
I-O
4
O modo de entrada-saída é usado para ler e reescrever os registros de um arquivo.
Read Verbo
O verbo Read é usado para ler os registros do arquivo. A função de leitura é buscar registros de um arquivo.
A cada verbo lido, apenas um registro pode ser lido na estrutura do arquivo. Para realizar uma operação de
leitura, abra o arquivo no modo INPUT ou I-O. A cada instrução de leitura, o ponteiro do arquivo é
incrementado e, portanto, os registros sucessivos são lidos.

Sintaxe

A seguir está a sintaxe para ler os registros quando o modo de acesso ao arquivo é sequencial -

READ file-name NEXT RECORD INTO ws-file-structure


AT END DISPLAY 'End of File'
NOT AT END DISPLAY 'Record Details:' ws-file-structure
END-READ.

A seguir estão os parâmetros usados -

 NEXT RECORD é opcional e é especificado quando um arquivo sequencial indexado está sendo lido
sequencialmente.
 A cláusula INTO é opcional. ws-file-structure é definido na seção WorkingStorage para obter os
valores da instrução READ.
 A condição AT END torna-se True quando o final do arquivo é atingido.

Exemplo: O exemplo a seguir lê um arquivo existente usando a organização sequencial de linha e exibe
todos os registros presentes no arquivo.

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT STUDENT ASSIGN TO 'input.txt'
ORGANIZATION IS LINE SEQUENTIAL.

DATA DIVISION.
FILE SECTION.
FD STUDENT.
01 STUDENT-FILE.
05 STUDENT-ID PIC 9(5).
05 NAME PIC A(25).

WORKING-STORAGE SECTION.
01 WS-STUDENT.
05 WS-STUDENT-ID PIC 9(5).
05 WS-NAME PIC A(25).
01 WS-EOF PIC A(1).

PROCEDURE DIVISION.
OPEN INPUT STUDENT.
PERFORM UNTIL WS-EOF='Y'
READ STUDENT INTO WS-STUDENT
AT END MOVE 'Y' TO WS-EOF
NOT AT END DISPLAY WS-STUDENT
END-READ
END-PERFORM.
CLOSE STUDENT.
STOP RUN.

Suponha que os dados do arquivo de entrada disponíveis no arquivo input.txt contenham o seguinte −
20003 Mohtashim M.
20004 Nishant Malik
20005 Amitabh Bachhan

Quando você compila e executa o programa acima, ele produz o seguinte resultado -

20003 Mohtashim M.
20004 Nishant Malik
20005 Amitabh Bachhan

Sintaxe

A seguir está a sintaxe para escrever um registro quando o modo de acesso ao arquivo é aleatório -

READ file-name RECORD INTO ws-file-structure


KEY IS rec-key
INVALID KEY DISPLAY 'Invalid Key'
NOT INVALID KEY DISPLAY 'Record Details: ' ws-file-structure
END-READ.

Exemplo− O exemplo a seguir lê um arquivo existente usando a organização indexada. Este programa pode
ser compilado e executado utilizando JCL em Mainframes onde exibirá todos os registros presentes no
arquivo. No servidor Mainframes, não utilizamos arquivos de texto; em vez disso, usamos arquivos PS.

Vamos supor que o arquivo presente nos Mainframes tenha o mesmo conteúdo do arquivo input.txt do
exemplo acima.

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT STUDENT ASSIGN TO IN1
ORGANIZATION IS INDEXED
ACCESS IS RANDOM
RECORD KEY IS STUDENT-ID
FILE STATUS IS FS.

DATA DIVISION.
FILE SECTION.
FD STUDENT.
01 STUDENT-FILE.
05 STUDENT-ID PIC 9(5).
05 NAME PIC A(25).

WORKING-STORAGE SECTION.
01 WS-STUDENT.
05 WS-STUDENT-ID PIC 9(5).
05 WS-NAME PIC A(25).

PROCEDURE DIVISION.
OPEN INPUT STUDENT.
MOVE 20005 TO STUDENT-ID.

READ STUDENT RECORD INTO WS-STUDENT-FILE


KEY IS STUDENT-ID
INVALID KEY DISPLAY 'Invalid Key'
NOT INVALID KEY DISPLAY WS-STUDENT-FILE
END-READ.

CLOSE STUDENT.
STOP RUN.
JCL para executar o programa COBOL acima -

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C


//STEP1 EXEC PGM = HELLO
//IN1 DD DSN = STUDENT-FILE-NAME,DISP=SHR

Quando você compila e executa o programa acima, ele produz o seguinte resultado -

20005 Amitabh Bachhan

Write
O verbo Write é usado para inserir registros em um arquivo. Depois que o registro é gravado, ele não está
mais disponível no buffer de registro. Antes de inserir registros no arquivo, mova os valores para o buffer de
registro e execute o verbo de gravação.

A instrução Write pode ser usada com a opção FROM para gravar registros diretamente das variáveis de
armazenamento de trabalho. From é uma cláusula opcional. Se o modo de acesso for sequencial, para gravar
um registro, o arquivo deve ser aberto no modo de saída ou no modo de extensão. Se o modo de acesso for
aleatório ou dinâmico, para gravar um registro, o arquivo deve ser aberto no modo Output ou no modo IO.

Sintaxe

A seguir está a sintaxe para ler um registro quando a organização do arquivo é sequencial -

WRITE record-buffer [FROM ws-file-structure]


END-WRITE.

A seguir está a sintaxe para ler um registro quando a organização do arquivo é indexada ou relativa -

WRITE record-buffer [FROM ws-file-structure]


INVALID KEY DISPLAY 'Invalid Key'
NOT INVALID KEY DISPLAY 'Record Inserted'
END-WRITE.

Exemplo− O exemplo a seguir mostra como inserir um novo registro em um novo arquivo quando a
organização é sequencial.

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT STUDENT ASSIGN TO OUT1
ORGANIZATION IS SEQUENTIAL
ACCESS IS SEQUENTIAL
FILE STATUS IS FS.

DATA DIVISION.
FILE SECTION.
FD STUDENT
01 STUDENT-FILE.
05 STUDENT-ID PIC 9(5).
05 NAME PIC A(25).
05 CLASS PIC X(3).
WORKING-STORAGE SECTION.
01 WS-STUDENT.
05 WS-STUDENT-ID PIC 9(5).
05 WS-NAME PIC A(25).
05 WS-CLASS PIC X(3).

PROCEDURE DIVISION.
OPEN EXTEND STUDENT.
MOVE 1000 TO STUDENT-ID.
MOVE 'Tim' TO NAME.
MOVE '10' TO CLASS.
WRITE STUDENT-FILE
END-WRITE.
CLOSE STUDENT.
STOP RUN.

JCL para executar o programa COBOL acima -

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C


//STEP1 EXEC PGM = HELLO
//OUT1 DD DSN = OUTPUT-FILE-NAME,DISP = (NEW,CATALOG,DELETE)

Quando você compila e executa o programa acima, ele adiciona um novo registro ao arquivo de saída.

1000 Tim 10

Rewrite
O verbo rewrite é usado para atualizar os registros. O arquivo deve ser aberto no modo IO para operações de
reescrita. Ele pode ser usado somente após uma operação de leitura bem-sucedida. O verbo reescrever
substitui o último registro lido.

Sintaxe

A seguir está a sintaxe para ler um registro quando a organização do arquivo é sequencial -

REWRITE record-buffer [FROM ws-file-structure]


END-REWRITE.

A seguir está a sintaxe para ler um registro quando a organização do arquivo é indexada ou relativa -

REWRITE record-buffer [FROM ws-file-structure]


INVALID KEY DISPLAY 'Invalid Key'
NOT INVALID KEY DISPLAY 'Record Updated'
END-REWRITE.

Exemplo− O exemplo a seguir mostra como atualizar um registro existente que inserimos na etapa de
gravação anterior −

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT STUDENT ASSIGN TO IN1
ORGANIZATION IS INDEXED
ACCESS IS RANDOM
RECORD KEY IS STUDENT-ID
FILE STATUS IS FS.

DATA DIVISION.
FILE SECTION.
FD STUDENT
01 STUDENT-FILE.
05 STUDENT-ID PIC 9(4).
05 NAME PIC A(12).
05 CLASS PIC X(3).

WORKING-STORAGE SECTION.
01 WS-STUDENT.
05 WS-STUDENT-ID PIC 9(5).
05 WS-NAME PIC A(25).
05 WS-CLASS PIC X(3).

PROCEDURE DIVISION.
OPEN I-O STUDENT.
MOVE '1000' TO STUDENT-ID.

READ STUDENT
KEY IS STUDENT-ID
INVALID KEY DISPLAY ‘KEY IS NOT EXISTING’
END-READ.

MOVE 'Tim Dumais' TO NAME.


REWRITE STUDENT-FILE
END-REWRITE.
CLOSE STUDENT.
STOP RUN.

JCL para executar o programa COBOL acima -

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C


//STEP1 EXEC PGM = HELLO
//IN1 DD DSN = OUTPUT-FILE-NAME,DISP = SHR

Quando você compila e executa o programa acima, ele atualizará o registro -

1000 Tim Dumais 10

Delete verbo
O verbo de exclusão pode ser executado apenas em arquivos indexados e relativos. O arquivo deve ser
aberto no modo IO. Na organização sequencial de arquivos, os registros não podem ser excluídos. O último
registro lido pela instrução Read é excluído no caso de modo de acesso sequencial. No modo de acesso
aleatório, especifique a chave de registro e execute a operação Excluir.

Sintaxe

A seguir está a sintaxe para excluir um registro -

DELETE file-name RECORD


INVALID KEY DISPLAY 'Invalid Key'
NOT INVALID KEY DISPLAY 'Record Deleted'
END-DELETE.

Exemplo− para excluir um registro existente −


IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT STUDENT ASSIGN TO OUT1
ORGANIZATION IS INDEXED
ACCESS IS RANDOM
RECORD KEY IS STUDENT-ID
FILE STATUS IS FS.

DATA DIVISION.
FILE SECTION.
FD STUDENT
01 STUDENT-FILE.
05 STUDENT-ID PIC 9(4).
05 NAME PIC A(12).
05 CLASS PIC X(3).
WORKING-STORAGE SECTION.
01 WS-STUDENT.
05 WS-STUDENT-ID PIC 9(5).
05 WS-NAME PIC A(25).
05 WS-CLASS PIC X(3).

PROCEDURE DIVISION.
OPEN I-O STUDENT.
MOVE '1000' TO STUDENT-ID.

DELETE STUDENT RECORD


INVALID KEY DISPLAY 'Invalid Key'
NOT INVALID KEY DISPLAY 'Record Deleted'
END-DELETE.

CLOSE STUDENT.

STOP RUN.

JCLpara executar o programa COBOL acima -

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C


//STEP1 EXEC PGM = HELLO
//OUT1 DD DSN = OUTPUT-FILE-NAME,DISP = SHR

Quando você compila e executa o programa acima, ele produz o seguinte resultado -

Record Deleted

Start inicial
O verbo inicial pode ser executado apenas em arquivos indexados e relativos. É usado para colocar o
ponteiro do arquivo em um registro específico.

O modo de acesso deve ser sequencial ou dinâmico. O arquivo deve ser aberto no modo IO ou Input.

Sintaxe

A seguir está a sintaxe para colocar o ponteiro em um registro específico –


START file-name KEY IS [=, >, <, NOT, <= or >=] rec-key
INVALID KEY DISPLAY 'Invalid Key'
NOT INVALID KEY DISPLAY 'File Pointer Updated'
END-START.

Close Verbo
O verbo Close é usado para fechar um arquivo. Após realizar a operação Fechar, as variáveis na estrutura do
arquivo não estarão disponíveis para processamento. O link entre o programa e o arquivo é perdido.

Sintaxe

A seguir está a sintaxe para fechar um arquivo -

CLOSE file-name.
COBOL – Subrotinãs
A sub-rotina Cobol é um programa que pode ser compilado independentemente, mas não pode ser executado
independentemente. Existem dois tipos de sub-rotinas: sub-rotinas internas como instruções Perform e sub-
rotinas externas como verbo CALL.

CALL (Verbo de chamada)


O verbo de chamada CALL é usado para transferir o controle de um programa para outro. O programa que
contém o verbo CALL é o Calling Program e o programa que está sendo chamado é conhecido como Called
Program. A execução do programa chamador será interrompida até que o programa chamado termine a
execução. A instrução Exit Program é usada no programa Called para transferir o controle de volta.

Limitações (restrições) de programas chamados

A seguir estão os chamados requisitos do programa -

 Linkage section (Seção de ligação): deve ser definido no programa chamado. Consiste em
elementos de dados passados no programa. Os itens de dados não devem ter cláusula Value. A
cláusula PIC deve ser compatível com as variáveis passadas pelo programa de chamada.
 Procedure division using (Divisão de procedimento usando): tem uma lista de variáveis passadas
do programa chamador e a ordem deve ser a mesma mencionada no verbo Chamar.
 Exit program (Sair do programa): A instrução é usada no programa chamado para transferir o
controle de volta. Deve ser a última instrução no programa chamado.

Os parâmetros podem ser passados entre programas de duas maneiras -

 By Reference
 By Content

Call By Reference (Chamada por referência)


Se os valores das variáveis no programa chamado forem modificados, seus novos valores serão refletidos no
programa chamador. Se a cláusula BY não for especificada, as variáveis serão sempre passadas por
referência.

Sintaxe

A seguir está a sintaxe de chamada de sub-rotina por referência -

CALL sub-prog-name USING variable-1, variable-2.

Exemplo

O exemplo a seguir é o programa de chamada MAIN e UTIL é o programa chamado -

IDENTIFICATION DIVISION.
PROGRAM-ID. MAIN.

DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-STUDENT-ID PIC 9(4) VALUE 1000.
01 WS-STUDENT-NAME PIC A(15) VALUE 'Tim'.

PROCEDURE DIVISION.
CALL 'UTIL' USING WS-STUDENT-ID, WS-STUDENT-NAME.
DISPLAY 'Student Id : ' WS-STUDENT-ID
DISPLAY 'Student Name : ' WS-STUDENT-NAME
STOP RUN.

Programa Chamado
IDENTIFICATION DIVISION.
PROGRAM-ID. UTIL.

DATA DIVISION.
LINKAGE SECTION.
01 LS-STUDENT-ID PIC 9(4).
01 LS-STUDENT-NAME PIC A(15).

PROCEDURE DIVISION USING LS-STUDENT-ID, LS-STUDENT-NAME.


DISPLAY 'In Called Program'.
MOVE 1111 TO LS-STUDENT-ID.
EXIT PROGRAM.

JCL para executar o programa COBOL acima -

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C


//STEP1 EXEC PGM = MAIN

Quando você compila e executa o programa acima, ele produz o seguinte resultado -

In Called Program
Student Id : 1111
Student Name : Tim

Call By Content (Chamada por conteúdo)


Se os valores das variáveis no programa chamado forem modificados, seus novos valores não serão
refletidos no programa chamador.

Sintaxe

A seguir está a sintaxe de chamada de sub-rotina por conteúdo -

CALL sub-prog-name USING


BY CONTENT variable-1, BY CONTENT variable-2.

Exemplo

O exemplo a seguir é o programa de chamada MAIN e UTIL é o programa chamado -

IDENTIFICATION DIVISION.
PROGRAM-ID. MAIN.

DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-STUDENT-ID PIC 9(4) VALUE 1000.
01 WS-STUDENT-NAME PIC A(15) VALUE 'Tim'.

PROCEDURE DIVISION.
CALL 'UTIL' USING BY CONTENT WS-STUDENT-ID, BY CONTENT WS-STUDENT-NAME.
DISPLAY 'Student Id : ' WS-STUDENT-ID
DISPLAY 'Student Name : ' WS-STUDENT-NAME
STOP RUN.

Programa Chamado
IDENTIFICATION DIVISION.
PROGRAM-ID. UTIL.

DATA DIVISION.
LINKAGE SECTION.
01 LS-STUDENT-ID PIC 9(4).
01 LS-STUDENT-NAME PIC A(15).

PROCEDURE DIVISION USING LS-STUDENT-ID, LS-STUDENT-NAME.


DISPLAY 'In Called Program'.
MOVE 1111 TO LS-STUDENT-ID.
EXIT PROGRAM.

JCL para executar o programa COBOL acima -

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C


//STEP1 EXEC PGM = MAIN

Quando você compila e executa o programa acima, ele produz o seguinte resultado -

In Called Program
Student Id : 1000
Student Name : Tim

Types of Call (Tipos de Chamada)


Existem dois tipos de chamadas -

 Static Call (Chamada estática): ocorre quando um programa é compilado com a opção do
compilador NODYNAM. Um programa chamado estático é carregado no armazenamento em tempo
de compilação.
 Dynamic Call (Chamada dinâmica): ocorre quando um programa é compilado com a opção do
compilador DYNAM e NODLL. Um programa chamado dinâmico é carregado no armazenamento
em tempo de execução.
COBOL – Ordenãção Internã
A classificação de dados em um arquivo ou a mesclagem de dois ou mais arquivos é uma necessidade
comum em quase todos os aplicativos orientados a negócios. A classificação é usada para organizar os
registros em ordem crescente ou decrescente, para que o processamento sequencial possa ser executado.
Existem duas técnicas que são usadas para classificar arquivos em COBOL -

 External sort (Classificação externa): é usado para classificar arquivos usando o utilitário SORT
em JCL. Discutimos isso no capítulo JCL. A partir de agora, vamos nos concentrar na classificação
interna.
 Internal sort (Classificação interna): é usado para classificar arquivos dentro de um programa
COBOL. O verbo SORT é usado para classificar um arquivo.

Sort Verb
Três arquivos são usados no processo de classificação em COBOL -

 Input file (Arquivo de entrada): é o arquivo que devemos classificar em ordem crescente ou
decrescente.
 Work file (Arquivo de trabalho): é usado para manter registros enquanto o processo de
classificação está em andamento. Os registros do arquivo de entrada são transferidos para o arquivo
de trabalho para o processo de classificação. Este arquivo deve ser definido na seção Arquivo na
entrada SD.
 Output file (Arquivo de saída): é o arquivo que obtemos após o processo de classificação. É a
saída final do verbo Sort.

Sintaxe

A seguir está a sintaxe para classificar um arquivo -

SORT work-file ON ASCENDING KEY rec-key1


[ON DESCENDING KEY rec-key2]
USING input-file GIVING output-file.

SORT executa as seguintes operações -

 Abre o arquivo de trabalho no modo IO, o arquivo de entrada no modo INPUT e o arquivo de saída
no modo OUTPUT.
 Transfere os registros presentes no arquivo de entrada para o arquivo de trabalho.
 Classifica o SORT-FILE em seqüência ascendente/descendente por tecla rec.
 Transfere os registros classificados do arquivo de trabalho para o arquivo de saída.
 Fecha o arquivo de entrada e o arquivo de saída e exclui o arquivo de trabalho.

Exemplo

No exemplo a seguir, INPUT é o arquivo de entrada que precisa ser classificado em ordem crescente -

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT INPUT ASSIGN TO IN.
SELECT OUTPUT ASSIGN TO OUT.
SELECT WORK ASSIGN TO WRK.

DATA DIVISION.
FILE SECTION.
FD INPUT.
01 INPUT-STUDENT.
05 STUDENT-ID-I PIC 9(5).
05 STUDENT-NAME-I PIC A(25).
FD OUTPUT.
01 OUTPUT-STUDENT.
05 STUDENT-ID-O PIC 9(5).
05 STUDENT-NAME-O PIC A(25).
SD WORK.
01 WORK-STUDENT.
05 STUDENT-ID-W PIC 9(5).
05 STUDENT-NAME-W PIC A(25).

PROCEDURE DIVISION.
SORT WORK ON ASCENDING KEY STUDENT-ID-O
USING INPUT GIVING OUTPUT.
DISPLAY 'Sort Successful'.
STOP RUN.

JCL para executar o programa COBOL acima -

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C


//STEP1 EXEC PGM = HELLO
//IN DD DSN = INPUT-FILE-NAME,DISP = SHR
//OUT DD DSN = OUTPUT-FILE-NAME,DISP = SHR
//WRK DD DSN = &&TEMP

Quando você compila e executa o programa acima, ele produz o seguinte resultado -

Sort Successful

Merge Verb
Dois ou mais arquivos sequenciados de forma idêntica são combinados usando a instrução Merge. Arquivos
usados no processo de mesclagem −

 Input Files − Input-1, Input-2


 Work File
 Output File

Sintaxe

A seguir está a sintaxe para mesclar dois ou mais arquivos -

MERGE work-file ON ASCENDING KEY rec-key1


[ON DESCENDING KEY rec-key2]

USING input-1, input-2 GIVING output-file.

Mesclar executa as seguintes operações -

 Abre o arquivo de trabalho no modo IO, os arquivos de entrada no modo INPUT e o arquivo de saída
no modo OUTPUT.
 Transfere os registros presentes nos arquivos de entrada para o arquivo de trabalho.
 Classifica o SORT-FILE em seqüência ascendente/descendente por tecla rec.
 Transfere os registros classificados do arquivo de trabalho para o arquivo de saída.
 Fecha o arquivo de entrada e o arquivo de saída e exclui o arquivo de trabalho.

Exemplo

No exemplo a seguir, INPUT1 e INPUT2 são os arquivos de entrada que devem ser mesclados em ordem
crescente -

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT INPUT1 ASSIGN TO IN1.
SELECT INPUT2 ASSIGN TO IN2.
SELECT OUTPUT ASSIGN TO OUT.
SELECT WORK ASSIGN TO WRK.

DATA DIVISION.
FILE SECTION.
FD INPUT1.
01 INPUT1-STUDENT.
05 STUDENT-ID-I1 PIC 9(5).
05 STUDENT-NAME-I1 PIC A(25).
FD INPUT2.
01 INPUT2-STUDENT.
05 STUDENT-ID-I2 PIC 9(5).
05 STUDENT-NAME-I2 PIC A(25).
FD OUTPUT.
01 OUTPUT-STUDENT.
05 STUDENT-ID-O PIC 9(5).
05 STUDENT-NAME-O PIC A(25).
SD WORK.
01 WORK-STUDENT.
05 STUDENT-ID-W PIC 9(5).
05 STUDENT-NAME-W PIC A(25).

PROCEDURE DIVISION.
MERGE WORK ON ASCENDING KEY STUDENT-ID-O
USING INPUT1, INPUT2 GIVING OUTPUT.
DISPLAY 'Merge Successful'.
STOP RUN.

JCL para executar o programa COBOL acima -

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C


//STEP1 EXEC PGM = HELLO
//IN1 DD DSN=INPUT1-FILE-NAME,DISP=SHR
//IN2 DD DSN=INPUT2-FILE-NAME,DISP=SHR
//OUT DD DSN = OUTPUT-FILE-NAME,DISP=SHR
//WRK DD DSN = &&TEMP

Quando você compila e executa o programa acima, ele produz o seguinte resultado -

Merge Successful
COBOL – Interfãce de bãnco de dãdos
A partir de agora, aprendemos o uso de arquivos em COBOL. Agora, discutiremos como um programa
COBOL interage com o DB2. Envolve os seguintes termos -

 SQL incorporado
 Programação de Aplicativos DB2
 Variáveis de host
 SQLCA
 Consultas SQL
 Cursores

SQL incorporado (Embedded SQL)


As instruções SQL incorporadas são usadas em programas COBOL para executar operações SQL padrão.
As instruções SQL incorporadas são pré-processadas pelo processador SQL antes que o programa aplicativo
seja compilado. COBOL é conhecido como o Host Language. Os aplicativos COBOL-DB2 são aqueles
aplicativos que incluem COBOL e DB2.

As instruções SQL incorporadas funcionam como instruções SQL normais com algumas pequenas
alterações. Por exemplo, a saída de uma consulta é direcionada para um conjunto predefinido de variáveis
que são chamadas de Variáveis de Host. Uma cláusula INTO adicional é colocada na instrução SELECT.

Programação de Aplicativos DB2


A seguir estão as regras a serem seguidas ao codificar um programa COBOL-DB2 -

 Todas as instruções SQL devem ser delimitadas entre EXEC SQL e ENDEXEC.
 As instruções SQL devem ser codificadas na Área B.
 Todas as tabelas que são usadas em um programa devem ser declaradas na seção WorkingStorage.
Isso é feito usando a instrução INCLUDE.
 Todas as instruções SQL, exceto INCLUDE e DECLARE TABLE, devem aparecer na Divisão de
Procedimentos.

Variáveis de host (Host Variables)


As variáveis de host são usadas para receber dados de uma tabela ou inserir dados em uma tabela. As
variáveis de host devem ser declaradas para todos os valores que devem ser passados entre o programa e o
DB2. Eles são declarados na seção Working-Storage.

As variáveis de host não podem ser itens de grupo, mas podem ser agrupadas na estrutura de host. Eles não
podem ser renomeados ou redefinidos. Usando variáveis de host com instruções SQL, prefixe-as com dois
pontos (:).

Sintaxe

A seguir está a sintaxe para declarar variáveis de host e incluir tabelas na seção Working-Storage −

DATA DIVISION.
WORKING-STORAGE SECTION.

EXEC SQL
INCLUDE table-name
END-EXEC.

EXEC SQL BEGIN DECLARE SECTION


END-EXEC.

01 STUDENT-REC.
05 STUDENT-ID PIC 9(4).
05 STUDENT-NAME PIC X(25).
05 STUDENT-ADDRESS X(50).
EXEC SQL END DECLARE SECTION
END-EXEC.

SQLCA
SQLCA é uma área de comunicação SQL através da qual o DB2 passa o feedback da execução SQL para o
programa. Ele informa ao programa se uma execução foi bem-sucedida ou não. Existem várias variáveis
predefinidas em SQLCA como SQLCODE que contém o código de erro. O valor '000' em SQLCODE indica
uma execução bem-sucedida.

Sintaxe

A seguir está a sintaxe para declarar um SQLCA na seção Working-Storage -

DATA DIVISION.
WORKING-STORAGE SECTION.
EXEC SQL
INCLUDE SQLCA
END-EXEC.

Consultas SQL (SQL Queries)


Vamos supor que temos uma tabela chamada 'Student' que contém Student-Id, Student-Name e Student-
Address.

A tabela STUDENT contém os seguintes dados -

Student Id Student Name Student Address


1001 Mohtashim M. Hyderabad
1002 Nishant Malik Delhi
1003 Amitabh Bachan Mumbai
1004 Chulbul Pandey Lucknow

O exemplo a seguir mostra o uso da consulta SELECT em um programa COBOL -

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
WORKING-STORAGE SECTION.
EXEC SQL
INCLUDE SQLCA
END-EXEC.

EXEC SQL
INCLUDE STUDENT
END-EXEC.

EXEC SQL BEGIN DECLARE SECTION


END-EXEC.
01 WS-STUDENT-REC.
05 WS-STUDENT-ID PIC 9(4).
05 WS-STUDENT-NAME PIC X(25).
05 WS-STUDENT-ADDRESS X(50).
EXEC SQL END DECLARE SECTION
END-EXEC.

PROCEDURE DIVISION.
EXEC SQL
SELECT STUDENT-ID, STUDENT-NAME, STUDENT-ADDRESS
INTO :WS-STUDENT-ID, :WS-STUDENT-NAME, WS-STUDENT-ADDRESS FROM STUDENT
WHERE STUDENT-ID=1004
END-EXEC.

IF SQLCODE = 0
DISPLAY WS-STUDENT-RECORD
ELSE DISPLAY 'Error'
END-IF.
STOP RUN.

JCL para executar o programa COBOL acima -

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C


//STEP001 EXEC PGM = IKJEFT01
//STEPLIB DD DSN = MYDATA.URMI.DBRMLIB,DISP = SHR
//SYSPRINT DD SYSOUT=*
//SYSUDUMP DD SYSOUT=*
//SYSOUT DD SYSOUT=*
//SYSTSIN DD *
DSN SYSTEM(SSID)
RUN PROGRAM(HELLO) PLAN(PLANNAME) -
END
/*

Quando você compila e executa o programa acima, ele produz o seguinte resultado -

1004 Chulbul Pandey Lucknow

O exemplo a seguir mostra o uso da consulta INSERT em um programa COBOL -

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
WORKING-STORAGE SECTION.
EXEC SQL
INCLUDE SQLCA
END-EXEC.

EXEC SQL
INCLUDE STUDENT
END-EXEC.

EXEC SQL BEGIN DECLARE SECTION


END-EXEC.
01 WS-STUDENT-REC.
05 WS-STUDENT-ID PIC 9(4).
05 WS-STUDENT-NAME PIC X(25).
05 WS-STUDENT-ADDRESS X(50).
EXEC SQL END DECLARE SECTION
END-EXEC.

PROCEDURE DIVISION.
MOVE 1005 TO WS-STUDENT-ID.
MOVE 'TutorialsPoint' TO WS-STUDENT-NAME.
MOVE 'Hyderabad' TO WS-STUDENT-ADDRESS.
EXEC SQL
INSERT INTO STUDENT(STUDENT-ID, STUDENT-NAME, STUDENT-ADDRESS)
VALUES (:WS-STUDENT-ID, :WS-STUDENT-NAME, WS-STUDENT-ADDRESS)
END-EXEC.

IF SQLCODE = 0
DISPLAY 'Record Inserted Successfully'
DISPLAY WS-STUDENT-REC
ELSE DISPLAY 'Error'
END-IF.
STOP RUN.

JCL para executar o programa COBOL acima -

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C


//STEP001 EXEC PGM = IKJEFT01
//STEPLIB DD DSN = MYDATA.URMI.DBRMLIB,DISP=SHR
//SYSPRINT DD SYSOUT = *
//SYSUDUMP DD SYSOUT = *
//SYSOUT DD SYSOUT = *
//SYSTSIN DD *
DSN SYSTEM(SSID)
RUN PROGRAM(HELLO) PLAN(PLANNAME) -
END
/*

Quando você compila e executa o programa acima, ele produz o seguinte resultado -

Record Inserted Successfully


1005 TutorialsPoint Hyderabad

O exemplo a seguir mostra o uso da consulta UPDATE em um programa COBOL -

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
WORKING-STORAGE SECTION.

EXEC SQL
INCLUDE SQLCA
END-EXEC.

EXEC SQL
INCLUDE STUDENT
END-EXEC.

EXEC SQL BEGIN DECLARE SECTION


END-EXEC.
01 WS-STUDENT-REC.
05 WS-STUDENT-ID PIC 9(4).
05 WS-STUDENT-NAME PIC X(25).
05 WS-STUDENT-ADDRESS X(50).
EXEC SQL END DECLARE SECTION
END-EXEC.

PROCEDURE DIVISION.
MOVE 'Bangalore' TO WS-STUDENT-ADDRESS.
EXEC SQL
UPDATE STUDENT SET STUDENT-ADDRESS=:WS-STUDENT-ADDRESS
WHERE STUDENT-ID = 1003
END-EXEC.

IF SQLCODE = 0
DISPLAY 'Record Updated Successfully'
ELSE DISPLAY 'Error'
END-IF.
STOP RUN.

JCL para executar o programa COBOL acima -

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C


//STEP001 EXEC PGM = IKJEFT01
//STEPLIB DD DSN = MYDATA.URMI.DBRMLIB,DISP = SHR
//SYSPRINT DD SYSOUT = *
//SYSUDUMP DD SYSOUT = *
//SYSOUT DD SYSOUT = *
//SYSTSIN DD *
DSN SYSTEM(SSID)
RUN PROGRAM(HELLO) PLAN(PLANNAME) -
END
/*

Quando você compila e executa o programa acima, ele produz o seguinte resultado -

Record Updated Successfully

O exemplo a seguir mostra o uso da consulta DELETE em um programa COBOL -

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
WORKING-STORAGE SECTION.

EXEC SQL
INCLUDE SQLCA
END-EXEC.

EXEC SQL
INCLUDE STUDENT
END-EXEC.

EXEC SQL BEGIN DECLARE SECTION


END-EXEC.
01 WS-STUDENT-REC.
05 WS-STUDENT-ID PIC 9(4).
05 WS-STUDENT-NAME PIC X(25).
05 WS-STUDENT-ADDRESS X(50).
EXEC SQL END DECLARE SECTION
END-EXEC.

PROCEDURE DIVISION.
MOVE 1005 TO WS-STUDENT-ID.

EXEC SQL
DELETE FROM STUDENT
WHERE STUDENT-ID=:WS-STUDENT-ID
END-EXEC.

IF SQLCODE = 0
DISPLAY 'Record Deleted Successfully'
ELSE DISPLAY 'Error'
END-IF.
STOP RUN.
JCL para executar o programa COBOL acima -

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C


//STEP001 EXEC PGM = IKJEFT01
//STEPLIB DD DSN = MYDATA.URMI.DBRMLIB,DISP=SHR
//SYSPRINT DD SYSOUT = *
//SYSUDUMP DD SYSOUT = *
//SYSOUT DD SYSOUT = *
//SYSTSIN DD *
DSN SYSTEM(SSID)
RUN PROGRAM(HELLO) PLAN(PLANNAME) -
END
/*

Quando você compila e executa o programa acima, ele produz o seguinte resultado -

Record Deleted Successfully

Cursores
Os cursores são usados para lidar com várias seleções de linha ao mesmo tempo. São estruturas de dados
que contêm todos os resultados de uma consulta. Eles podem ser definidos na Seção de Armazenamento de
Trabalho ou na Divisão de Procedimentos. A seguir estão as operações associadas com Cursor −

 Declare
 Open
 Close
 Fetch

Declare Cursor

A declaração do cursor pode ser feita na Seção de Armazenamento de Trabalho ou na Divisão de


Procedimentos. A primeira instrução é a instrução DECLARE, que é uma instrução não executável.

EXEC SQL
DECLARE STUDCUR CURSOR FOR
SELECT STUDENT-ID, STUDENT-NAME, STUDENT-ADDRESS FROM STUDENT
WHERE STUDENT-ID >:WS-STUDENT-ID
END-EXEC.

Open

Antes de usar um cursor, a instrução Open deve ser executada. A instrução Open prepara o SELECT para
execução.

EXEC SQL
OPEN STUDCUR
END-EXEC.
Close

A instrução Close libera toda a memória ocupada pelo cursor. É obrigatório fechar um cursor antes de
terminar um programa.

EXEC SQL
CLOSE STUDCUR
END-EXEC.

Fetch

A instrução Fetch identifica o cursor e coloca o valor na cláusula INTO. Uma instrução Fetch é codificada
em loop à medida que obtemos uma linha de cada vez.

EXEC SQL
FETCH STUDCUR
INTO :WS-STUDENT-ID, :WS-STUDENT-NAME, WS-STUDENT-ADDRESS
END-EXEC.

O exemplo a seguir mostra o uso do cursor para buscar todos os registros da tabela STUDENT −

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
WORKING-STORAGE SECTION.

EXEC SQL
INCLUDE SQLCA
END-EXEC.

EXEC SQL
INCLUDE STUDENT
END-EXEC.

EXEC SQL BEGIN DECLARE SECTION


END-EXEC.
01 WS-STUDENT-REC.
05 WS-STUDENT-ID PIC 9(4).
05 WS-STUDENT-NAME PIC X(25).
05 WS-STUDENT-ADDRESS X(50).
EXEC SQL END DECLARE SECTION
END-EXEC.

EXEC SQL
DECLARE STUDCUR CURSOR FOR
SELECT STUDENT-ID, STUDENT-NAME, STUDENT-ADDRESS FROM STUDENT
WHERE STUDENT-ID >:WS-STUDENT-ID
END-EXEC.

PROCEDURE DIVISION.
MOVE 1001 TO WS-STUDENT-ID.
PERFORM UNTIL SQLCODE = 100

EXEC SQL
FETCH STUDCUR
INTO :WS-STUDENT-ID, :WS-STUDENT-NAME, WS-STUDENT-ADDRESS
END-EXEC

DISPLAY WS-STUDENT-REC
END-PERFORM
STOP RUN.

JCL para executar o programa COBOL acima -

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C


//STEP001 EXEC PGM=IKJEFT01
//STEPLIB DD DSN=MYDATA.URMI.DBRMLIB,DISP=SHR
//SYSPRINT DD SYSOUT=*
//SYSUDUMP DD SYSOUT=*
//SYSOUT DD SYSOUT=*
//SYSTSIN DD *
DSN SYSTEM(SSID)
RUN PROGRAM(HELLO) PLAN(PLANNAME) -
END
/*

Quando você compila e executa o programa acima, ele produz o seguinte resultado -

1001 Mohtashim M. Hyderabad


1002 Nishant Malik Delhi
1003 Amitabh Bachan Mumbai
1004 Chulbul Pandey Lucknow

Você também pode gostar