Escolar Documentos
Profissional Documentos
Cultura Documentos
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).
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.
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.
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:
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.
É 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.
A divisão de ambiente é usada para especificar arquivos de entrada e saída para o programa. Consiste em
duas seções:
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.
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.
Quando você compila e executa o programa acima, ele produz o seguinte resultado -
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:
)
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.
Exemplo
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.
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.
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
Valid:
‘This is valid’
"This is valid"
‘This isn’’t invalid’
Invalid:
‘This is invalid”
‘This isn’t valid’
Literal Numérico
Exemplo
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.
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 −
Constantes Figurativas
Exemplo
Valid:
WS-NAME
TOTAL-STUDENTS
A100
100B
Invalid:
MOVE (Reserved Words)
COMPUTE (Reserved Words)
100 (No Alphabet)
100+B (+ is not allowed)
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
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-NAME PIC X(25). ---> ELEMENTARY ITEM
01 WS-CLASS PIC 9(2) VALUE '10'. ---> 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.
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.
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$
Exemplo
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 -
Quando você compila e executa o programa acima, ele produz o seguinte resultado -
WS-NUM1 : 03.5
WS-NAME : ABCD
WS-ID : 00
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
Sintaxe
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.
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.
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.
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
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.
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.
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.
COMPUTACIONAL / COMP
O item de dados é armazenado em formato binário. Aqui, os itens de dados devem ser inteiros.
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.
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.
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
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
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.
ELSE
DISPLAY 'IN LOOP 1 - ELSE BLOCK'
END-IF.
STOP RUN.
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.
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
[IS] [NOT]
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.
STOP RUN.
Quando você compila e executa o programa acima, ele produz o seguinte resultado -
Sintaxe
[IS] [NOT]
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'.
STOP RUN.
Quando você compila e executa o programa acima, ele produz o seguinte resultado -
WS-NUM1 IS NEGATIVE
WS-NUM2 IS POSITIVE
Sintaxe
[IS] [NOT]
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'.
STOP RUN.
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
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 -
Quando você compila e executa o programa acima, ele produz o seguinte resultado -
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
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.
STOP RUN.
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
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.
STOP RUN.
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 OTHER
DISPLAY 'INVALID VALUE OF WS-A'
END-EVALUATE.
STOP RUN.
Quando você compila e executa o programa acima, ele produz o seguinte resultado -
Perform Thru
Perform Until
Perform Times
Perform Varying
In-line Perform
As instruções dentro do PERFORM serão executadas até que END-PERFORM seja alcançado.
Sintaxe
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
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'.
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
Sintaxe
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 -
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
Exemplo
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
PROCEDURE DIVISION.
A-PARA.
PERFORM B-PARA 3 TIMES.
STOP RUN.
B-PARA.
DISPLAY 'IN B-PARA'.
Quando você compila e executa o programa acima, ele produz o seguinte resultado -
IN B-PARA
IN B-PARA
IN B-PARA
Sintaxe
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.
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
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.
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
Sintaxe
INSPECT input-string
TALLYING output-count FOR ALL CHARACTERS
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.
WS-CNT1: 15
WS-CNT2 : 06
Replacing (Substituindo)
Sintaxe
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.
Quando você compila e executa o programa acima, ele produz o seguinte resultado -
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
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.
STOP RUN.
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
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.
STOP RUN.
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
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.
Quando você compila e executa o programa acima, ele produz o seguinte resultado -
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
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.
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.
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
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).
Quando você compila e executa o programa acima, ele produz o seguinte resultado -
ABC
DEF
GHI
JKL
MNO
PQR
Sintaxe
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.
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.
Quando você compila e executa o programa acima, ele produz o seguinte resultado -
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.
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
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.
O registro físico é a informação que existe no dispositivo externo. Também é conhecido como bloco.
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 -
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'.
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
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT file-name ASSIGN TO dd-name-jcl
ORGANIZATION IS SEQUENTIAL
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
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
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
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.
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
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
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
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
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
Sintaxe
A seguir está a sintaxe para ler os registros quando o modo de acesso ao arquivo é sequencial -
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 -
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.
CLOSE STUDENT.
STOP RUN.
JCL para executar o programa COBOL acima -
Quando você compila e executa o programa acima, ele produz o seguinte resultado -
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 -
A seguir está a sintaxe para ler um registro quando a organização do arquivo é indexada ou relativa -
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.
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 -
A seguir está a sintaxe para ler um registro quando a organização do arquivo é indexada ou relativa -
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.
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
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.
CLOSE STUDENT.
STOP RUN.
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
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
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.
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.
By Reference
By Content
Sintaxe
Exemplo
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).
Quando você compila e executa o programa acima, ele produz o seguinte resultado -
In Called Program
Student Id : 1111
Student Name : Tim
Sintaxe
Exemplo
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).
Quando você compila e executa o programa acima, ele produz o seguinte resultado -
In Called Program
Student Id : 1000
Student Name : Tim
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
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.
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 −
Sintaxe
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.
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
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.
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.
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.
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
DATA DIVISION.
WORKING-STORAGE SECTION.
EXEC SQL
INCLUDE SQLCA
END-EXEC.
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
DATA DIVISION.
WORKING-STORAGE SECTION.
EXEC SQL
INCLUDE SQLCA
END-EXEC.
EXEC SQL
INCLUDE STUDENT
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.
Quando você compila e executa o programa acima, ele produz o seguinte resultado -
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
DATA DIVISION.
WORKING-STORAGE SECTION.
EXEC SQL
INCLUDE SQLCA
END-EXEC.
EXEC SQL
INCLUDE STUDENT
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.
Quando você compila e executa o programa acima, ele produz o seguinte resultado -
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
DATA DIVISION.
WORKING-STORAGE SECTION.
EXEC SQL
INCLUDE SQLCA
END-EXEC.
EXEC SQL
INCLUDE STUDENT
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.
Quando você compila e executa o programa acima, ele produz o seguinte resultado -
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
DATA DIVISION.
WORKING-STORAGE SECTION.
EXEC SQL
INCLUDE SQLCA
END-EXEC.
EXEC SQL
INCLUDE STUDENT
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 -
Quando você compila e executa o programa acima, ele produz o seguinte resultado -
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
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
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.
Quando você compila e executa o programa acima, ele produz o seguinte resultado -