Formação Programador Mainframe PDF
Formação Programador Mainframe PDF
Formação Programador Mainframe PDF
Pré-requisitos
É um pré-requisito do curso:
o Conhecimentos básicos de operação em ambiente Windows;
Informações Importantes
Por favor, desligue o cellular ou deixe na opção vibracall. Em caso de urgência, atenda o
aparelho fora da sala de aula;
Nao é permitido o uso de aparelhos de gravação de voz ou video;
Durante as explanações teóricas e práticas, evite a navegação na internet para melhor
concentração do aluno e instrutor;
Comunique o instrutor imediatamente se qualquer passo do conteúdo explanado for perdido ou
se demonstrou confuso no decorrer da aula;
Não é permitido o consumo de alimentos ou bebidas no interior das salas de aula.
Escola de Programadores ZOS
Atualmente a IBM produz quatro versões de mainframes, denominados System Z series, que
modernizados, suportam diversos sistemas operacionais: z/OS, z/OS.e, z/VM, z/VSE, VSE/ESA, TPF, z/TPF e
Linux on System z.
Hoje, segundo especialistas, há uma forte e constante tendência de crescimento para este setor,
inclusive com as novas versões do Cobol (principal linguagem usada nos Mainframes) usando ambiente
gráfico.
QUADRO COMPARATIVO
Cada sistema operacional é construído de acordo com os códigos, micro-códigos, canais, protocolos e
sistemas de arquivos de uma plataforma operacional. Portanto, o sistema z/OS foi desenvolvido para o
mainframe assim como o Windows foi desenvolvido para o PC.
Todos os servidores, são distribuídos em escala de acordo com suas capacidades, a qual chamamos de
porte. Desta forma, em relação ao porte do servidor e a plataforma, os sistemas operacionais também são
escalares.
SISTEMA
PORTE PLATAFORMA FABRICANTE
OPERACIONAL
WINDOWS MICROSOFT
BAIXA PC´S LINUX (OPEN SOURCE)
MAC APPLE
HP-UX HP
MÉDIO UNIX RISC-AIX IBM
SOLARIS SUN
(MVS)
GRANDE MAINFRAME OS/390 IBM
(Z/OS)
1. Gerenciamento de processos;
2. Gerenciamento de memória;
3. Sistema de arquivos;
4. Entrada e saída de dados.
ARQUITETURA
CONSIDERAÇÕES
Agora vamos colocar os utilitários que foram solicitados pelo analista de sistemas para que os
programas possam ter condições de processamento. Para cada sequência de programas e/ou utilitários,
vamos estabelecer um Job. Portanto um job é uma sucessão de programas ou utilitários que irão processar
numa sequência lógica.
Agora vamos monta a cadeia de jobs com base nos programas que estão dentro destes jobs. Portanto agora
temos uma sequência de Jobs e dentro destes jobs uma sequência de programas.
O
Com base no 1 . fluxo podemos fazer algumas constatações:
Com base nestas informações, poderemos montar dois pacotes de programas que processarão numa
mesma sequência lógica. A este pacote denominamos JOB. Também poderemos montar outro JOB com
PROGR008 + PROG010 ou PROGR008 + PROGR012.
Agora vamos monta a cadeia de Jobs com base nos programas que estão dentro destes Jobs. Portanto
agora temos uma sequência de Jobs e dentro destes Jobs uma sequência de programas.
Imagine a cena: você chega a um hotel onde irá encontrar-se com alguém hospedado. Você não sabe onde
ele se encontra. Você se identifica á recepção do hotel que consulta um catálogo. Após encontrar o
hóspede que você procura, a recepcionista então te indica pegar um elevador e se dirigir ao 15o. andar, no
apartamento 1506. Você se encaminha e ao tocar a campainha você cumpriu seu roteiro.
O catálogo do sistema contém a informação de todos os arquivos existentes no sistema. Ele recebe a
solicitação vinda do cartão DD, procura o arquivo no catálogo, encontra o disco onde está o arquivo.
Chegando no disco, procura pela VTOC onde há um catálogo interno contendo todas as informações
daquele volume com o endereço físico do registro dentro do disco. O sistema então lê o registro em blocos
para a memória do computador.
O conceito de catálogo é o endereçamento dos conteúdos dos volumes para que possamos acessar um
arquivo, este endereçamento está dividido em níveis, o primeiro nível (catálogo) apontará em que volume
se encontra o arquivo que desejamos acessar, no segundo nível (VTOC) indicará qual será o endereço físico
do arquivo, como o próprio nome diz, é o índice dos arquivos. Existe o catálogo master que conterá a
definição dos catálogos de sistema, no catálogo de sistema são definidos os prefixos dos arquivos que serão
controlados por ele (Catálogo da produção, da homologação, do desenvolvimento). A cada encerramento
de um aplicativo que crie ou exclua um arquivo o catálogo é atualizado.
LEGENDA
O catálogo do sistema contém a informação de todos os arquivos existentes no sistema. Ele recebe a
solicitação vinda do cartão DD, procura o arquivo no catálogo, encontra o disco onde está o arquivo.
Chegando ao disco, procura pela VTOC onde há um catálogo interno contendo todas as informações
daquele volume com o endereço físico do registro dentro do disco. O sistema então lê o registro em blocos
para a memória do computador.
Um arquivo de informações (ou dados) é um conjunto formado por dados (ou informações) de um
mesmo tipo ou para uma mesma aplicação. Por exemplo, podemos ter um arquivo de alunos de
uma turma (contendo informações sobre cada aluno individualmente), ou um arquivo contendo as
instruções de um programa. Cada arquivo é constituído por itens individuais de informação (cada
aluno, no nosso exemplo) chamados registros.
CONCEITOS:
Todo arquivo reside em um meio físico, que pode ser em disco, fita ou cartucho.
Também chamado de DASD (Direct Access Sequential Device), é um periférico onde são
armazenados os dados dos arquivos. O acesso, para leitura ou gravação, dos dados dos arquivos
pode ser executado de maneira seqüencial, direta ou indexada.
Trilha: Nos discos os dados são gravados em circunferências concêntricas. Em cada uma das
circunferências concêntricas, onde estão gravados os dados, chamamos de trilha.
Tipos de Arquivos:
Arquivo Particionado: É o tipo de arquivo utilizado para armazenar membros que contém
informações, que serão utilizadas em um processamento, tais como:
Programas
Jobs
Parâmetros
Os arquivos no ambiente z/OS normalmente, podem possuir um dos quatro tipos de registros
descritos a seguir:
F – Fixo Desblocado - Significa que todos os blocos físicos do arquivo possuem apenas
um registro lógico de tamanho fixo por bloco em disco.
FB – Fixo Blocado - Significa que todos os blocos físicos do arquivo possuem mais de
um registro lógico de tamanho fixo por bloco em disco.
VB – Variável Blocado - Significa que todos os blocos físicos do arquivo possuem mais
de um registro lógico de tamanho variável por bloco em disco.
U – Indefinido - Significa que o tamanho dos registros são variáveis e os blocos físicos e
lógicos do arquivo não possuem estrutura pré-definida.
Os arquivos no sistema z/OS podem tanto ter registros lógicos como físicos.
Um registro lógico é a unidade que o programa deseja processar. Normalmente, consiste de um
número de campos concatenados.
Um registro físico descreve o montante de dados transferidos nas operações de E/S.
A combinação de múltiplos registros lógicos num único registro físico (chamamos de blocagem)
possui certas vantagens através do armazenamento e recuperação de um registro lógico bem
como um registro físico. Estas incluem maior eficiência no uso do espaço em disco, bem como,
melhor desempenho na transferência dos dados.
O DSName pode conter até 44 caracteres, sendo permitido a utilização de letras (A-Z; a-z),
números (0-9), e caracteres nacionais americanos @, #, $.
O primeiro qualificador identificado como High Level Qualifier (HLQ), pode identificar o ALIAS
associado a um catalogo.
FORMAÇÃO MAINFRAME
MÓDULO : TSO
WWW.ESCOLADEPROGRAMADORES.COM.BR
TSO
Aula 1
TSO - Time Sharing Option / Extensions (TSO/E)
Permite que os usuários criem uma sessão interativa com o sistema operacional z /OS.
No sistema operacional z /OS, cada usuário recebe uma identificação de userid e uma
password (senha) previamente cadastrada e configurada para logon no TSO.
A tela de logon tem a mesma finalidade como um painel de logon do Windows, ou seja,
permitir que o usuário cadastrado no sistema possa acessar os aplicativos.
A maioria dos usuários trabalham com TSO através de sua interface baseada em menus,
chamada ISPF (Interactive System Productivity Facility).
Esta coleção de menus e painéis oferece uma ampla gama de funções para ajudar os
usuários a trabalharem com arquivos de dados, programas, serviços, catálogos, aplicativos
de segurança e gerenciamento.
TSO e ISPF permite que pessoas com variados níveis de experiência e conhecimento
possam interagir com o Sistema Operacional z/OS.
Porém vale a pena lembrar que cada perfil de usuário, possui permissão, apenas para os
aplicativos que farão parte da sua rotina de trabalho dentro das empresas.
PRINCÍPIOS FUNDAMENTAIS
O TSO é um componente do sistema operacional, composto por vários aplicativos, dentre eles o
editor de textos PDF. O TSO tem como função primordial promover a interação do usuário com o
ambiente. Através do TSO você pode criar arquivos, deletar, visualizar, submeter job, alocar
arquivos, renomear, mover, copiar, e também utilizar outros aplicativos do sistema operacional que
rodam sob o TSO como por exemplo RACF, HCD, SDSF, Control/M, Endevor etc. O TSO controla
todos estes aplicativos.
Os nossos objetos de estudos serão os aplicativos PDF e SDSF para criarmos jobs, programas,
manusear arquivos, submeter jobs etc.
LOGANDO NO TSO
Se logar no TSO/E significa começar uma sessão de TSO. Para se logar é preciso de uma userid e
senha de acesso.
NESTA TELA
VOCÊ DEVERÁ
DIGITAR O SEU
USUÁRIO !!!!
NESTA TELA
VOCÊ DEVERÁ DIGITAR A SUA
PASSWORD, FORNECIDA PELO
INSTRUTOR !!
Após digitar a senha nova, o TSO solicitará que você digite novamente a mesma senha,
para que seja feita a confirmação de alteração de senha.
Esta tela mostra que seu logon foi efetuado com sucesso
Caso não tenha sido exibida esta tela, refaça os passos anteriores.
Após esta etapa, apertar a tecla Enter
Esta é a tela principal do TSO. O único destes aplicativos que é nativo no TSO é o PDF. Os demais
são adicionados ao sistema operacional. Após sua instalação, eles „rodam‟ debaixo do TSO. Nosso
objeto de estudo serão os aplicativos PDF e o SDSF.
A opção 2 não é muito diferente da opção 1. Nesta opção você já entra direto na opção EDIT que
permite você alterar um arquivo.
OPÇÃO 3 DO PDF
Este menu é o mais utilizado. Auto-explicativo, exibe display das funções. As opções mais utilizadas
deste menu, são as opções de 1 a 4.
Além destas, as opções 12 e 13 para comparar data-sets e 14 e 15 que pesquisa string dentro de
particionados.
1 Library Compress or print data set. Print index listing. Print, rename, delete, browse, edit or
view members
Você deverá preencher a opção, que define o que você deseja executar sobre o arquivo em
questão. O nome do arquivo a ser trabalhado, deve ser preenchido na área ISPF Library ou na
área Other Partitioned or Sequential Data Set (neste caso o nome deverá estar entre aspas
simples). Neste exemplo, escolhemos a opção „I‟, ou seja, vamos visualizar as informações do
ARQUIVO GR.IBMUSER.JCLDATA.
Vamos preencher com os dados solicitados pelo sistema. Trilhas, tamanho lógico, formato, etc.
Após o ENTER, será visualizada a mensagem de confirmação da alocação.
4 Dslist Print or display (to process) list of data set names. Print or display VTOC information.
Podemos trabalhar com os data-set listados acima. Podemos editar (E), visualizar (B), deletar (D),
renomear (R), copiar (C), mover (M), etc. Uma outra opção, nesta tela é utilizar o comando barra
(como no exemplo), que vai abrir várias opções, inclusive as citadas acima.
Veja o resultado:
Um pop-up foi aberto e várias opções sobre o que fazer com o arquivo selecionado. Basta
selecionar o número da opção. Funcionar como os comandos citados.
A partir deste comando quase todas as funções mostradas até o momento poderão ser feitas a
partir desta opção.
As opções de 5 a 11 estão desabilitadas e por isso não serão objetos de estudo. Elas são de uso da
área de suporte operacional.
Exercícios de Fixação
F MARIA - procura pela palavra Maria dentro do arquivo. Para continuar procurando a
mesma ocorrência no restante do arquivo, continue teclando „F5”,
C SECTION SECAO ALL altera todas as ocorrências „section‟ para „secao‟ (em todo
arquivo).
RECOVERY ON Uma única vez, habilita a opção UNDO (desfazer) uma função.
L PGM01 Este comando só poderá ser executado quando dentro de uma biblioteca.
Utilizado para localizar um membro dentro de uma biblioteca.
EXC SECTION ALL Exclui todas as linhas com a ocorrência „section‟ – (sem all,
somente a primeira)
COMANDOS DE LINHAS
C copia linha
M Move 1 linha
R Repete linha
| - Insere linhas
Se um Member for aberto no modo VIEW, as alterações efetuadas não poderão ser gravadas. Para
descartar as alterações em COMMAND digite CANCEL e <enter>.
Para gravar as alterações digite CC na primeira linha e CC na ultima linha e em COMMAND digite
REPLACE “nome do member” e <enter>.
Para criar uma cópia de um Member sendo editado (EDIT) ou visualizado (VIEW) , digite CC na
primeira e última linha e em COMMAND digite CREATE “nome do novo membro” e <enter>.
O SDSF
Esta é a tela principal do System Display Search Facility, ou simplesmente SDSF. É um aplicativo
que, a exemplo do PDF, roda debaixo do TSO. A principal função deste aplicativo é permitir o
acompanhamento e monitoração de jobs dentro do sistema operacional.
Nesta tela acima podemos perceber que as opções mostram as diversas áreas do sistema
operacional por onde trafegam os jobs batch. Nem todas as opções estarão habilitadas para você
na sua empresa. E mesmo dentre as opções liberadas existem funções como por exemplo, cancelar
jobs, deletar sysout, monitorar job de outro usuário que você certamente não terá permissão, pois o
SDSF é controlado pelo RACF.
H Jobs em hold
Opção ST
Visualizar jobs
NOTA: O usuário IBMUSER só consegue visualizar os jobs iniciados com „IBMUSER‟. A opção „S‟
(de select) abre a visualização da sysout do jobs como veremos a seguir.
Resultado:
Repare que a tela está dividida. A linha pontilhada indica a divisão em 2 sessões simultâneas.
SAINDO DO TSO
Você deve pressionar F3 até aparecer a tela abaixo.
Digite 2 em Process option e pressione <Enter>.
LOGOFF
• O comando LOGOFF (que você deverá digitar logo abaixo de READY) encerra a sessão de TSO.
Como confirmação da ação e‟ enviada a seguinte mensagem ao terminal:
NOTA : Nunca saia do TSO sem LOGOFF – o USUÁRIO fica retido e você não
conseguirá efetuar o logon novamente. Se isto acontecer, solicite ao instrutor,
para fazer o cancelamento de sua sessão.
Exercícios de Fixação
2. Consulte na opção SDSF, o seu usuário logado e veja o que acontece se você colocar
“P” no lado esquerdo do seu usuário ?
FORMAÇÃO MAINFRAME
MÓDULO : JCL
WWW.ESCOLADEPROGRAMADORES.COM.BR
JCL
SUMÁRIO
JOB CONTROL LANGUAGE................................................................................................................................. 2
1.1 DEFINIÇÃO ..................................................................................................................................................... 2
1.2 DESENHO DE UM JOB ..................................................................................................................................... 2
1.3 ESTRUTURA DE UM JOB ................................................................................................................................. 3
1.4 REGRAS PARA CONFECÇÃO DE UM JOB ......................................................................................................... 4
1.5 PARÂMETROS ESPECIAIS ................................................................................................................................ 4
1.5.1 JOBCARD – PARÂMETROS MAIS COMUNS ............................................................................................. 4
1.5.2 JOBCARD – PARÂMETROS MENOS USUAIS ............................................................................................ 7
1.5.2 EXEC ..................................................................................................................................................... 10
1.5.3 DD (DATA DEFINITION) ........................................................................................................................ 12
1.5 JOBLIB .......................................................................................................................................................... 18
1.6 STEPLIB ......................................................................................................................................................... 18
1.7 DDNAME X DSN(DSNAME) ........................................................................................................................... 19
1.7.1 DDNAME .............................................................................................................................................. 19
1.7.2 DSN (DSNAME) ..................................................................................................................................... 19
1.8 PARM ........................................................................................................................................................... 20
1.10 JCL ERROR X ABEND X FLUSH....................................................................................................................... 20
1.10.1 JCL ERROR .......................................................................................................................................... 20
1.10.2 ABEND ................................................................................................................................................ 20
1.10.3 FLUSH ................................................................................................................................................. 20
CAPÍTULO 3 – ABENDS SISTEMA OPERACIONAL .............................................................................................. 21
1.1 DEFINIÇÃO
É a linguagem utilizada pelos mainframes para execução dos JOBs (Tarefas). Os JOBs solicitam
recursos (programas, arquivos, etc) ao Sistema Operacional para execução de programas.
Os JOBs são responsáveis por atualização de contas correntes, geração de contratos, emissão de
boletos e duplicatas, baixa de pagamentos e muitas outras tarefas em bancos, seguradoras e
financeiras.
JOB / JOBNAME
É a composição de uma série de programas (Cobol ou Utilitários) que devem ser processados numa
determinada sequência. Um job representa um conjunto de STEPs.
STEP / STEPNAME
É a execução de um programa Cobol ou um programa Utilitário.
JOBXX01D
STEP001 SORT
STEP002 COBXX01
STEP003 IDCAMS
STEP004 COBXX02
O JOB JOBXX01D é formado por 4 STEPs. São eles : STEP001, STEP002, STEP003 e STEP004.
O STEP001 executa o programa Utilitário SORT.
O STEP002 executa o programa Cobol COBXX01.
O STEP003 executa o programa Utilitário IDCAMS.
O STEP004 executa o programa Cobol COBXX02.
----+----1----+----2----+----3----+----4----+----5----+----6----+----7--
//JOBXX01D JOB 'JOB-PRD',CLASS=C,MSGCLASS=X,NOTIFY=GPYYXX,TIME=(0,20)
//********************************************************************
//* STEP001 - UTILITARIO SORT - ORDENA ARQUIVO POR DATA DE PAGAMENTO *
//********************************************************************
//STEP001 EXEC PGM=SORT
//SYSOUT DD SYSOUT=*
//SORTIN DD DSN=GR.GPYYXX.ARQPGTO,DISP=SHR
//SORTOUT DD DSN=GR.GPYYXX.ARQPGTO,DISP=SHR
//SYSIN DD *
SORT FIELDS=(01,08,CH,A)
//********************************************************************
//* STEP002 - PROGRAMA COBXX01 - GERACAO RELATORIO PAGAMENTOS *
//********************************************************************
//STEP002 EXEC PGM=COBXX01
//STEPLIB DD DSN=GR.GERAL.LOADLIB,DISP=SHR
//ARQPGTO DD DSN=GR.GPYYXX.ARQPGTO,DISP=SHR
//RELATO DD SYSOUT=*
//SYSOUT DD SYSOUT=*
//********************************************************************
//* STEP003 - UTILITARIO IDCAMS - DELECAO ARQUIVO ARQSERA *
//********************************************************************
//STEP003 EXEC PGM=IDCAMS
//SYSOUT DD SYSOUT=*
//SYSPRINT DD SYSOUT=*
//SYSIN DD *
DELETE GR.ARQUIVO.ARQSERA
//********************************************************************
//* STEP004 - PROGRAMA COBXX02 - GERACAO ARQUIVO ARQSERA *
//********************************************************************
//STEP004 EXEC PGM=COBXX02
//STEPLIB DD DSN=GR.GERAL.LOADLIB,DISP=SHR
//ARQPGTO DD DSN=GR.GPYYXX.ARQPGTO,DISP=SHR
//ARQSERA DD DSN=GR.GPYYXX.ARQSERA,
// DISP=(NEW,CATLG,DELETE),
// UNIT=3390,
// SPACE=(TRK,(5,1),RLSE),
// DCB=(RECFM=FB,LRECL=800,BLKSIZE=0)
//SYSOUT DD SYSOUT=*
Visualizando o JOB anterior parece complexo o entendimento da linguagem JCL. Contudo, nos
próximos tópicos estaremos abordando todas as instruções utilizadas durante a confecção de um
JOB.
JOBCARD
EXEC
DD (Data Definition)
Exemplo :
JOBNAME
É o nome do JOB (JOBNAME). Em caso de falha no JOB a primeira a coisa a ser verificada é o
JOBNAME. Formado por 8 carácteres.
Exemplo :
JOB
Todo JOB deve possuir a palavra reservada JOB. A palavra reservada JOB solicita ao Sistema
Operacional a execução de JOBs.
Exemplo :
ACCOUNT INFORMATION
São as informações para geração de estatísticas. Essas informações são chamadas de ACCOUNT
INFORMATION. Normalmente, informa-se o nome da companhia, do departamento, do programador,
analista, etc.
Exemplo :
CLASS
Define a classe de entrada dos JOBs. Existem 36 classes disponíveis. As classes disponíveis vão de
A-Z (26 classes) e de 0 a 9 (10 classes).
Exemplo :
MSGCLASS
Define a classe de saída dos JOBs. Existem 36 classes disponíveis. As classes disponíveis vão de
A-Z (26 classes) e de 0 a 9 (10 classes).
Exemplo :
NOTIFY
Define o usuário que receberá as notificações dos JOBs executados. Se informado
NOTIFY=&SYSUID as notificações irão para o usuário que estiver logado no TSO.
Exemplo :
TIME
É o CPU TIME (Tempo de Processamento de Máquina). É o tempo necessário para que o JOB
termine a sua execução.
Exemplo :
Onde :
0 = (Quantidade em Minutos)
20 = (Quantidade em Segundos)
Exemplo :
Onde :
20 = (Quantidade em Segundos)
Exemplo :
Onde :
5 = (Quantidade em Minutos)
DICA 1 - IMPORTANTE !
DICA 2 - IMPORTANTE !
CPU TIME não é a quantidade de segundos corridos. O cálculo do CPU TIME depende de fatores
como : quantidade de base de dados a serem acessados, quantidade de instruções, quantidade de
jobs executando concorrentemente, entre outros fatores.
DICA 3 - IMPORTANTE !
O sistema operacional retorna o abend S322 quando existe estouro de CPU TIME. A causa mais
normal do abend S322 são programas em looping ou programas que fazem acessos a muitas bases
de dados.
MSGLEVEL
Define o nível das mensagens a serem geradas pelo JOB.
Sintaxe :
MSGLEVEL=(X,Y)
Y = refere-se as mensagens
0 = As mensagens de alocação não serão impressas a não ser que o JOB termine com falha
1 = As mensagens de alocação sempre serão impressas
Exemplo :
TYPRUN
Quando informado esse parâmetro o JOB não é executado.
Exemplo :
PRTY
Define a prioridade de execução do JOB. Os valores de prioridade variam entre 0 e 15. Sendo 15 a
maior prioridade e 0 a menor prioridade.
Exemplo :
REGION
Indica a quantidade de memória a ser utilizada para execução do JOB. Pode ser informada
Megabytes ou Kilobytes.
Exemplo :
DICA 1 - IMPORTANTE !
RESTART
Indica a partir de qual STEP será feita a execução do JOB. Os steps anteriores não serão executados.
Utilizado por analista de produção para reiniciar a execução do JOB em caso de falha.
Exemplo :
1.5.2 EXEC
Informa qual o programa, utilitário ou procedure será executado pelo STEP do JOB.
STEPNAME
É o nome do STEP (STEPNAME). Em caso de falha no JOB, a segunda a coisa a ser verificada é o
STEPNAME. Formado por até 8 carácteres.
Exemplo ( STEPNAME ) :
Execução de Utilitário :
Execução de Programa :
Execução de Procedure :
JCLLIB
ORDER
Referencia o nome da biblioteca.
//JOBPROCS PROC
//*****************************************************************
//* STEP001 - EXECUTA PROGRAMA COBXX01 *
//*****************************************************************
//STEP001 EXEC PGM=COBXX01
//STEPLIB DD DSN=GR.GERAL.LOADLIB,DISP=SHR
//SYSOUT DD SYSOUT=*
//SYSPRINT DD SYSOUT=*
//*****************************************************************
//* STEP002 – EXECUTA PROGRAMA COBXX02 *
//*****************************************************************
//STEP002 EXEC PGM=COBXX02
//STEPLIB DD DSN=GR.GERAL.LOADLIB,DISP=SHR
//SYSOUT DD SYSOUT=*
//SYSPRINT DD SYSOUT=*
Pode ser :
Exemplo :
* (ASTERICO)
Referencia dados de entrada para o programa que está sendo executado.
Exemplo :
DICA – IMPORTANTE !
SORT FIELDS=(01,08,CH,A) é passado como parâmetro para o programa que está sendo
executado. No nosso exemplo, o utilitário SORT.
DUMMY
Faz simulação de dados para o programa que está sendo executado. A instrução DUMMY permite
que o programa execute mesmo que o DataSet não exista.
Exemplo :
SYSOUT
Gera para o Sistema Operacional um DataSet com as saídas geradas pelo programa.
Exemplo :
DISP
Refere-se como o DataSet será disponibilizado para o sistema operacional.
[TERCEIRO PARÂMETRO]
TÉRMINO ANORMAL
[PRIMEIRO PARÂMETRO]
STATUS
DISP=(NEW,CATLG,DELETE)
[SEGUNDO PARÂMETRO]
TÉRMINO NORMAL
PARÂMETRO(s) DESCRIÇÃO
SHR Significa que o DataSet existe e pode ser lido por outro recurso simultâneamente.
OLD Significa que o DataSet existe e que o programa exige exclusividade na leitura.
NEW Criação de DataSet
MOD Modifica um DataSet sequencial. Acrescenta novos registros no final.
CATLG Cataloga o DataSet. Obviamente que esta opção deve estar sempre
acompanhada de NEW no primeiro sub-parâmetro. Porque se o DataSet estiver
sendo lido é porque já está catalogado.
UNCATLG Descataloga o DataSet. Evite usar sempre.
DELETE Delete o DataSet. Se precisar deletar o DataSet use sempre esta opção.
KEEP Mantem o DataSet do jeito que estava antes.
PASS Passa o DataSet para o próximo STEP do JOB.
Exemplo :
//JOBXX01D JOB 'JOB-PRD',CLASS=C,MSGCLASS=X,NOTIFY=GPYYXX,TIME=(0,20)
//********************************************************************
//* STEP004 - PROGRAMA COBXX02 - GERACAO ARQUIVO ARQSERA *
//********************************************************************
//STEP004 EXEC PGM=COBXX02
//STEPLIB DD DSN=GR.GERAL.LOADLIB,DISP=SHR
//ARQPGTO DD DSN=GR.GPYYXX.ARQPGTO,DISP=SHR
//ARQSERA DD DSN=GR.GPYYXX.ARQSERA,
// DISP=(NEW,CATLG,DELETE),
// UNIT=3390,
// SPACE=(TRK,(5,1),RLSE),
// DCB=(RECFM=FB,LRECL=800,BLKSIZE=0)
//SYSOUT DD SYSOUT=*
Exemplo Inválido :
DISP=(NEW,KEEP,DELETE)
Como manter um DataSet, sendo que o DataSet nem foi criado ainda.
DEFAULT
Se você colocar apenas DISP=SHR o sistema assume (SHR,KEEP,KEEP).
SPACE
Espaço físico a ser utilizado.
Onde :
5 = Alocação Primária
1 = Alocação Secundária
Exemplo :
ALOCAÇÃO SECUNDÁRIA
Pode ser extendida até 15 extends.
Logo, nessa alocação de DataSet teríamos no máximo 20 trilhas. Sendo 5 trilhas para alocação
primária e no máximo 15 para alocação secundária.
UNIT
Informa o tipo de dispositivo.
Exemplo :
VOLUME
Informa qual volume dentro do DISCO deve ser referenciado.
Exemplo :
PR39X7
É o volume que está sendo referenciado
Exemplo :
RECFM
Define o formato do arquivo
LRECL
Informa o tamanho do registro do arquivo. No nosso exemplo o tamanho do arquivo é 800 bytes.
BLKSIZE
Define a blocagem do arquivo. Isto é, quantos registros formam um bloco para acessar ao arquivo.
Deve ser sempre um múltiplo de LRECL ou 0(Zero). Se informado 0(Zero) a blocagem ideal é
calculada automaticamente.
1.5 JOBLIB
É a biblioteca na qual todos os STEPs do JOB referenciarão para execução dos programas Cobol.
(Somente objetos, programas que foram compilados e linkeditados).
Exemplo :
1.6 STEPLIB
É a biblioteca na qual um determinado STEP referencia para a execução do programa COBOL.
Exemplo :
A STEPLIB sobrepõe a JOBLIB. Caso informado no JOB, as duas opções a STEPLIB prevalece
sobre a JOBLIB. Isto é, a STEPLIB sobrepõe (override) a JOBLIB.
IMPORTANTE
Caso no JOB não seja referenciado nem a JOBLIB e nem STEPLIB, nenhum programa Cobol
será executado.
Exemplo :
DDNAMEs
ARQPGTO e ARQSERA são os DDNAMES desse STEP. Sendo ARQPGTO (Entrada) e
ARQSERA (Saída).
Exemplo :
DSNAMEs
GR.GPYYXX.ARQPGTO e GR.GPYYXX.ARQSERA são os DSNAMES desse STEP. Sendo
ARQPGTO (Entrada) E ARQSERA (Saída).
1.8 PARM
Efetiva a passagem de parâmetros para o programa que será executado. Deve possuir no máximo
100 carácteres.
Exemplo :
1.10.2 ABEND
Representa falha na execução do STEP. O Sistema Operacional ou o programa retornam um código
de retorno ou código de ABEND no STEP.
O JOB é executado. O STEP é executado, porém existem uma falha na execução do STEP.
1.10.3 FLUSH
Significa que determinado STEP não foi executado. Normalmente ocorre o FLUSH no JOB quando
existe dependência entre os STEPs do JOB.
MACRO 'ENQ'.
S137 - ERRO NO FIM DE VOLUME EM FITA.
- 04-08-0C-10-14-18 ERRO DE POSICIONAMENTO, LEITURA OU GRAVA-
CAO EM FIM DE VOLUME REPROCESSAR COM BACKUP
- 1C - 'TRAILER LABEL' INVALIDO.
- 20 - 'HEADER LABEL' INVALIDO.
S13F - 'RESTART NOT SUCESSUFUL'. REPROCESSAR.
S180 - 'GDG' DO ARQUIVO DE LEITURA/GRAVACAO NAO FOI CRIADO.
S1F9 - DURANTE A EXECUCAO DE UM COMANDO MODIFY PAA PARAR OU RESTARTAR
UMA LINE, A IMPRESSORA OU UM PGM EXTERNO ABENDOU.
S200 - ERRO DE MAQUINA. REPROCESSAR.
S201 - ENDERECAMENTO DA 'DCB' INVALIDO.
S207 - ROTINA DE 'EXIT'NAO SINCRONIZADA.
S213 - ERRO DURANTE INSTRUCAO DE 'OPEN' DE ARQUIVO EM DISCO.
- 04 - O ARQUIVO NAO FOI ENCONTRADO, VERIFICAR DE 'DSN' E 'VOL'
ESTAO CORRETOS. INEXISTENCIA DO ARQUIVO OU ACESSO A DISCO ERRADO
- DSCB NOT FOUND. I/O R/W DSCB.
- LEITURA DE UM ARQUIVO CATALOGADO EM QUE HA O NOME DO ARQUIVO NA
VTOC, MAS OS DADOS FORAM DELETADOS.
- DSNAME OU VOLUME INCORRETOS.
S214 - ERRO OCORREU DURANTE A EXECUCAO DE UMA INSTRUCAO DE 'CLOSE' PA-
RA UM ARQUIVO EM FITA. REPROCESSAR.
- ERRO DE I/O NA LEITURA DO LABEL DO USUARIO NUMA FITA.
S217 - ERRO DE FECHAMENTO DE UM ARQUIVO 'BSAM'.
S222 - CANCELADO PELO OPERADOR SEM 'DUMP'.
S22D - ENDERECAMENTO FORA DOS LIMITES DA MEMORIA VIRTUAL.
S23D - ERRO NA MACRO 'DEQ'. TAMANHO ERRADO.
S237 - ERRO NO FIM DO VOLUME.
- 04 - ERRO NA CONTAGEM DOS BLOCOS. SE OCORREU NO COMECO DE UM
ARQUIVO COM VARIOS VOLUMES OU SE TIVER 'CHECKPOINT', TENTAR
REPROCESSAR SENAO FAZER FD.
S2F3 - JOB CANCELADO POR QUEDA DO SISTEMA.
S22D - ENCERRAMENTO FORA DOS LIMITES DA MEMORIA VIRTUAL.
S301 - INSTRUCAO DE 'WAIT' NA 'DCB' JA ESTAVA LIGADA.
S306 - MODULO ACESSADO NAO ENCONTRADO.
S30A - AUMENTAR A 'REGION'.
- FALTA CLAUSULA OBJECT-COMPUTER.
S313 - UM VOLUME OU 'DEVICE' DEFEITUOSO CAUSOU ERRO.
S314 - ERRO DE FECHAMENTO DE UM ARQUIVO.
S317 - ERRO DE FECHAMENTO DE UM ARQUIVO 'BSAM' CAUSADO POR UM VOLUME
OU DEVICE DEFEITUOSO.
S322 - AUMENTAR O 'TIME' DO CARTAO JOB.
S32D - LINKEDITE O PGM PROBLEMA NOVAMENTE E REEXECUTE O JOB STEP
ABEND NO SORT - CARTAO DE CONTROLE ERRADO.
S330 - ERRO NA MACRO 'DEQ'. ESPECIFICOU UMA OPCAO RESET-MUST-COMPLETE
OU GENERICO OU DIRETO DE 'DEQ'. SENDO ESSAS OPCOES VALIDAS
APENAS EM ESTADO SUPERVISOR.
S337 - O ERRO OCORREU QUANDO UM FIM DE ARQUIVO FOI ALCANCADO.
04 - O FIM DE ARQUIVO FOI ALCANCADO E NAO EXISTE ROTINA DE
'EOF'. OCORRE QUANDO EXISTE UM ARQUIVO MULTIVOLUME E NAO
FORAM FORCADOS TODOS OS VOLUMES.
S3FE - UMA 'TASK' TERMINANDO, EDITA UM 'I/O' A SER EXECUTADO POR
OUTRA 'TASK'.
S400 - FALTA CARTAO 'SYSOUT' PARA O PROGRAMA.
S402 - COLOCADO ENDERECOS DA TABELA DE EVENTOS DA 'DCB' ANTES DA OCOR-
RENCIA DE UM EVENTO ASSOCIADO A 'DCB'.
Direitos Autorais – GPTI Treinamento 24
JCL
S813 - ERRO DE 'OPEN' PARA ARQUIVO EM FITA. CHECAR 'DSN' DO JCL COM
LABEL. COLOCAR 'DSN' E GERACAO CORRETOS.
- LABEL DA FITA NAO COMBINA COM A DESCRITA NO PGM.
- LABEL DA FITA DESTRUIDO.
S814 - FALTA PARAMETRO 'REGION' NOS CARTOES JOB OU EXEC, OU ENTAO
A QUANTIDADE ESPECIFICADA E' PEQUENA.
S822 - ESPACO PEDIDO EM 'V=R' NAO DISPONIVEL.
S837 - AUMENTAR O 'VOLCOUNT' EX.: VOL=(,,,6).
S878 - IDEM AO 'S804'.
S905 - O ENDERECO DA MEMORIA NAO E UMA 'DOUBLEWORD' OU NAO E'
MULTIPLO DE 8.
S906 - ALTERE O PROGRAMA PARA ACEITAR O 'LINKAGE-EDITOR' SERIAL/
REUSAVEL.
S90A - ERRO DE PROGRAMA. ERRO NA INSTRUCAO 'FROM' OU DAR 'CLOSE' EM
ARQUIVO FECHADO.
S913 - ERRO NA 'PASSWORD' DE ABERTURA DO ARQUIVO.
SA0A - A CHECAGEM DO SISTEMA DETECTOU UM ERRO DE HARDWARE.
SA04 - MANAGEMENT QUEUE DA MEMORIA ALTERADO INCORRETAMENTE.
SA05 - PROGRAMA DE CONTROLE ACESSOU UMA AREA EM BRANCO DA MEMORIA
VIRTUAL.
- ABRIR OU FECHAR DUAS VEZES O MESMO ARQUIVO.
SA06 - ALTERE O PROGRAMA PARA ESPERAR ATE' QUE LOADER SEJA SERIALMENTE
REUSAVEL.
SA13 - UM 'OPEN' FOI TENTADO PARA ABRIR UM ARQUIVO EM FITA, MAS ESTE
NAO FOI ENCONTRADO NA MESMA. VERIFICAR SE O VOLUME SEQUENCIAL
ESTA CORRETO. CHECAR O PARAMETRO 'LABEL', SE ESTIVER SALTANDO
ARQUIVOS. ERRO NA 'DCB' DA FITA.
SA14 - ERRO DE 'I/O' CAUSADO POR UM VOLUME OU DISPOSITIVO DEFEITUOSO.
SB0A - CHAVE DE INTERRUPCAO FOI TECLADA PELO OPERADOR.
SB04 - ESPACO REQUISITADO ESPECIFICADO INCORRETAMENTE.
SB06 - ERRO DE MAQUINA, SUBMETA NOVAMENTE SUA TASK.
SB13 - ERRO NA ABERTURA DE UM ARQUIVO DE IMPRESSAO.
SB14 - NOME DUPLICADO EM UM ARQUIVO PARTICIONADO.
SB37 - ERRO OCORREU DURANTE FIM DE VOLUME. ESPACO RESERVADO NAO FOI
SUFICIENTE. AUMENTAR AREA OU RETIRAR O 'CLOSE UNIT'.
- BIBLIOTECA SEM ESPACO.
- SE O ARQUIVO FOR EM DISCO JA OCORRERAM 16 EXTENDS, MAS O
ARQUIVO PRECISOU DE MAIS ESPACO.
- NAO HA MAIS ESPACO DISPONIVEL PARA ALOCAR NO VOLUME PEDIDO.
- MAIS ESPACO FOI PEDIDO MAS O VTOC ESTA CHEIO.
- INSUFICIENCIA DE ESPACO PARA COMPILAR/LINKEDITAR O PGM.
SC03 - FALTOU CLOSE EM UM ARQUIVO NO PROGRAMA EXECUTADO SOB LOADER.
SC06 - ERRO DE MAQUINA, SUBMETA O JOB NOVAMENTE.
SC13 - ERRO NA ABERTURA DE UM ARQUIVO CONCATENADO PARTICIONADO.
- ERRO NA ABERTURA DE GRAPHIC DEVICE.
SC2D - LINKEDITE O PROGRAMA NOVAMENTE E REEXECUTE O JOB.
SD13 - ERRO NA 'DCB' DA IMPRESSORA.
SD14 - FECHAR UM ARQUIVO NAO ABERTO.
SD2D - LINKEDITE O PROGRAMA NOVAMENTE E REEXECUTE O JOB.
SD23 - 'BUFFERS' NAO ACESSAVEIS.
SD37 - ESTOURO DE DISCO. AUMENTAR 'SPACE', COLOCAR OU AUMENTAR AREA
SECUNDARIA. PODE SER ESTOURO NA BIBLIOTECA.
SE13 - ERRO DE 'DCB' NO CARTAO DD.
SE2D - LINKEDITE O PROGRAMA NOVAMENTE E REEXECUTE O JOB.
SE23 - AREA DA MEMORIA VIRTUAL PARA REPOSICAO INVALIDA.
SE37 - FALTA ESPACO NO 'VOLCOUNT'.
Direitos Autorais – GPTI Treinamento 26
JCL
FORMAÇÃO MAINFRAME
MÓDULO : COBOL
WWW.ESCOLADEPROGRAMADORES.COM.BR
COBOL
INDICE
5 COMANDOS ................................................................................................................................. 23
12 FLUXOGRAMA ........................................................................................................................... 47
14 MOVIMENTAÇÃO DE CAMPOS................................................................................................ 53
20 RELATÓRIOS ............................................................................................................................. 60
A conversão do número inteiro, de decimal para binário, será feita da direita para a
esquerda, isto é, determina-se primeiro o algarismos das unidades ( o que vai ser multiplicado por
0 1
2 ) , em seguida o segundo algarismo da direita ( o que vai ser multiplicado por 2 ) etc...
A questão chave, por incrível que pareça, é observar se o número é par ou ímpar. Em
binário, o número par termina em 0 e o ímpar em 1. Assim determina-se o algarismo da direita,
pela simples divisão do número por dois; se o resto for 0 (número par) o algarismo da direita é 0;
se o resto for 1 (número ímpar) o algarismo da direita é 1.
Para saber o resultado em binário, basta verificar os restos das divisões de baixo para cima.
Exemplo:
Decimal Binário
0 0000
1 0001
2 0010
3 0011
4 0100
5 0101
6 0110
7 0111
8 1000
9 1001
10 1010
11 1011
12 1100
13 1101
14 1110
15 1111
ASCII (American National Standard Code for Information Interchange): é uma codificação de
caracteres de oito bits baseada no alfabeto inglês. Os códigos ASCII representam texto em
computadores, equipamentos de comunicação, entre outros dispositivos que trabalham com texto.
Desenvolvida a partir de 1960, grande parte das codificações de caracteres modernas a herdaram
como base.
Programa objeto: Existem linguagens que são compiladas e as que são interpretadas. As
linguagens compiladas, após ser compilado o código fonte, transformam-se em software, ou seja,
programas executáveis.
2.1 INDENTAÇÃO
O processo de indentação consiste em alinhar comandos, de forma que fique mais fácil ao
programador que estiver analisando o código, visualizar e, por decorrência, entender o conjunto de
instruções. Algumas instruções trabalham com Subconjuntos (blocos) de (outras) instruções; por
meio da indentação colocam-se instruções que façam parte de um mesmo bloco num mesmo
alinhamento.
O caso mais comum é o das instruções condicionais (IF), onde normalmente existe pelo
menos um bloco de instruções que deve ser executado quando a condição for verdadeira; e,
opcionalmente, outro bloco de instruções que devem ser executadas quando a condição for falsa,
exemplo:
IF condição
bloco para condição verdadeira
ELSE
bloco para condição falsa
END-IF
IF condição
COMPUTE A = (B * C ) ** 4
COMPUTE C = A / 0,005
ELSE
COMPUTE A = (B * C ) ** 5
COMPUTE C = A / 0,015
END-IF
Ficaria mais difícil analisar do que se houvesse sido especificado com indentação:
IF condição
COMPUTE A = (B * C ) ** 4
COMPUTE C = A / 0,005
ELSE
COMPUTE A = (B * C ) ** 5
COMPUTE C = A / 0,015
END-IF.
A vantagem desta técnica é que fica muito mais evidente quando houver IFS encadeados :
IF condição IF condição
IF condição IF condição
COMPUTE A = (B * C ) ** 4 COMPUTE A = (B * C ) ** 4
COMPUTE C = A / 0,005 COMPUTE C = A / 0,005
ELSE ELSE
COMPUTE A = (B * C ) ** 8 COMPUTE A = (B * C ) ** 8
COMPUTE C = A / 0,055 COMPUTE C = A / 0,055
END-IF END-IF
ELSE ELSE
IF condição IF condição
COMPUTE A = (B * C ) ** 5 COMPUTE A = (B * C ) ** 5
COMPUTE C = A / 0,007 COMPUTE C = A / 0,007
ELSE ELSE
COMPUTE A = (B * C ) ** 9 COMPUTE A = (B * C ) ** 9
COMPUTE C = A / 0,007 COMPUTE C = A / 0,007
END-IF END-IF
END-IF. END-IF.
Todo programa escrito na linguagem COBOL possui algumas regras a serem seguidas.
Uma destas regras se refere ao formato das linhas de comando (instruções) dentro do seu editor
de fonte. Uma linha de comando COBOL pode ter até 65 caracteres, conforme o formato abaixo:
Normalmente consiste em seis dígitos em ordem crescente que são utilizados para
numerar as linhas do programa fonte.
HÍFEN (-)
Se o hífen estiver nesta posição indica que existe uma continuação de uma cadeia de
caracteres, (uma palavra ou frase), que foi iniciada na linha anterior. Uma literal que não caiba
numa linha, para que seja continuada na próxima linha, precisa ter na próxima linha a indicação da
continuação (hífen na coluna 7) e, em qualquer coluna a partir da 12, um apóstrofe ou aspas
indicando o início da continuação.
ASTERISCO (*)
Nesta posição indica, para o compilador COBOL, que toda a linha deve ser tratada como
uma linha de comentário.
Área A: Posição a partir da qual se escreve nome das Divisões, Sessões, parágrafos, palavras
reservadas e níveis de dados.
Área B: Posição a partir da qual se escrevem as instruções na linguagem COBOL.
Exemplo:
3 DIVISÕES DO COBOL
IDENTIFICATION DIVISION
ENVIRONMENT DIVISION
DATA DIVISION
A DATA DIVISION descreve os layouts dos arquivos de entrada e saída que serão usadas
pelo programa. Também define as áreas de trabalho e constantes necessárias para o
processamento dos dados.
PROCEDURE DIVISION
A PROCEDURE DIVISION contém o código que irá manipular os dados descritos na DATA
DIVISION. É nesta divisão que o desenvolvedor descreverá o algoritmo do programa.
Esta é a divisão de identificação do programa. Não contêm Sections, mas somente alguns
parágrafos pré-estabelecidos e opcionais. O único parágrafo obrigatório é o PROGRAM-ID (Nome
do programa). O nome do programa deve ser uma palavra com até 8 caracteres (letras ou
números), começando por uma letra.
Todas as cláusulas que possuem a palavra “comentário” à direita, não possuem nenhum
efeito na aplicação. São apenas parâmetros opcionais para documentação do programa.
Esta seção destina-se a descrição dos equipamentos que serão utilizados pelo programa.
Esta SECTION é composta por três parágrafos: SOURCE-COMPUTER, OBJECT-COMPUTER e
SPECIAL-NAMES. A declaração destes parágrafos eram necessárias até a versão do MVS/ESA,
pois um programa só podia ser executado em apenas uma máquina. Após as versões OS/390 e
z/OS, e a nova versão do COBOL II, estes parágrafos, tornaram-se obsoletos, pois um programa
pode ser executado em qualquer máquina.
Formato:
SPECIAL-NAMES.
DECIMAL-POINT IS COMMA.
Esta instrução informa que a vírgula (COMMA) será usada como separador de
decimais.DECIMAL-POINT IS COMMA deve estar na área B.
Formato:
FILE SECTION
A FILE SECTION é usada para detalhar o conteúdo dos registros dos arquivos, utilizando-
se da FILE DESCRIPTION (FD) que descreve as características do arquivo, que possuem alguns
parâmetros importantes e o mapeamento dos campos do registro.
Formato:
Para todo arquivo declarado no INPUT-OUTPUT SECTION, é necessário haver uma descrição e
um layout do mesmo na FILE SECTION.
WORKING-STORAGE SECTION
Formato:
PROCEDURE DIVISION
NÍVEL
Os números de níveis definem a hierarquia dos campos dentro dos registros ou a
hierarquia nas áreas auxiliares criadas pelo programador. O registro também deve ser numerado,
pois ele é um item de grupo, A numeração para itens de grupo é “01”, por definição todos os itens
de grupo serão itens alfanuméricos.
Dentro dos itens de grupo estão os itens elementares, e estes podem receber uma
numeração entre “02 e “49”.
Exemplo:
O nível 77 define áreas auxiliares independentes, onde estes não são subdivididos, são
usados para contadores, acumuladores e indexadores.
O nível 88 define nomes de condições que devem ser associados à valores definidos ao
conteúdo de um determinado campo, pois podemos associar um valor a um nome fantasia.
Nota:
IF WK-ESTADO-CIVIL = 1
DISPLAY „SOLTEIRO‟
END-IF
Ou
IF CASADO
DISPLAY „2‟
END-IF
NOME-DO-DADO (identificador)
Podemos usar qualquer palavra que não seja usada internamente no COBOL (palavra
reservada). Esta palavra pode ter no máximo 30 caracteres, incluindo letras, números e hífen,
sendo que pelo menos um dos caracteres deve ser uma letra.
Exemplo:
77 WK-CAMPO-01-ATUAL
FILLER: Palavra reservada que preenche determinados espaços definidos na Picture, sendo que
não temos acesso ao item elementar, somente quando manipulamos o item de grupo à que ele
esteja subordinado. Eles são usados freqüentemente para não poluirmos o programa fonte com
nomes desnecessários de variáveis.
Exemplo:
01 WK-CAMPO-ATUAL.
03 FILLER
03 WK-CAMPO-01.
FORMATOS DA PICTURE:
1 2 3 4 5 6 7 8
Quando usamos a cláusula de valor inicial (VALUE), no momento que esta variável é carregada
em memória, o dado ficará assim:
0 0 0 0 0 0 0 0
Em uma variável numérica armazenada na memória, não existe o ponto e nem a vírgula decimal.
Se o item VALOR-PROD tiver, por exemplo, o valor de 2,35 fica na memória como 235. Mas o
programa COBOL precisa saber em que posição estava a vírgula que desapareceu (vírgula
implícita). A vírgula implícita é definida no formato pela letra V, como abaixo:
Em um grupo de itens contidos em uma hierarquia (com níveis de 01 a 49) só podem ter a
cláusula PIC, os itens no nível mais baixo da hierarquia (itens elementares).
Exemplo:
A linguagem COBOL suporta itens numéricos com até 18 algarismos, e itens alfanuméricos até
32.768 caracteres (dependendo do sistema operacional).
Existem ainda formatos especiais da PIC para itens a serem exibidos ou impressos, chamados de
mascaras de edição.
A cláusula PICTURE (ou PIC) tem alguns formatos próprios para fazer edição de variáveis
numéricas no momento de uma impressão que são mostrados na tabela abaixo:
Esta cláusula, usada após a máscara de edição da PICTURE, envia espaços em branco para a
impressora quando a variável numérica a ser impressa tem valor zero, independente do formato
da máscara.
Exemplo:
03 VALOR PIC ZZ.ZZ9,99 BLANK WHEN ZERO.
Esta cláusula é opcional em COBOL. Seu objetivo é definir um valor para a variável. Se ela for
omitida, o item correspondente terá valores imprevisíveis. No caso de uma variável numérica, por
exemplo, é conveniente que ele comece com o valor zero. O valor-inicial é definido no COBOL
pelo formato:
As literais numéricas são escritas colocando-se o valor na instrução, sem apóstrofe ou aspas.
Exemplo:
As literais alfanuméricas devem ser colocados entre apostrofes („) ou aspas (“).
Exemplo:
Não se pode misturar em um programa COBOL o uso de apóstrofes com aspas, ou seja, se uma
literal começou a ser escrito com apóstrofe, deve-se usar apóstrofe para terminar a literal.
Pode-se usar ainda como valor-inicial as CONSTANTES FIGURATIVAS, como por exemplo,
ZEROS, SPACES, LOW-VALUES ou HIGH-VALUES.
ZEROS|ZERO|ZEROES – O item (deve ser numérico) será preenchido com algarismos 0 (zero).
SPACE|SPACES – O item (deve ser alfabético ou alfa-numérico) será preenchido com espaços.
LOW-VALUE|LOW-VALUES – (menor valor) Indica que este item na memória deve ter todos os
seus bytes com todos os bits desligados.
HIGH-VALUE|HIGH-VALUES - (maior valor) Indica que este item na memória deve ter todos os
seus bytes com todos os bits ligados.
Exemplo:
77 TOTAL PIC 9(10) VALUE ZEROS.
5 COMANDOS
O comando ACCEPT recebe uma informação de dados, dependendo das cláusulas que
completam o comando, que podem ser: ESTRUTURA DE DADOS, DATA DO SISTEMA, DIAS
DO ANO, DIA DA SEMANA e TEMPO.
Esta opção recebe uma área de dados da SYSIN do JOB de execução do programa, e
NÃO recebe dados digitados na tela, devemos assinalar uma área de entrada no JCL.
É importante lembrar que todo parâmetro SYSIN, passado via JCL, possui uma limitação
de tamanho, que é de 72 bytes.
Para que o programa possa receber estes dados, não basta apenas codificar o comando
ACCEPT, temos que codificar uma variável na WORKING-STORAGE.
Exemplo:
Obs.: Quando a opção FROM SYSIN é omitida o default FROM SYSIN é assumido.
Regras:
SYSIN
Cada vez que o programa COBOL executa a instrução ACCEPT, uma linha da SYSIN do
JCL é carregada na variável. É necessário prever com cuidado quantas linhas terá a SYSIN do
JCL, porque se o comando ACCEPT não encontrar uma linha para carregar na sua variável, o
sistema operacional emitirá uma mensagem de erro para o operador e o programa ficará
suspenso até a intervenção do operador.
DAY-OF-WEEK
5.2 DISPLAY
Exibe o conteúdo de uma variável podendo ser concatenada com uma literal, o conteúdo da
variável será exibido num dispositivo de saída.
Exemplos:
Formato:
STOP RUN.
6 Comandos Aritméticos
ADD(Adição)
SUBTRACT(subtração)
MULTIPLY(multiplicação)
DIVIDE(divisão)
COMPUTE(calcular)
Todas as instruções aritméticas podem ser completadas com as opções
ROUNDED ou ON SIZE ERROR.
Instrução aritmética
[ ROUNDED ]
[ [NOT] ON SIZE ERROR instrução imperativa … ]
[END-{nome-da-instrução}]
Exemplo:
Formato:
ADD { identificador-1 ... constante-1 ...} TO | GIVING
{ identificador-de-resultado ... }
Regras:
1. Todos os campos e constantes que são parte da adição devem ser numéricos. Após a palavra
GIVING, contudo, o campo pode ser um campo editado (campo numérico com mascara de
edição).
4. Ao usar TO, o conteúdo inicial do identificador-de-resultado, que deve ser numérico, é somado
junto ao dos outros campos (identificador-1 ... constante-1...).
Exemplos:
ADD WS-AC-TOTAL1
WS-AC-TOTAL2
WS-AC-TOTAL3 TO WS-AC-TOTGERAL.
SUBTRACT
Formato 1:
Formato 2:
Regras:
3. Com o Formato 2, pode vir qualquer número de operandos imediatamente após a palavra
SUBTRACT ou a palavra GIVING, mas depois da palavra FROM é permitido um único
identificador ou constante.
4. Todas as constantes e campos que são parte da instrução SUBTRACT devem ser
numéricos. Depois da palavra GIVING, contudo, o campo pode ser um campo numérico editado.
5. O campo identificador de resultado1, após FROM ou GIVING, deve ser um nome de variável
e não uma constante.
6. Ao usar o formato GIVING, o campo identificador de resultado1 receberá o resultado da
subtração, mas seu conteúdo inicial não será considerado, ou seja, sobreposto. Ele pode ser tanto
um campo numérico como um campo numérico editado.
Exemplos:
DIVIDE
Formato 1:
DIVIDE {identificador-1|constante-1} INTO
{identificador-2|constante-2}
[ GIVING identificador-de-resultado …]
[ REMAINDER identificador-de-resto ]
Formato 2:
DIVIDE {identificador-1|constante-1} BY
{identificador-2|constante-2}
GIVING identificador-de-resultado ...
[ REMAINDER identificador-de-resto ]
Regras:
1. Observar que GIVING é opcional com INTO, mas obrigatório com BY.
3. No Formato-1, se a opção GIVING não for utilizada, o dividendo terá de ser identificador-
2(não poderá ser usado constante-2).
Exemplos:
DIVIDE WS-NUM BY 2
GIVING WS-RESULT
REMAINDER WS-RESTO
Efetua WS-RESULT = WS-NUM / 2 (resto em WS-RESTO)
MULTIPLY
Formato:
MULTIPLY {identificador-1|constante-1} BY
{identificador-2|constante-2}
[ [GIVING identificador-de-resultado1 ...]
[END-MULTIPLY] ]
Regras:
2. Se a opção GIVING não for utilizada, o resultado irá para identificador-2, e neste caso não
poderá ser usado constante-2.
Exemplos:
COMPUTE
Com a instrução COMPUTE, as operações aritméticas podem ser combinadas em fórmulas sem
as restrições impostas para o campo receptor quando é usado ADD, SUBTRACT, MULTIPLY e
DIVIDE. Quando as operações aritméticas são combinadas, a instrução COMPUTE é mais
eficiente que as instruções aritméticas escritas em série.
Formato:
Regras:
1. A opção ROUNDED e ON SIZE ERROR segue a mesma regra utilizada para expressões
aritméticas.
2. Os símbolos que podem ser utilizados em uma instrução COMPUTE, conforme sua ordem de
prioridade de execução, são:
( ) Parênteses
** Exponenciação
* Multiplicação
/ Divisão
+ Adição
- Subtração
3. O sinal de igual, assim como os símbolos aritméticos, devem ser precedidos e seguidos de um
espaço. Assim, para calcular B+C+D**2 e colocar o resultado em A, use a seguinte instrução:
COMPUTE A = B + C + D ** 2. Na abertura e fechamento de parênteses não é obrigatório o
uso de espaço.
4. A ordem em que são executadas as operações em uma expressão aritmética que contenha
mais de um operador segue a seguinte prioridade:
2 º Exponenciação
3 º Multiplicação, divisão
4 º Adições e Subtrações
Exemplos:
A fórmula A = B² + C²
COMPUTE A = (B ** 2 + C ** 2) ** (0,5).
IDENTIFICATION DIVISION.
PROGRAM-ID. ALUNO01.
DATA DIVISION.
WORKING-STORAGE SECTION.
PROCEDURE DIVISION.
ACCEPT N1 FROM SYSIN.
ACCEPT N2 FROM SYSIN.
ACCEPT N3 FROM SYSIN.
ACCEPT N4 FROM SYSIN.
COMPUTE MEDIA = (N1 + N2 + N3 + N4) / 4.
DISPLAY '------------------'.
DISPLAY 'MEDIA => ' MEDIA.
DISPLAY '------------------'.
STOP RUN.
IF / ELSE / END-IF.
Formato:
IF CONDIÇÃO
instruções (para condição verdadeira)
[ELSE
instruções (para condição falsa)
END–IF]
Regras:
Se o teste da condição foi FALSO será executado o bloco de instruções situado após o ELSE,
até que se encontre um PONTO ou um END-IF. Não havendo ELSE dentro do contexto do
IF(conjunto de instruções terminadas por PONTO ou END-IF), não serão executadas
instruções para o teste de condição FALSO do IF.
PONTO e END-IF indicam o fim da especificação da instrução IF. As instruções que estão
após o PONTO e o END-IF, portanto, são executadas tanto para os casos de condição
VERDADEIRO quanto para os casos de condição FALSO.
CONDIÇÃO
Pode ser uma condição simples ou composta. As tabelas de operadores lógicos e relacionais
abaixo podem ser utilizadas para compor a condição a ser testada.
Descrição Em COBOL
Igual = EQUAL
Os operadores lógicos com exceção do NOT devem ser utilizados em condições compostas.
OPERADOR DESCRIÇÃO
"NÃO": NOT <condição VERDADEIRO> é
Not igual a FALSO e NOT <condição FALSO> é
igual a VERDADEIRO.
"E": Condições associadas com AND
And resultam VERDADEIRO quando todas forem
VERDADEIRO.
"OU": Condições associadas com OR
Or resultam VERDADEIRO bastando apenas
uma delas ser VERDADEIRO.
Exemplos:
Suponha que temos três variáveis A = 5, B = 8 e C =1, os resultados das expressões seriam:
Expressões Resultado
A = B AND B > C Falso
A NOT = B OR B < C Verdadeiro
NOT (A > B) Verdadeiro
A < B AND B > C Verdadeiro
A >=B OR B = C Falso
NOT(A <= B) Falso
A tabela abaixo mostra todos os valores possíveis criados pelos três operadores lógicos (AND, OR
e NOT)
Formato:
CONTINUE | NEXT SENTENCE
7.5 EVALUATE
Pode ser utilizado em substituição de ninhos de IF‟s sobre uma única variável.
Na instrução EVALUATE, a comparação de faixa só pode ser feita com a claúsula THRU, não
podendo ser usados os operadores relacionais (=, <, >).
Formato:
EVALUATE variável
WHEN identificador-1 [THRU identificador-2 …]
Instrução- 1
[WHEN OTHER
Instrução- 2]
END-EVALUATE.
Exemplos:
Usando ninhos de IF‟s sobre uma única variável:
IF SIGLA-UF = „SP‟
DISPLAY 'SÃO PAULO'
ELSE
IF SIGLA-UF = „SC‟
DISPLAY 'SANTA CATARINA'
ELSE
IF SIGLA-UF = „RS‟
DISPLAY 'RIO GRANDE DO SUL'
ELSE
DISPLAY 'OUTRO ESTADO'
END-IF
END-IF
END-IF.
Exemplo:
MOVE ZEROS TO ACUM.
TESTE.
IF ACUM = 10
STOP RUN
ELSE
ADD 1 TO ACUM
DISPLAY ACUM
GO TO TESTE
END-IF.
Programas bem projetados e estruturados são aqueles que possuem uma série de construções
lógicas, em que a ordem na qual as instruções são executadas é padronizada. Em programas
estruturados, cada conjunto de instruções que realiza uma função específica é definido em uma
rotina ou um parágrafo. Ele consiste em uma série de instruções relacionadas entre si e em
programação estruturada, os parágrafos são executados por meio da instrução PERFORM.
8.1 PERFORM
Há 4 Formatos de PERFORM.
1. PERFORM básico
2. PERFORM com opção TIMES
3. PERFORM com opção UNTIL
4. PERFORM com opção VARYING
Formato 1 (básico):
Exemplo:
PERFORM INICIALIZAR.
PERFORM PROCESSAR THRU PROCESSAR-FIM.
O parágrafo referido é executado N TIMES, onde N pode ser uma constante ou variável numérica.
20-00-CALCULA-TOTAL.
MOVE ZEROS TO WS-TOTAL
PERFORM 25-00-CALCULO 3 TIMES.
20-99-EXIT. EXIT.
O parágrafo referido é executado repetidamente até que a condição especificada pela opção
UNTIL seja verdadeira.
00-00-MAIN-LINE.
MOVE “N” TO WS-FIM .
PERFORM 10-00-INICIALIZAR.
PERFORM 20-00-LER-ARQUIVO.
PERFORM 30-00-PROCESSAR UNTIL WS-FIM = “S”.
PERFORM 40-00-FINALIZAR.
00-00-EXIT. EXIT.
Executa o parágrafo especificado, até que a condição especificada seja satisfeita. Antes de
executar o bloco de instruções pela primeira vez, atribui o valor N a variável CAMPO. Após cada
execução do bloco, antes de voltar a executá-lo, incrementa M à variável CAMPO.
9 Lógica Estruturada
Exemplo:
__________________________________________________________
* PROGRAMA - MAIOR E MENOR NUMERO
__________________________________________________________
IDENTIFICATION DIVISION.
PROGRAM-ID. ALUNO01.
AUTHOR. ALUNO.
*
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-NUMERO PIC 9(03) VALUE ZEROS.
01 WS-MAIOR PIC 9(03) VALUE ZEROS.
01 WS-MENOR PIC 9(03) VALUE 999.
*
PROCEDURE DIVISION.
*
PRINCIPAL.
PERFORM INICIO.
PERFORM PROCESSA UNTIL WS-NUMERO EQUAL ZEROS.
PERFORM FINALIZA.
STOP RUN.
*
INICIO.
DISPLAY ' INICIO DO PROCESSAMENTO '.
ACCEPT WS-NUMERO FROM SYSIN.
*
PROCESSA.
DISPLAY 'O NUMERO EH => ' WS-NUMERO.
PERFORM MAIOR-MENOR.
ACCEPT WS-NUMERO FROM SYSIN.
*
MAIOR-MENOR.
IF WS-NUMERO GREATER WS-MAIOR
MOVE WS-NUMERO TO WS-MAIOR
END-IF.
IF WS-NUMERO LESS WS-MENOR
MOVE WS-NUMERO TO WS-MENOR
END-IF.
*
FINALIZA.
DISPLAY ' TERMINO DO PROCESSAMENTO '.
DISPLAY 'O MAIOR NUMERO EH => ' WS-MAIOR.
DISPLAY 'O MENOR NUMERO EH => ' WS-MENOR.
10 Arquivos Seqüenciais
Arquivo é um meio de armazenar informações que foram processadas e que poderão ser
utilizadas novamente. Para isso precisamos relembrar os conceitos aplicados no módulo de lógica.
Vamos rever !!!!
Registro 1
Registro2
Nome
Os arquivos estudados neste modulo são arquivos seqüenciais utilizados para processamento
BATCH. Os arquivos seqüenciais devem estar ordenados por um campo-chave afim de serem
processados.
Regras:
No parágrafo FILE-CONTROL, usado para definir arquivos, usamos uma instrução SELECT para
declarar cada um dos arquivos usados pelo programa.
Formato:
Nome-arquivo-logico.
É o nome do arquivo que será usado dentro do programa, pode ser diferente do nome físico e
pode ter até 30 caracteres.
Nome-arquivo-fisico.
O nome externo pode ter no máximo 8 caracteres e será usado no JOB no tipo de cartão DD, para
associá-lo a um arquivo físico, chamado de DDNAME.
Exemplo:
//DDNAME DD DSN= Nome do Arquivo Físico
No exemplo abaixo mostramos a ENVIRONMENT DIVISION de um programa que irá acessar um
arquivo CLIENTES.
A FILE SECTION é a Section usada para detalhar o arquivo e o conteúdo dos registros dos
arquivos que o programa irá ler/gravar. Vimos anteriormente, na INPUT-OUTPUT SECTION
(ENVIRONMENT DIVISION), que para cada arquivo a ser tratado no programa havia uma
instrução SELECT especificando e definindo um nome lógico para o arquivo. Na FILE SECTION
precisamos agora detalhar cada um destes arquivos. Isto é feito usando a clausula FD (FILE
DESCRIPTION).
FD (FILE DESCRIPTION)
FD nome-do-arquivo.
01 nome-do-registro. ...
[03 nome-de-campo ...]
Exemplo:
12 Fluxograma
1º Exemplo 2º Exemplo
ARQUIVO
DE ARQUIVO
ENTRAD CLIENTE
A
PROGRAMA PROGRAMA
ARQUIVO
DE RELATÓRIO
SAÍDA
ID DIVISION.
PROGRAM-ID. EXEMPLO.
AUTHOR. ALUNO.
*=============================================================
*OBJETIVO: LER UM ARQUIVO SEQUENCIAL E GRAVAR INFORMACOES EM
* UM ARQUIVO DE SAIDA
*=============================================================
ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SPECIAL-NAMES.
DECIMAL-POINT IS COMMA.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT ARQENT ASSIGN TO ARQENT
FILE STATUS IS WS-FS-ARQENT.
*=============================================================
DATA DIVISION.
FILE SECTION.
FD ARQENT
BLOCK CONTAINS 0 RECORDS
RECORD CONTAINS 100 CHARACTERS
LABEL RECORD IS STANDARD
RECORDING MODE IS F.
01 REG-ARQENT.
02 ARQENT-NOME PIC X(20).
02 ARQENT-ENDERECO PIC X(30).
02 ARQENT-TELEFONE PIC X(09).
02 ARQENT-CODIGO PIC 9(06).
02 ARQENT-IDADE PIC 9(03).
02 FILLER PIC X(32).
FD ARQSAI
BLOCK CONTAINS 0 RECORDS
RECORD CONTAINS 150 CHARACTERS
LABEL RECORD IS STANDARD
RECORDING MODE IS F.
01 REG-ARQSAI.
02 ARQSAI-NOME PIC X(20).
02 ARQSAI-ENDERECO PIC X(30).
02 ARQSAI-TELEFONE PIC X(09).
02 ARQSAI-CODIGO PIC 9(06).
02 ARQSAI-IDADE PIC 9(03).
02 FILLER PIC X(82).
*=============================================================
WORKING-STORAGE SECTION.
77 WS-FS-ARQENT PIC 9(02) VALUE ZEROS.
77 WS-FS-ARQSAI PIC 9(02) VALUE ZEROS.
77 WS-CONT-LIDOS PIC 9(05) VALUE ZEROS.
77 WS-CONT-GRAVA PIC 9(05) VALUE ZEROS.
*=============================================================
PROCEDURE DIVISION.
ROT-MESTRE SECTION.
Direitos Autorais – ISP Consultoria
www.escoladeprogramadores.com.br
48
COBOL
STOP RUN.
ROT-MESTRE-FIM.
EXIT.
*=============================================================
* ROTINA DE ABERTURA DOS ARQUIVOS *
*=============================================================
INICIO SECTION.
INICIO-FIM.
EXIT.
*===============================1==============================
* ROTINA DE LEITURA DO ARQUIVO DE ENTRADA *
*=============================================================
LER-ARQENT SECTION.
READ ARQENT.
ADD 1 TO WS-CONT-LIDOS.
LER-FIM.
EXIT.
*=============================================================
* ROTINA DE PROCESSAMENTO *
*=============================================================
PROCESSA SECTION.
INITIALIZE REG-ARQSAI.
MOVE ARQENT-NOME TO ARQSAI-NOME.
MOVE ARQENT-ENDERECO TO ARQSAI-ENDERECO.
MOVE ARQENT-TELEFONE TO ARQSAI-TELEFONE.
MOVE ARQENT-CODIGO TO ARQSAI-CODIGO.
MOVE ARQENT-IDADE TO ARQSAI-IDADE.
PROCESSA-FIM.
EXIT.
*=============================================================
* ROTINA DE GRAVACAO DO ARQUIVO DE SAIDA *
*=============================================================
GRAVA-SAIDA SECTION.
WRITE REG-ARQSAI.
ADD 1 TO WS-CONT-GRAVA.
GRAVA-SAIDA-FIM.
EXIT.
*=============================================================
* ROTINA DE FINALIZACAO E FECHAMENTO DOS ARQUIVOS *
*=============================================================
FINALIZA SECTION.
CLOSE ARQENT.
IF WS-FS-ARQENT NOT EQUAL ZEROS
DISPLAY '======================================='
DISPLAY ' ERRO NO CLOSE DO ARQUIVO ARQENT '
DISPLAY ' FILE STATUS = ' WS-FS-ARQENT
DISPLAY '======================================='
STOP RUN.
CLOSE ARQSAI.
IF WS-FS-ARQSAI NOT EQUAL ZEROS
DISPLAY '======================================='
DISPLAY ' ERRO NO CLOSE DO ARQUIVO ARQSAI '
DISPLAY ' FILE STATUS = ' WS-FS-ARQSAI
DISPLAY '======================================='
STOP RUN.
DISPLAY '================================================='
DISPLAY 'QTDE. REG. LIDOS NO ARQENT = ' WS-CONT-LIDOS
DISPLAY 'QTDE. REG. GRAVADOS NO ARQSAI = ' WS-CONT-GRAVA
DISPLAY '================================================='
FINALIZA-FIM.
EXIT.
13 Abertura de Arquivos
A linguagem COBOL exige que todo arquivo antes do processamento de leitura, seja aberto como
entrada e que todo arquivo, antes da gravação de seus registros, seja aberto como saída.
OPEN
Todo arquivo antes de ser processado deve ser aberto pelo comando OPEN. Este comando abre
o contato com o dispositivo físico do arquivo e reserva, na memória (WORKING-STORAGE
SECTION), áreas necessárias para a troca de dados entre o computador e o dispositivo
externo. Indica quais arquivos serão de entrada e quais serão de saída.
Formato:
Regras:
2. OUTPUT: Permite abrir o arquivo para operações de gravação. Esta operação pode ser
especificada quando o arquivo estiver sendo criado. Esta opção não permite comandos de leitura
no arquivo.
3. NOME-Arquivo1 ... : Nome lógico do(s) arquivo(s) definido(s) na clausula SELECT e na FD:
Exemplo:
*=============================================================
* ROTINA DE ABERTURA DOS ARQUIVOS *
*=============================================================
INICIO SECTION.
14 Movimentação de Campos
MOVE
A instrução MOVE transfere dados de uma área de memória para uma ou mais áreas. Se o campo
receptor dos dados for numérico, ocorrera um alinhamento numérico, caso contrário, ocorrerá um
alinhamento alfanumérico conforme as regras abaixo:
Alinhamento alfabético/alfanumérico
Os dados são acomodados no campo receptor alinhando-se da esquerda para a direita.
Se o campo emissor for maior que o receptor, os BYTES mais a direita, em excesso, serão
truncados no campo receptor. Se o emissor for menor que o receptor, os BYTES faltantes
para preencher o campo receptor serão preenchidos com SPACES.
Alinhamento Numérico
Os dados são acomodados no campo receptor alinhando-se da direita para a esquerda.
Se o campo emissor for maior que o receptor, os BYTES mais a esquerda do campo
emissor serão truncados.
A clausula ALL (opcional) quando usada faz com que o campo emissor seja repetido
várias vezes no campo receptor até preenchê-lo completamente.
ZEROS – O item (deve ser numérico) será preenchido com algarismos 0 (zero).
SPACES – O item (deve ser alfabético ou alfa-numérico) será preenchido com espaços.
LOW-VALUES - indica que este item na memória deve ter todos os seus bytes com todos
os bits desligados. Um item nestas condições terá o menor valor possível em todas as
comparações.
HIGH-VALUES - indica que este item na memória deve ter todos os seus bytes com todos
os bits ligados. Um item nestas condições terá o maior valor possível em todas as comparações.
Formatos:
Regras:
Exemplo:
*=============================================================
* ROTINA DE PROCESSAMENTO *
*=============================================================
PROCESSA SECTION.
INITIALIZE REG-ARQSAI.
MOVE ARQENT-NOME TO ARQSAI-NOME.
MOVE ARQENT-ENDERECO TO ARQSAI-ENDERECO.
MOVE ARQENT-TELEFONE TO ARQSAI-TELEFONE.
MOVE ARQENT-CODIGO TO ARQSAI-CODIGO.
MOVE ARQENT-IDADE TO ARQSAI-IDADE.
15 Gravação de Registros
WRITE
A instrução WRITE grava um registro após o último registro gravado em um arquivo de acesso
seqüencial.
Formatos:
Regras:
1. O arquivo de acesso seqüencial associado à instrução WRITE deve ser aberto no modo
OUTPUT ou EXTEND.
Exemplo:
*=============================================================
* ROTINA DE GRAVACAO DO ARQUIVO DE SAIDA *
*=============================================================
GRAVA-SAIDA SECTION.
WRITE REG-ARQSAI.
ADD 1 TO WS-CONT-GRAVA.
GRAVA-SAIDA-FIM.
EXIT.
16 Fechamentos de Arquivos
CLOSE
Formato:
Exemplos:
*=============================================================
* ROTINA DE FINALIZACAO E FECHAMENTO DOS ARQUIVOS *
*=============================================================
FINALIZA SECTION.
CLOSE ARQENT.
IF WS-FS-ARQENT NOT EQUAL ZEROS
DISPLAY '======================================='
DISPLAY ' ERRO NO CLOSE DO ARQUIVO ARQENT '
DISPLAY ' FILE STATUS = ' WS-FS-ARQENT
DISPLAY '======================================='
STOP RUN.
CLOSE ARQSAI.
IF WS-FS-ARQSAI NOT EQUAL ZEROS
DISPLAY '======================================='
DISPLAY ' ERRO NO CLOSE DO ARQUIVO ARQSAI '
DISPLAY ' FILE STATUS = ' WS-FS-ARQSAI
DISPLAY '======================================='
STOP RUN.
READ
A instrução READ obtém um registro lógico de um arquivo. A cada novo comando READ, o
próximo registro lógico do arquivo será lido. Após cada comando READ, todos os campos
descritos na FD do arquivo estarão preenchidos com os valores do registro lido.
Quando a instrução READ for executada, o arquivo associado deve estar aberto no modo INPUT.
Formato:
READ nome-arquivo
[INTO nome-area-working]
[AT END instrução]
[NOT AT END instrução]
[END-READ].
Regras:
1. INTO: Os campos do registro lido serão movidos da área de leitura do arquivo para uma
área de trabalho.
2. AT END: Se a condição AT END for especificada, e o comando READ não encontrar mais
registros para ler no arquivo (fim do arquivo), a instrução após o AT END será executada. Depois
que um programa executar o AT END, a lógica do programa não deve executar um novo READ.
3. NOT AT END: Enquanto for lido um registro lógico esta condição é verdadeira,podendo
serem incluídos comandos que devem ser executados.
Exemplo:
*=============================================================
* ROTINA DE LEITURA DO ARQUIVO DE ENTRADA *
*=============================================================
LER-ARQENT SECTION.
READ ARQENT.
ADD 1 TO WS-CONT-LIDOS.
INITIALIZE
Se a variável especificada for um item de grupo, todos os seus subitens serão inicializados
de acordo com seu formato: os que forem numéricos, serão inicializados com zero
(respeitando-se seu formato : zonado, compactado ou binário); se a variável for alfa-
numérica ou alfabética, ela será inicializada com espaços.
Formato:
Exemplos:
*=============================================================
* ROTINA DE PROCESSAMENTO *
*=============================================================
PROCESSA SECTION.
INITIALIZE REG-ARQSAI.
MOVE ARQENT-NOME TO ARQSAI-NOME.
MOVE ARQENT-ENDERECO TO ARQSAI-ENDERECO.
MOVE ARQENT-TELEFONE TO ARQSAI-TELEFONE.
MOVE ARQENT-CODIGO TO ARQSAI-CODIGO.
MOVE ARQENT-IDADE TO ARQSAI-IDADE.
19 Encerramento de Parágrafos
EXIT
A instrução EXIT provê um ponto de encerramento comum para uma serie de parágrafos. A
instrução EXIT não tem efeito na compilação nem na execução do programa. É, portanto, usado
com a finalidade de documentar o programa.
A instrução EXIT deve ser única dentro do seu parágrafo.
Formato:
EXIT.
Exemplo:
ROT-MESTRE SECTION.
PERFORM INICIO THRU INICIO-FIM.
PERFORM PROCESSA THRU PROCESSA-FIM UNTIL
WS-FS-ARQENT = 10.
PERFORM FINALIZA THRU FINALIZA-FIM.
STOP RUN.
ROT-MESTRE-FIM.
EXIT.
20 Relatórios
Características do formulário
Controle de linhas, numeração e salto de página
Impressão de cabeçalho e estética da página
Características do Formulário
A maioria dos formulários possui um formato padrão, isto é, a quantidade de linhas por página e
de caracteres por linha são constantes.
Exemplo:
ID DIVISION.
*----------------------------------------------------------------*
PROGRAM-ID. EXEMPLO2.
AUTHOR. ALUNO.
*----------------------------------------------------------------*
ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SPECIAL-NAMES.
DECIMAL-POINT IS COMMA.
*----------------------------------------------------------------*
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT PECAS ASSIGN TO ENTRADA.
SELECT RELATORIO ASSIGN TO RELATO.
*----------------------------------------------------------------*
DATA DIVISION.
*----------------------------------------------------------------*
FILE SECTION.
*----------------------------------------------------------------*
FD PECAS
RECORDING MODE F.
01 REG-PECAS.
02 CODIGO PIC 9(005).
02 NOME PIC X(020).
02 DESCRICAO PIC X(020).
02 PRECO PIC 9(007)V99.
02 ESTOQUE PIC 9(007).
*----------------------------------------------------------------*
FD RELATORIO
RECORDING MODE F.
01 REG-RELATO PIC X(132).
Direitos Autorais – ISP Consultoria
www.escoladeprogramadores.com.br
60
COBOL
*----------------------------------------------------------------*
WORKING-STORAGE SECTION.
*----------------------------------------------------------------*
77 WS-FIM PIC X VALUE SPACES.
01 ACUMULADORES.
02 NPAG-WS PIC 9(02) VALUE ZEROS.
02 NLINHAS-WS PIC 9(02) VALUE ZEROS.
02 NITENS-WS PIC 9(03) VALUE ZEROS.
02 NVALOR-WS PIC 9(7)V99 VALUE ZEROS.
*----------------------------------------------------------------*
01 LIN1.
02 FILLER PIC X(5) VALUE SPACES.
02 DATA-LIN1.
03 DIA PIC 9(02) VALUE ZEROS.
03 FILLER PIC X VALUE "/".
03 MES PIC 9(02) VALUE ZEROS.
03 FILLER PIC X VALUE "/".
03 ANO PIC 9(02) VALUE ZEROS.
02 FILLER PIC X(20) VALUE SPACES.
02 FILLER PIC X(18) VALUE
"RELATORIO DE PECAS".
02 FILLER PIC X(20) VALUE SPACES.
02 FILLER PIC X(5) VALUE "PAG. ".
02 NPAG-LIN1 PIC Z9 VALUE SPACES.
*----------------------------------------------------------------*
01 LIN2.
02 FILLER PIC X(33) VALUE
" CODIGO NOME ".
02 FILLER PIC X(22) VALUE
" DESCRICAO".
02 FILLER PIC X(02) VALUE SPACES.
02 FILLER PIC X(13) VALUE
" PRECO ".
02 FILLER PIC X(9) VALUE
" ESTOQUE".
*----------------------------------------------------------------*
01 DETALHE.
02 FILLER PIC X(5) VALUE SPACES.
02 CODIGO-DET PIC ZZ.ZZ9 VALUE SPACES.
02 FILLER PIC X(2) VALUE SPACES.
02 NOME-DET PIC X(20) VALUE SPACES.
02 FILLER PIC X(2) VALUE SPACES.
02 DESC-DET PIC X(20) VALUE SPACES.
02 FILLER PIC X(2) VALUE SPACES.
02 PRECO-DET PIC ZZ.ZZZ.ZZ9,99
VALUE SPACES.
02 FILLER PIC X(2) VALUE SPACES.
02 EST-DET PIC Z.ZZZ.99
VALUE SPACES.
*----------------------------------------------------------------*
01 LINTOT1.
02 FILLER PIC X(21) VALUE
" TOTAL DE ITENS: ".
02 TOTALITENS PIC Z99 VALUE SPACES.
*----------------------------------------------------------------*
01 LINTOT2.
02 FILLER PIC X(22) VALUE
" VALOR DOS ITENS: ".
02 TOTALVALOR PIC $ZZ.ZZ9,99 VALUE SPACES.
*----------------------------------------------------------------*
Direitos Autorais – ISP Consultoria
www.escoladeprogramadores.com.br
61
COBOL
01 DATA-ACCEPT.
02 ANO PIC 9(02) VALUE ZEROS.
02 MES PIC 9(02) VALUE ZEROS.
02 DIA PIC 9(02) VALUE ZEROS.
*----------------------------------------------------------------*
PROCEDURE DIVISION.
*----------------------------------------------------------------*
PRINCIPAL.
*----------------------------------------------------------------*
PERFORM INICIAR.
PERFORM PROCESSAR UNTIL WS-FIM = "S".
PERFORM FINALIZAR.
STOP RUN.
FIM-ROTINA-PRINCIPAL.
*----------------------------------------------------------------*
INICIAR.
*----------------------------------------------------------------*
MOVE "N" TO WS-FIM.
MOVE ZEROS TO ACUMULADORES.
MOVE 99 TO NLINHAS-WS.
*
OPEN INPUT PECAS.
OPEN OUTPUT RELATORIO.
*
ACCEPT DATA-ACCEPT FROM DATE.
MOVE CORR DATA-ACCEPT TO DATA-LIN1.
READ PECAS
AT END
MOVE "S" TO WS-FIM
END-READ.
FIM-INICIAR.
EXIT.
*----------------------------------------------------------------*
PROCESSAR.
*----------------------------------------------------------------*
MOVE CODIGO TO CODIGO-DET.
MOVE NOME TO NOME-DET.
MOVE DESCRICAO TO DESC-DET.
MOVE PRECO TO PRECO-DET.
MOVE ESTOQUE TO EST-DET.
*
IF NLINHAS-WS > 35
PERFORM CABECALHO.
WRITE REG-RELATO FROM DETALHE.
ADD 1 TO NLINHAS-WS.
ADD 1 TO NITENS-WS.
ADD PRECO TO NVALOR-WS.
READ PECAS
AT END
MOVE "S" TO WS-FIM
END-READ.
FIM-PROCESSAR.
EXIT.
*----------------------------------------------------------------*
FINALIZAR.
*----------------------------------------------------------------*
MOVE NVALOR-WS TO TOTALVALOR.
MOVE NITENS-WS TO TOTALITENS.
WRITE REG-RELATO FROM LINTOT1 AFTER 2 LINES.
WRITE REG-RELATO FROM LINTOT2 AFTER 2 LINES.
CLOSE PECAS RELATORIO.
FIM-FINALIZAR.
EXIT.
*----------------------------------------------------------------*
CABECALHO.
*----------------------------------------------------------------*
ADD 1 TO NPAG-WS.
MOVE NPAG-WS TO NPAG-LIN1.
WRITE REG-RELATO FROM LIN1 AFTER PAGE.
WRITE REG-RELATO FROM LIN2 AFTER 2 LINES.
MOVE 5 TO NLINHAS-WS.
FIM-CABECALHO.
EXIT.
O Cobol trata a impressão de relatórios de maneira similar à gravação de arquivos, ou seja, enviar
uma linha de relatório para a impressora é idêntico a gravar um registro em um arquivo. Por isso
precisamos definir o relatório na INPUT-OUTPUT SECTION (ENVIRONMENT DIVISION) com a
instrução SELECT, precisamos definir o conteúdo das linhas de impressão na FILE SECTION
(DATA DIVISION) com a instrução FD, e na PROCEDURE DIVISION devemos usar as instruções
OPEN, WRITE e CLOSE para controlar a impressão. No entanto, obviamente existem diferenças
entre um arquivo e um relatório, e os seguintes detalhes devem ser observados em um
programa:
Diferentemente dos arquivos, onde todos os registros podem ter o mesmo layout, em um
relatório as linhas de detalhe podem ser diferentes (incluindo sub-totais, títulos de grupos etc.).
Além disso, sempre existe um cabeçalho em cada folha ou ainda linhas de rodapé.
O programa precisa controlar a mudança de página. Para isto o programa deve criar uma
variável para contar linhas, que deve ser incrementada a cada comando WRITE do relatório.
Quando esta variável atinge o numero de linhas disponíveis na folha, o programa deve comandar
o salto para a nova folha e imprimir as linhas de cabeçalho.
É comum haver totalizações em vários níveis (subtotais, totais gerais etc.). Estes totais são
emitidos quando muda a identificação de grupo dentro dos registros lidos. Por exemplo, em um
relatório de vendas com totais por mês, o programa deve comparar o mês do registro lido com o
mês do registro anterior para verificar se são diferentes. Nestas mudanças de identificador de
grupo (geralmente conhecido como QUEBRA), o programa deve emitir uma linha de total.
Formato:
Regra:
1. BEFORE: Quando a opção BEFORE for utilizada o Cobol interpreta o comando da seguinte
forma: GRAVAR nome-registro-1 ANTES DE SALTAR N LINHAS ou PAGINA.
2. AFTER: Quando a opção AFTER for utilizada o Cobol interpreta o comando da seguinte
forma: GRAVAR nome-registro-1 DEPOIS DE SALTAR N LINHAS ou PÁGINA.
3. FROM: A opção FROM pode ser utilizada para transferir as linhas do relatório a serem
impressas (definidas na Working-Storage Section), após serem preparadas, para o registro do
arquivo de impressão.
Exemplo:
*----------------------------------------------------------------*
CABECALHO.
*----------------------------------------------------------------*
ADD 1 TO NPAG-WS.
MOVE NPAG-WS TO NPAG-LIN1.
WRITE REG-RELATO FROM LIN1 AFTER PAGE.
WRITE REG-RELATO FROM LIN2 AFTER 2 LINES.
MOVE 5 TO NLINHAS-WS.
FIM-CABECALHO.
EXIT.
Exemplo:
Arquivo de lançamentos para contas correntes, onde uma conta pode ter vários lançamentos.
Pode ser necessário um relatório que totalize por conta.
IF NLINHAS-WS > 35
PERFORM CABECALHO.
WRITE REG-RELATO FROM DETALHE.
ADD 1 TO NLINHAS-WS.
ADD 1 TO NITENS-WS.
ADD PRECO TO NVALOR-WS.
21 Lógica Balanceada
Trata-se do processamento sincronizado de dois ou mais arquivos ordenados pela mesma chave.
Exemplo: arquivo de contas correntes e movimentos, ambos com a chave: CONTA. A lógica
balanceada irá gravar um novo arquivo de contas correntes com os saldos atualizados pelos
valores dos lançamentos das respectivas contas. Com a lógica balanceada, este processamento
será efetuado com apenas uma leitura de cada arquivo, verificando as condições de igual, maior
ou menor, para cada registro lido.
A lógica balanceada também é conhecida como BALANCE LINE ou MERGE.
Exemplo:
IDENTIFICATION DIVISION.
PROGRAM-ID. EXEMPLO3.
AUTHOR. ALUNO.
*OBJETIVO: BALANCE LINE ENTRE O ARQUIVO CCANT E MOV.
*===============================================================
ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SPECIAL-NAMES.
DECIMAL-POINT IS COMMA.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT CCANT ASSIGN TO CCANT
FILE STATUS IS WS-FS-CCANT.
01 REG-CCANT.
03 CCANT-CONTA PIC X(3).
03 CCANT-NOME PIC X(20).
03 CCANT-SALDO PIC S9(5)V9(2).
FD MOV
BLOCK CONTAINS 0 RECORDS
RECORD CONTAINS 10 CHARACTERS
LABEL RECORD IS STANDARD
RECORDING MODE IS F.
01 REG-MOV.
03 MOV-CONTA PIC X(3).
03 MOV-SALDO PIC S9(5)V9(2).
FD ATUA
BLOCK CONTAINS 0 RECORDS
RECORD CONTAINS 30 CHARACTERS
01 REG-ATUA.
03 ATUA-CONTA PIC X(3).
03 ATUA-NOME PIC X(20).
03 ATUA-SALDO PIC S9(5)V9(2).
WORKING-STORAGE SECTION.
PROCEDURE DIVISION.
PRINCIPAL SECTION.
PERFORM INICIO.
PERFORM PROCESSA UNTIL HIGH-VALUES = CCANT-CONTA
AND MOV-CONTA.
PERFORM FIM.
STOP RUN.
INICIO SECTION.
PERFORM LER-CCANT.
PERFORM LER-MOV.
PROCESSA SECTION.
IF CCANT-CONTA = MOV-CONTA
ADD MOV-SALDO TO CCANT-SALDO
PERFORM LER-MOV
ELSE
IF CCANT-CONTA < MOV-CONTA
MOVE REG-CCANT TO REG-ATUA
WRITE REG-ATUA
PERFORM LER-CCANT
ELSE
PERFORM LER-MOV
END-IF
END-IF.
FIM SECTION.
LER-CCANT SECTION.
READ CCANT.
LER-MOV SECTION.
READ MOV.
TABELAS – OCCURS
Alguns algoritmos mais avançados exigem a definição de uma mesma variável várias vezes,
aumentando o trabalho de codificação do programa correspondente tanto na DATA DIVISION,
como também as instruções resultantes na PROCEDURE DIVISION. Por exemplo, em um
algoritmo para acumular as vendas do ano separadas por mês, precisamos definir 12 campos de
total na DATA DIVISION, e a PROCEDURE DIVISION deverá ter 12 testes do mês da venda para
decidir em que total deve ser feito a soma.
Exemplo:
DATA DIVISION.
03 TOTAL-01 PIC 9(8)V99.
03 TOTAL-02 PIC 9(8)V99.
...
03 TOTAL-12 PIC 9(8)V99.
PROCEDURE DIVISION.
…
IF MES = 01
ADD VENDAS TO TOTAL-01
ELSE
IF MES = 02
ADD VENDAS TO TOTAL-02
ELSE
...
IF MES = 12
ADD VENDAS TO TOTAL-12
A linguagem COBOL possui um recurso para resolver este problema. Na DATA DIVISION a
variável será definida somente uma vez, acompanhada da cláusula OCCURS que definirá quantas
vezes a variável deve ser repetida. A sintaxe da definição do item com OCCURS é:
Formato:
NÍVEL identificador-1 PIC 9,X OU A OCCURS n [TIMES].
Regras:
1. A cláusula OCCURS só pode ser usada em variáveis de nível 02 a 49.
2. Quando uma variável de uma tabela (definida com OCCURS) for usada na PROCEDURE
DIVISION, ela precisa ser acompanhada de um indexador (subscrito) que definirá qual
ocorrência da tabela está sendo referida. Este subscrito deve estar dentro de parênteses e
pode ser um literal numérico ou uma variável numérica com valores inteiros. Por ex: ADD
VENDAS TO TOTAL-MENSAL(5). Neste caso a soma esta sendo feita na quinta ocorrência
de total-mensal.
Exemplo:
A codificação do algoritmo do exemplo acima ficará reduzida agora a:
DATA DIVISION.
01 TOTAIS-GERAIS.
03 TOTAL-MENSAL PIC 9(8)V99 OCCURS 12 TIMES.
...
PROCEDURE DIVISION.
...
ADD VENDAS TO TOTAL-MENSAL (MES-VENDA).
Em COBOL podemos definir um item de uma tabela como uma nova tabela, e assim
sucessivamente até um nível de 3 tabelas. Por exemplo, para obter o total de vendas separado
por estado, e em cada estado por tipo de produto, e para cada produto por mês de venda,
montaremos a DATA DIVISION como abaixo:
DATA DIVISION.
01 TOTAIS-VENDA.
03 VENDAS-ESTADO OCCURS 27 TIMES.
05 VENDAS-PRODUTO OCCURS 5 TIMES.
07 VENDAS-MÊS PIC 9(8)V99 OCCURS 12 TIMES.
Este código montará na memória uma tabela com 3 níveis de 1620 totais (27 estados X 5 produtos
X 12 meses). Para acessar um total desta tabela será necessário um conjunto de 3 indexadores:
PROCEDURE DIVISION.
....
ADD VENDAS TO
VENDAS-MÊS (CD-ESTADO, CD-PRODUTO, MÊS-VENDA).
Importante:
Os indexadores dentro dos parênteses devem estar na mesma seqüência da definição das
tabelas (mesma hierarquia).
23 Chamando um Sub-Programa
O comando CALL é usado para incorporar ao programa principal (LINK) um sub-programa. A sua
principal função é a redundância de códigos em vários programas, podendo assim, vários
programas usarem a mesma sub-rotina (sub-programa), não necessitando reescrever os códigos
a cada novo programa.
Formatos:
Chamada estática:
Chamada Dinâmica:
Parâmetros:
USING : Indica a área que servirá de comunicação entre o programa principal e o sub-programa,
definida na WORKING-STORAGE SECTION.
Procedimentos no Sub-Programa:
Esta instrução é usada para sub-programas (programas chamados por CALL num programa
principal) para devolver o controle (retornar) ao programa principal, logo após a instrução CALL.
Parâmetros:
USING: Indica a área que servirá de comunicação entre o sub-programa e o principal, será
definida na LINKAGE SECTION e referenciada na PROCEDURE DIVISION, note que a área tem
que ter o mesmo formato, podendo ter nomes diferentes.
25 FILE STATUS
Campo com o código de retorno dos comandos executados sobre o arquivo. Devem ter formato
PIC XX e os valores retornados estão na tabela abaixo:
STATUS DESCRIÇÃO
'00' 'SUCCESSFUL COMPLETION'
'02' 'DUPLICATE KEY, NON UNIQ. ALT INDX'
'04' 'READ, WRONG LENGTH RECORD'
'05' 'OPEN, FILE NOT PRESENT'
'CLOSE OPTION INCOMPAT FILE DEVICE OPEN IMPLIES TAPE; TAPE NOT
'07'
USED'
'10' 'END OF FILE'
'14' 'RRN > RELATIVE KEY DATA'
'20' 'INVALID KEY VSAM KSDS OR RRDS'
'21' 'SEQUENCE ERROR, ON WRITE OR CHANGING KEY ON REWRITE'
'22' 'DUPLICATE KEY'
'23' 'RECORD OR FILE NOT FOUND'
'BOUNDARY VIOLATION. WRITE PAST END OF KSDS RECORD. COBOL 370:
'24'
REL: REC# TOO BIG. OUT OF SPACE ON KSDS/RRDS FILE'
'30' 'PERMANENT DATA ERROR. DATA CHECK, PARITY CHK, HARDW'
'BOUNDARY VIOLATION. WRITE PAST END OF ESDS RECORD OR NO SPACE
'34'
TO ADD KSDS/RRDS RECORD. OUT OF SPACE ON SEQUENTIAL FILE'
'35' '35' 'OPEN, FILE NOT PRESENT'
'37' 'OPEN MODE INCOMPAT WITH DEVICE'
'38' 'OPENING FILE CLOSED WITH LOCK'
'39' 'OPEN, FILE ATTRIB CONFLICTING'
'41' 'OPEN, FILE IS OPEN'
'42' 'CLOSE, FILE IS CLOSED'
'43' 'DELETE OR REWRITE & NO GOOD READ FIRST'
'44' 'BOUNDARY VIOLATION/REWRITE REC TOO BIG'
'46' 'SEQUENTIAL READ WITHOUT POSITIONING'
'47' 'READING FILE NOT OPEN AS INPUT/IO/EXTEND'
'48' 'WRITE WITHOUT OPEN IO'
'49' 'DELETE OR REWRITE WITHOUT OPEN IO'
'90' 'UNKNOWN'
'91' 'VSAM - PASSWORD FAILURE'
'LOGIC ERROR/OPENING AN OPEN FILE OR READING OUTPUT FILE OR
'92'
WRITE INPUT FILE OR DEL/REW BUT NO PRIOR READ '
'93' 'VSAM - VIRTSTOR. RESOURCE NOT AVAILABLE'
FORMAÇÃO MAINFRAME
MÓDULO : DB2
WWW.ESCOLADEPROGRAMADORES.COM.BR
DB2
1 – INTRODUÇÃO.
O DB2 é um banco de dados relacional usado exclusivamente na plataforma alta (IBM).
Os primeiros bancos de dados adotados no Mainframe eram bancos de dados estruturados, onde o
layout de seus registros eram fixos, e todos os programas precisavam declará-los explicitamente.
Quaisquer alteração nestes layout requeriam a recodificação de todos os programas envolvidos com
o banco de dados.
Os bancos de dados relacionais se caracterizam por ter layout flexível, independente dos programas,
além do potencial criado pela linguagem SQL de formular pesquisas nas mais diversas situações, a
qualquer momento.
ÍNDICE TABELA
VIEW
Banco de Dados É formado por um conjunto de TABELAS. O layout das tabelas é mantido
pelo próprio Banco de Dados. Cada TABELA é formada por um conjunto de
COLUNAS. O nome e formato das COLUNAS são mantidos pelo Banco de
Dados.
Pesquisa (Query) Para se efetuar uma pesquisa nas TABELAS especifica-se uma TABELA
RESULTADO (Result Table). O DB2 pesquisa o conteúdo de suas TABELAS
e monta a Result Table conforme a especificação da pesquisa.
1.2.1 – TABELAS.
São estruturas lógicas mantidas pelo DB2 para representar uma entidade.
1.2.2 – COLUNAS.
1.2.3 – LINHA
Tabela Funcionários
Colunas
Chave Chave
Primária Estrangeira
Z13 Reserva
A00 Vendas
O DB2 possui algumas regras de validação de seus dados que são definidos no momento da
definição de suas tabelas. Estas validações independem dos programas que atualizam o banco de
dados, e são executadas automaticamente quando se incluem alteram ou excluem dados das
tabelas. As regras de integridade são:
UNICIDADE
Esta regra define que uma ou varias colunas (KEYS), da tabela não podem repetir valores. É a regra
usada para definir UNIQUE KEYS.
INTEGRIDADE REFERENCIAL
A INTEGRIDADE REFERENCIAL define a validade de uma FOREIGN KEY:
Se uma FOREIGN KEY não contém NULL, seu valor deve ser o da PARENT KEY da
TABELA MESTRE.
A INTEGRIDADE REFERENCIAL deve ser definida na criação da tabela.
O DB2 testa a INTEGRIDADE REFERENCIAL nos comandos de inclusão, alteração e
exclusão dos programas conforme abaixo:
INTEGRIDADE NA INCLUSÃO.
Se uma linha tiver uma coluna FOREIGN KEY com valor NOT NULL, deve haver uma linha na
PARENT TABLE com este valor.na PARENT KEY.
INTEGRIDADE NA ALTERAÇÃO.
Se houver alteração em uma FOREIGN KEY, deve haver na PARENT TABLE uma PARENT KEY
com o novo valor da FOREIGN KEY.
INTEGRIDADE NA EXCLUSÃO.
A exclusão de linhas com FOREIGN KEY não tem restrição. Se uma linha tiver uma coluna com
PARENT KEY, uma das 3 regras de exclusão abaixo deve ser definida na criação da tabela:
RESTRICT – A exclusão não será efetuada se houver uma TABELA DEPENDENTE
com uma FOREIGN KEY com este valor.
CASCADE – O DB2 fará a exclusão automática de todas as linhas das TABELAS
DEPENDENTES com este valor na FOREIGN KEY. Se estas exclusões tiverem
sucesso, a linha da PARENT TABLE será excluída.
SET NULL – As FOREIGN KEY nas TABELAS DEPENDENTES serão alteradas para
NULL.
STRING
NUMERIC
DATETIME
ROWID
Nome-da-coluna CHAR(tamanho)
Exemplo:
CODCLI CHAR(6)
VARCHAR - Define colunas de caracteres com tamanho variável. Podem conter até 32704
caracteres, mas tamanhos acima de 255 tem restrições em alguns comandos SQL.
Sintaxe:
Nome-da-coluna VARCHAR(tamanho-maximo)
Exemplo:
NOMECLI VARCHAR(50)
CLOB - Este tipo (Character Large Object) é usado para armazenar grande volume de texto.
Tem tamanho variável até 2147647 (2GB) bytes. Sintaxe
Nome-da-coluna CLOB(tamanho-maximo)
BLOB - Este tipo (Binary Large Object) é usado para armazenar imagens, ou dados em
formato binário em geral. Seu tamanho é variável até 2147483647 (2GB) bytes.
Nome-da-coluna BLOB(tamanho-maximo)
INTEGER - Define colunas para conter números inteiros usando 31 bits mais sinal. Uma coluna
INTEGER pode conter valores na faixa de –2147483648 até +2147483647. Sintaxe
para definir uma coluna INTEGER:
Nome-da-coluna INTEGER
Exemplo:
Direitos Autorais – ISP Consultoria
www.escoladeprogramadores.com.br
5
DB2
QUANTIDADE INTEGER
SMALLINT - Define colunas para conter números inteiros usando 15 bits mais sinal. Uma coluna
SMALLINT pode conter valores na faixa de –32768 até +32767. Sintaxe:
Nome-da-coluna SMALLINT
Exemplo:
IDADE SMALLINT
DECIMAL - O tipo DECIMAL define colunas com números reais (contendo parte inteira e
decimais). O DB2 aceita coluna DECIMAL com até 31 algarismos. O formato para
definir este tipo é:
PRECO DECIMAL(8,2)
REAL - O tipo REAL define colunas com números no formato PONTO FLUTUANTE. O DB2
usa 32 bits para este formato, e consegue controlar valores na faixa de –7.2E+75 até
7.2E75. Sintaxe:
Nome-da-coluna REAL
DOUBLE - O tipo DOUBLE define colunas com números no formato PONTO FLUTUANTE. O
DB2 usa 64 bits para este formato, e consegue controlar valores na faixa de –
7.2E+75 até 7.2E75 com precisão maior que o tipo REAL. Sintaxe:
Nome-da-coluna DOUBLE
Os formatos DATETIME definem formatos para armazenar datas e hora. Os valores no formato
DATETIME podem fazer parte de expressões aritméticas, isto é, podem-se somar duas variáveis com
formato DATETIME.
DATE - O tipo DATE define uma coluna com datas. O formato interno é um formato binário
próprio do DB2, mas o conteúdo da coluna conterá DIA, MES e ANO de uma data. O
formato lido por um programa (Ex.:DDMMAAAA) é função do comando utilizado para
ler a coluna.
Sintaxe para definir uma coluna DATE:
Nome-da-coluna DATE
Exemplo:
DATA-NASCIMENTO DATE
TIME - O tipo TIME define uma coluna com a hora do dia. O formato interno é um formato
binário próprio do DB2, mas o conteúdo da coluna conterá HORA, MINUTO e SEGUNDOS. O
formato lido por um programa (Ex.:HHMMSS) é função do comando utilizado para ler a
coluna.
Sintaxe para definir uma coluna TIME:
Nome-da-coluna TIME
Exemplo:
HORA-PARTIDA TIME
TIMESTAMP - O tipo TIMESTAMP define uma coluna com a data e hora do dia com precisão até
microssegundos. O formato interno é um formato binário próprio do DB2, mas a
coluna conterá DIA, MES, ANO, HORA, MINUTO, SEGUNDOS e
MICROSSEGUNDOS. O formato lido por um programa é função do comando
utilizado para ler a coluna.
Sintaxe para definir uma coluna TIMESTAMP:
Nome-da-coluna TIMESTAMP
Exemplo:
DATA-CRIACAO TIMESTAMP
1.2.5.4 FORMATO ROWID - O formato ROWID define uma coluna onde o DB2 gerará uma
identificação única da linha que está sendo inserida na tabela
(UNIQUE KEY). Pode ser usada em tabelas que não possuem
UNIQUE KEY. Sintaxe para sua definição:
Nome-da-coluna ROWID
Exemplo:
ID-MENSAGEM ROWID
1.2.6 CONSTANTES.
Ex.: ´JOSE´
As constantes numéricas são escritas sem as aspas. As constantes com decimais devem usar o
ponto para separar as decimais.
Ex.: 14.55
As constantes de DATA e HORA devem ser escritas no formato do exemplo abaixo:
14/02/2005
16:35
SPECIAL REGISTERS são variáveis internas do DB2 com informações do ambiente que os
programas podem acessar e usar. A lista é extensa, e apresentamos abaixo uma relação das mais
usadas:
2 - LINGUAGEM SQL.
O SQL é a linguagem usada para acessar quase todos os bancos de dados relacionais atuais. No
caso do DB2, os comandos SQL podem ser incluídos nos programas escritos em Cobol, Assembler,
C, C++, PL/I, PROLOG, JAVA e outras.
Os comandos SQL podem ser incluídos nos programas em um dos modos abaixo:
STATIC SQL – Neste modo os comandos SQL são codificados dentro do programa fonte. Os
comandos são pré-compilados e portanto são fixos no programa.
DYNAMIC SQL – Neste modo os comandos são informados ao programa em tempo de
execução. O comando é passado em forma de texto para o DB2, para ser resolvido e executado.
ODBC – Neste caso os comandos são passados pelo programa para um utilitário chamado DB2
OPEN DATABASE CONNECTIVITY(ODBC). Este utilitário é o encarregado de interpretar o comando
e executá-lo junto ao DB2. A ODBC só pode ser usada em programas C.
JDBC – É a ODBC para programas em JAVA. A linguagem JAVA tem também o componente
SQLJ que é voltado para tratamento de SQL ESTATICOS.
Os comandos SQL podem ser submetidos para o DB2 pelos seguintes produtos:
PROGRAMAS.
Os comandos SQL podem ser codificados dentro de programas escritos em várias
linguagens, incluindo o Cobol.
DML
Data Manipulation Language, utilizado para fazer pesquisas e atualizações nas tabelas
DB2.
DDL
Data Definition Language, utilizado para definir, alterar e eliminar objetos DB2.
CONTROL
Utilizado para administrar a segurança dos recursos DB2.
STRUCTURED
QUERY
LANGUAGE
Os comandos SQL para criar e alterar tabelas não são usados em programação de aplicativos.
Informamos abaixo sua sintaxe somente para completar os conhecimentos sobre a linguagem SQL.
O comando SQL para criar uma nova TABLE é o CREATE TABLE. Podem ser criadas tabelas com
até 750 colunas e 16 terabytes de tamanho total. O comando define o nome da tabela seguido de
uma serie de especificações de colunas como no exemplo:
Neste exemplo o argumento UNIQUE que aparece em CODIGO indica que o valor desta coluna não
pode se repetir nas linhas da tabela.
O argumento NOT NULL da coluna PRECO indica que nas inclusões de novas linhas na tabela
(inclusão de novos produtos no cadastro), o PRECO deve sempre ser informado.
O argumento DEFAULT da coluna DATAFABR indica que nas inclusões de produtos, se a coluna
DATAFABR não for informada, o DB2 preencherá esta coluna com o valor “default” para datas, que é
a data corrente do sistema operacional. O argumento DEFAULT para colunas com tipo alfanumérico
preenche o campo com espaços, e quando o tipo for numérico a coluna será preenchida com zeros.
Outro exemplo:
Neste exemplo a tabela DEPTO esta sendo criada com a chave primaria CODDEPTO.
O comando CREATE pode ser usado também para criar índices para colunas definidas como
UNIQUE ou PRIMARY KEY. Os índices aumentam a performance das pesquisas que usam esta
coluna. Exemplo:
Os comandos SQL que acessam e atualizam as tabelas serão os comandos que utilizaremos nos
programas aplicativos.
São 4 os comandos SQL usados neste grupo:
SELECT
INSERT
UPDATE
DELETE
2.2.4.1 - SELECT.
O objetivo do comando SELECT é pesquisar dados dentro do DB2. Ele especifica o formato de uma
tabela para conter o resultado da pesquisa e outros parâmetros para definir o processo de pesquisa.
O formato básico do SELECT é
SELECT colunas-ou-valores
FROM tabela, tabela
WHERE condição
Exemplo:
SELECT CODFUNC NOMEFUNC SALARIO
FROM EMPREGADOS
WHERE SALARIO > 1000
Neste exemplo a tabela resultado conterá uma relação com o código, nome e salário dos funcionários
da tabela EMPREGADOS, para os empregados que ganham mais de 1000,00.
SELECT *
FROM EMPREGADOS
Operador Descrição
= != <> Igual Não igual Diferente
> !> >= Maior Não maior Maior ou igual
< !< <= Menor Não menor Menor ou igual
BETWEEN O valor deve estar entre os dois limites
Ex.: IDADE BETWEEN 1 AND 9
IN O valor deve ser um dos fornecidos na lista
Ex.: IDADE IN (1, 3, 5, 7, 9)
LIKE O valor deve ser semelhante ao indicado. No literal indicado pode-se usar % para
representar um conjunto de caracteres, ou _ para representar a posição de um
caracter.
Ex.: NOME LIKE „ALBERTO‟
NOME LIKE „AL%‟ Nomes iniciando com AL
NOME LIKE „%O‟ Nomes Terminando com O
NOME LIKE „%L%‟ Nomes que contenham L
NOME LIKE „___E%‟ Nome com E na posição 4.
O operador NOT pode ser usado junto com quarquer dos operadores acima.
Exemplo:
IDADE NOT IN (1,3,5,7)
Exercícios.
SELECT NOME
FROM FUNCIONARIOS
WHERE NOME LIKE
„MARIA%‟
Com esta sintaxe a tabela resultado será ordenada pelas colunas especificadas no argumento
ORDER BY. O argumento DISTINCT é opcional, e quando especificado a tabela resultado não
conterá linhas repetidas.
O argumento ASC da clausula ORDER BY é opcional (pode ser DESC), e indica se a ordenação é
crescente ou decrescente.
A tabela resultado pode ter suas linhas agrupadas e resumidas segundo o valor de uma coluna
especifica com a sintaxe:
SELECT colunas-ou-valores
FROM tabela, tabela
WHERE condição
GROUP BY colunas
HAVING condição
Com esta sintaxe, cada linha da tabela resultado será o resumo das linhas pesquisadas para cada
valor das colunas especificadas em GROUP BY. O argumento HAVING é opcional, e se especificado
conterá as condições de seleção de cada grupo gerado pelo GROUP BY. Na prática, o argumento
HAVING é o WHERE do GROUP BY.
Exemplos:
O DB2 possui um conjunto de funções pre-programadas que podem ser usadas pelos comandos
SQL. Os argumentos passados para as funções podem ser colunas de uma tabela ou expressões
com constantes e variáveis não pertencentes ao DB2.
Quando todos os argumentos não pertencem ao DB2, não existe uma tabela para preencher o
argumento FROM do SELECT. Neste caso deve-se usar a pseudo-tabela SYSIBM.SYSDUMMY1 no
argumento FROM. Exemplo de um SELECT para calcular a raiz quadrada de 25:
SELECT SQRT(25)
FROM SYSIBM.SYSDUMMY1
decimais.
DIGITS(expressão) Retorna o valor da expressão com os algarismos no
formato de um STRING de caracteres. A expressão deve
estar no formato INTEGER, SMALLINT ou DECIMAL.
DOUBLE(expressão) Retorna o valor da expressão ou coluna no formato
FLOAT(expressão) DOUBLE.
HEX(expressão) Retorna um STRING de dígitos hexadecimais com o valor
da expressão.
HOUR(expressão) Retorna o valor da HORA contido na expressão.
Expressão deve ter formato TIME ou TIMESTAMP.
INSERT(string1,inicio,tamanho,string2) Insere STRING2 em STRING1 a partir da posição INICIO
apagando TAMANHO bytes de STRING1.
INTEGER(expressão) Retorna o valor da expressão no formato INTEGER
INT(expressão)
LCASE(string) Converte os caracteres de STRING para minúsculos.
LOWER(string)
LEFT(string1,tamanho) Retorna um STRING com o comprimento TAMANHO
retirado do inicio de STRING1
LENGTH(expressão) Retorna o numero de caracteres do valor da expressão
(ou coluna)
LOCATE(string1,string2,inicio) Pesquisa a posição de STRING1 dentro de STRING2.
INICIO é opcional e especifica a posição do caracter em
STRING2 onde a pesquisa inicia.
LTRIM(string1) Remove SPACES do inicio de STRING1
MICROSECOND(expressão) Devolve o valor dos MICROSSEGUNDOS contidos na
expressão. Expressão precisa ter formato TIME ou
TIMESTAMP.
MINUTE(expressão) Devolve o valor dos MINUTOS contidos na expressão.
Expressão deve ter formato TIME ou TIMESTAMP
MOD(expressão1,expressão2) Esta função devolve o resto da divisão de EXPRESSÃO1
por EXPRESSÃO2
MONTH(expressão) Devolve o valor do MES contido na expressão.
Expressão deve ter formato DATE ou TIMESTAMP
POWER(expressão1,expressão2) Calcula o valor de EXPRESSÃO1 elevada a potencia
indicada em EXPRESSÃO2.
REPEAT(string1,quantidade) Devolve um STRING formado pela repetição de STRING1
vezes QUANTIDADE.
REPLACE(string1,string2,string3) Substitui todas as ocorrências de STRING2 por STRING3
dentro de STRING1
RIGHT(string,tamanho) Devolve os últimos TAMANHO caracteres de STRING
RTRIM(string) Remove os espaços do fim de STRING.
SECOND(expressão) Devolve o valor dos SEGUNDOS contidos na expressão.
Expressão deve ter formato TIME ou TIMESTAMP
SMALLINT(expressão) Retorna o valor da expressão no formato SMALLINT
SPACE(expressão) Produz um STRING no formato VARCHAR contendo
espaços com o comprimento dado pelo valor de
EXPRESSÃO.
SQRT(expressão) Devolve a raiz quadrada do valor de EXPRESSÃO. O
resultado tem formato DOUBLE.
SUBSTR(string1,inicio,tamanho) Devolve um STRING extraído de STRING1 a partir de
INICIO. O argumento TAMANHO é opcional, e indica o
comprimento do resultado. Se TAMANHO for omitido, a
extração se inicia em INICIO até o fim de STRING1.
TIME(expressão) Converte EXPRESSÃO para o formato TIME.
Direitos Autorais – ISP Consultoria
www.escoladeprogramadores.com.br
16
DB2
SELECT SUM(SALARIO),
AVG(COMISSAO)
FROM FUNCIONARIOS
WHERE DEPTO = „A10‟
SELECT MAX(SALARIO),
MIN(SALARIO)
FROM FUNCIONARIOS
SELECT CARGO,
SUM(SALARIO)
FROM FUNCIONARIOS
GROUP BY CARGO
HAVING
SUM(SALARIO) > 10000
SELECT SALARIO,
DECIMAL(SALARIO,6,1),
INTEGER(SALARIO),
HEX(SALARIO),
DIGITS(SALARIO)
FROM FUNCIONARIOS
SELECT NOME,
LENGTH(NOME)
FROM FUNCIONARIOS
SELECT SUBSTR(NOME,1,3)
FROM FUNCIONARIOS
SELECT COUNT(*)
FROM FUNCIONARIOS
SELECT NOME,
VALUE(COMISSAO,0)
FROM FUNCIONARIOS
WHERE COMISSAO IS NULL
SELECT NOME,
CHAR(DT_NASC, EUR)
FROM FUNCIONARIOS
WHERE CODFUNC = 10
2.2.4.1.4 - JOIN
O JOIN é o processo do SELECT de pesquisar dados de mais de uma tabela. A tabela resultado
conterá valores provenientes de colunas das varias tabelas.
Para que seja possível esta união das linhas de varias tabelas para compor uma linha da tabela
resultado, é necessário que as linhas das varias tabelas tenham em comum uma coluna que tenha
valores correspondentes.
Para exemplificar, vamos usar 2 tabelas:FUNCIONARIOS e DEPARTAMENTO com as seguintes
colunas:
Tabela FUNCIONARIOS
CODFUN
NOMEFUN
DEPTO
SALARIO
Tabela DEPARTAMENTO
CODDEPTO
NOMEDEPT
Queremos fazer uma relação de funcionários com o nome do departamento em que trabalham. A
tabela resultado deste SELECT deverá conter CODFUN, NOMEFUN tirados da tabela
FUNCIONARIOS e conter NOMEDEPTO tirado da tabela DEPARTAMENTO. Este SELECT deverá
fazer um JOIN destas duas tabelas usando como colunas de ligação DEPTO e CODDEPTO. O
SELECT será o seguinte:
2.2.4.1.5 - SUB-QUERIES.
SALARIO < (
SELECT AVG(SALARIO)
FROM FUNCIONARIOS
WHERE CODDEPTO = `P2`)
No exemplo , a SUB-QUERY produziu somente uma linha. Nos casos em que a SUB-QUERY produz
mais de uma linha, existem operandos no SELECT para decidir o campo de ação da condição do
WHERE. Estes operandos são os do quadro:
2.2.4.2 - INSERT
Sua sintaxe :
Este comando SQL define o nome da tabela onde a linha vai ser incluída, em seguida dentro de
parênteses, uma serie de colunas para as quais vão ser informados os valores, e apos o argumento
VALUES, os valores de cada coluna da serie acima.
Quando se inclui uma nova linha em uma tabela, não é necessário fornecer valores para todas as
colunas da linha. Somente as colunas definidas como NOT NULL devem receber obrigatoriamente
valores. As colunas que não recebem valores na inclusão da linha permanecem como colunas
inexistentes na linha (valor = NULL) até que uma alteração crie esta coluna.
A serie de colunas informada no comando INSERT pode ser informada em qualquer ordem, isto é, as
colunas no INSERT não precisam estar na ordem de sua criação na tabela.
Nos casos em que o INSERT preenche valores para todas as colunas da tabela, a seqüência de
colunas pode ser omitida, e o comando se simplifica como:
Neste caso terá de ser informado os valores de todas as colunas na seqüência em que as colunas
foram definidas na tabela.
Exemplo de comando INSERT:
2.2.4.3 – UPDATE
O comando UPDATE é usado para alterar valores em uma ou mais linhas de uma tabela. O comando
enumera as colunas e seus novos valores.
Há duas sintaxes para este comando, porem as duas são equivalentes.
Primeiro formato:
UPDATE nome-da-tabela
SET coluna=valor, coluna=valor, .......
WHERE condição
Exemplo:
UPDATE EMPREGADOS
SET SALARIO=SALARIO * 1.10, BONUS=NULL, COMISSAO=10.00
WHERE CODDEPTO = `P10`
Segundo formato:
UPDATE nome-da-tabela
SET (coluna, coluna, ......)
=(valor, valor, ......)
WHERE condição
Exemplo:
UPDATE EMPREGADOS
SET(SALARIO, BONUS, COMISSAO)
= (SALARIO * 1.10, NULL, 10.00)
WHERE CODDEPTO = `P10`
2.2.4.4 - DELETE
O comando DELETE exclui linhas inteiras de uma tabela selecionadas pela clausula WHERE. Se a
clausula WHERE não for especificada em um comando DELETE, todas as linhas da tabela serão
apagadas.
Sintaxe:
Exemplo:
3 - PROGRAMANDO EM COBOL
3.1 - INTRODUÇÃO
Para codificar um comando SQL em Cobol é suficiente colocar o comando como foi exposto nos
paragrafos anteriores entre as palavras EXEC SQL e END-EXEC como no modelo:
EXEC SQL
Comando
END-EXEC
Exemplo:
EXEC SQL
SELECT *
FROM FUNCIONARIOS
END-EXEC.
Em um programa Cobol os comandos SQL precisam trocar ou comparar valores entre as colunas do
banco de dados e as variaveis do programa. Por exemplo, em um SELECT o DB2 precisará mover
dados de suas colunas para as variaveis do Cobol.
Quando esta troca de informações é realizada, é necessário haver uma compatibilidade completa
entre o formato do dado nas colunas do DB2 e na variavel do Cobol, pois ao contrario do Cobol que
ajusta o formato dos dados nas trocas, o DB2 nas faz nenhuma conversão de formato nestas
operações.
As variaveis Cobol usadas dentro dos comandos SQL recebem o nome de HOST VARIABLES.
Qualquer variavel definida no Cobol pode ser usada como HOST VARIABLE, desde que seu formato
seja completamente compativel (tamanho, PICTURE, decimais etc) com a coluna da tabela com a
qual troca dados.
Para resolver os problemas de compatibilidade, para cada tabela usada no programa define-se na
WORKING-STORAGE uma area de acesso (equivalente a FD do Cobol), contendo todas as colunas
da tabela com o formato conveniente. O DB2 possui um utilitário para produzir estas areas de
comunicação, chamado DCLGEN. O DCLGEN pode ser acionado pelo TSO.
A área produzida pelo DCLGEN é declarada no programa Cobol com o seguinte comando
EXEC SQL
INCLUDE nome-da-area
END-EXEC.
Todos os comandos SQL devem portanto usar HOST VARIABLES contidos dentro destas areas
produzidas pelo DCLGEN. No exemplo acima estas variaveis estão na area DCLPRODUTO.
Quando usadas nos comando SQL as HOST VARIABLES devem sempre estar precedidas pelo
caracter dois pontos(:). Se o compilador de comandos SQL encontra o (:) antes de uma palavra, ela é
interpretada como HOST VARIABLE, caso contrario é interpretada como nome de coluna do DB2.
3.1.2.1 - INDICATORS.
INDICATORS são variaveis do programa Cobol usadas nos comandos SQL para:
- Informar o comprimento real dos valores contidos em colunas VARCHAR.
- Informar se uma coluna contem NULL.
- Informar erros de conversão entre o valor das colunas e as HOST VARIABLES.
Os INDICATORS devem ser variaveis com formato S9(4) COMP, e quando necessario deve haver
um INDICATOR para cada coluna da tabela.
Na area de declaração da tabela, o DCLGEN ja preve um conjunto de INDICATORS. No exemplo da
tabela DBADB2.PRODUTO mostrada no paragrafo anterior, a variavel NOME-LEN é o INDICATOR
da variavel NOME, que corresponde a uma coluna VARCHAR. Para as outras colunas que não são
VARCHAR, existe uma tabela de INDICATORS (a tabela INDSTRUCT), com 1 INDICATOR para
cada coluna:
INDICATOR COLUNA
INDSTRUCT(1) CODIGO
INDSTRUCT(2) NOME
INDSTRUCT(3) QUANTIDADE
INDSTRUCT(4) PRUNIT
3.1.3.1 - SQLCODE
O DB2 utiliza uma variavel de nome SQLCODE para retornar o STATUS de todos os comandos SQL.
A variavel SQLCODE esta contida na area SQLCA que deve ser declarada na WORKING-STORAGE
dos programas com a sintaxe:
EXEC SQL
INCLUDE SQLCA
END-EXEC.
Os codigos de erro dados pelo SQLCODE podem ser encontrados no manual de erros da IBM (DB2
MESSAGES AND CODES).
É necessário testar o código de retorno para todos os comandos SQL executáveis (Os comandos
DECLARE não são executáveis).
3.1.3.2 - WHENEVER
A clausula WHENEVER do DB2 pode ser usada para substituir os testes do SQLCODE, e tem um
funcionamente identico ao comando HANDLE CONDITION do CICS, isto é, ela define uma ação no
programa para onde a execução continuará quando ocorrer o erro apontado no WHENEVER. O
WHENEVER no entanto somente intercepta 3 condições de erro:
Como resultado das definições acima, a sintaxe do WHENEVER pode ser uma das
seguintes:
EXEC SQL
WHENEVER condição
GO TO paragrafo
END-EXEC
Ou
EXEC SQL
WHENEVER condição
CONTINUE
END-EXEC
Exemplo:
EXEC SQL
WHENEVER NOT FOUND
GO TO NÃO-EXISTE
END-EXEC
Para se ler dados de uma tabela em um programa Cobol o comando básico usado é o SELECT visto
nos itens anteriores deste manual. O SELECT precisa somente ser ampliado para definir as HOST
VARIABLES que devem receber os dados.
Existem dois processos de leitura no DB2: o primeiro aplica-se quando o SELECT devolve somente
uma linha da tabela, e o segundo processo quando a tabela resultado do SELECT contem mais de
uma linha.
Quando a tabela resultado do SELECT contem somente uma linha, o parâmetro INTO acrescentado
ao SELECT é suficiente para definir as HOST VARIABLES de leitura. A sintaxe deste SELECT é:
EXEC SQL
SELECT coluna, coluna, ...
INTO variavel, variavel, ....
FROM tabela
WHERE condição
END-EXEC
A variavel do parametro INTO deve ser uma HOST VARIABLE (portanto precedida por dois pontos).
Alem disso, se a coluna pesquisa for do tipo VARCHAR ou a sua definição permitir valores NULL, é
necessario acrescentar um INDICATOR na HOST VARIABLE respectiva. Este INDICATOR receberá
um dos seguintes valores apos a execução do SELECT:
Para se codificar o INDICATOR, basta coloca-lo apos a HOST VARIABLE, precedido ou não pela
palavra INDICATOR.
Sintaxes:
:variavel :indicator, :variavel ......
Ou
:variavel INDICATOR :indicator, :variavel.....
Exemplo:
MOVE `000001` TO CODIGO.
EXEC SQL
SELECT NOMEEMP, SALARIO
INTO :NOME INDICATOR :INDNOME, :SALARIO
WHERE CODEMP = :CODIGO
END-EXEC.
Este exemplo lê o nome e salário do empregado 000001. Note que as variáveis NOME, SALARIO e
CODIGO que estão precedidas por (:) são as HOST VARIABLES, e devem estar incluídas na área
do INCLUDE da declaração da tabela EMPREGADO na WORKING-STORAGE.
Também a HOST VARIABLE NOME esta acompanhada pelo seu INDICATOR INDNOME.
OBS.: Se na definição da HOST VARIABLE, houver um sub-nivel da variavel para servir como
INDICATOR, o INDICATOR pode ser omitido na clausula INTO. Exemplo:
WORKING-STORAGE SECTION.
.......
10 NOME.
49 NOME-TEXT PIC X(20).
49 NOME-LEN PIC S9(4) COMP.
PROCEDURE DIVISION.
.......
EXEC SQL
SELECT NOME, SALARIO
INTO :NOME, :SALARIO
WHERE CODDEP = :DEPTO
END-EXEC.
Se o comando SELECT estiver selecionando todas as colunas da tabela (SELECT *), o argumento
INTO pode apontar para o nivel 01 das HOST VARIABLES como no exemplo:
EXEC SQL
SELECT *
INTO :DCLPRODUTO
FROM DBADB2.PRODUTO
END-EXEC.
Quando o SELECT monta uma tabela resultado com mais de uma linha, a linha resultado que deve
carregar as HOST VARIABLES na clausula INTO fica indefinida. Se a lógica da aplicação estiver
interessada na primeira linha da tabela resultado, a inclusão do parâmetro FETCH FIRST ROW
ONLY seleciona esta linha, e o comando abaixo pode ser aplicado:
EXEC SQL
SELECT coluna, coluna, ...
INTO variavel, variavel, ....
FROM tabela
WHERE condição
FETCH FIRST ROW ONLY
END-EXEC
Exemplo:
MOVE `000001` TO CODIGO.
EXEC SQL
SELECT NOMEEMP, SALARIO
INTO :NOME, :SALARIO
WHERE CODEMP > :CODIGO
FETCH FIRST ROW ONLY
END-EXEC.
3.2.2.1 - CURSOR.
Quando o comando SELECT cria a tabela resultado com mais de uma linha, e o programa precisa ler
todas estas linhas, é necessário usar o componente CURSOR.
O CURSOR é um componente (objeto) criado dentro do programa Cobol através de um comando,
contendo a definição da QUERY (SELECT). É usado para executar o SELECT e em seguida é usado
para ler cada uma das linhas da tabela resultado.
Um programa pode construir vários CURSOR, porem cada um deles deve ter um nome diferente. O
roteiro para operar o cursor é:
EXEC SQL
DECLARE nome-do-cursor CURSOR FOR
Comando SELECT
END-EXEC
Sintaxe do FETCH
EXEC SQL
FETCH nome-do-cursor
INTO :variável, :variável, .....
END-EXEC
EXEC SQL
OPEN nome-do-cursor CURSOR
END-EXEC
EXEC SQL
CLOSE nome-do-cursor CURSOR
END-EXEC
EXEC SQL
DECLARE LER-EMP CURSOR FOR
SELECT CODEMP NOMEMP
FROM FUNCIONARIOS
WHERE CODDEPTO = `P10`
END-EXEC.
EXEC SQL
OPEN LER-EMP CURSOR
END-EXEC.
IF SQLCODE < 0
GO TO ERRO-SQL.
LEITURA.
EXEC SQL
FETCH LER-EMP CURSOR
INTO :CODIGO, :NOME INDICATOR :INDNOME
END-EXEC.
IF SQLCODE = +100
EXEC SQL
CLOSE LER-EMP CURSOR
END-EXEC
GO TO CONTINUAR.
IF SQLCODE < 0
GO TO ERRO-SQL.
DISPLAY `FUNCIONARIO ` CODIGO ` ` NOME
GO TO LEITURA.
CONTINUAR.
No item anterior a tabela resultado foi lida pelo CURSOR seqüencialmente. Após lida a ultima linha
(SQLCODE = 100), o cursor foi fechado e a pesquisa encerrada.
Existe uma opção de CURSOR chamada SCROLLABLE CURSOR onde a pesquisa das linhas na
tabela resultado é aleatória. Esta técnica porem alem de ser mais complexa e pouco usada, exige a
criação pelo setor do suporte de arquivos temporários para suportar a tabela resultado, e não será
estudada neste curso.
Se alguma das colunas do comando INSERT for do tipo VARCHAR, o INDICATOR precisa ser
carregado com o comprimento real do valor da coluna. Ex.:
MOVE 10 TO NOME-LEN
EXEC SQL
INSERT INTO PRODUTO
(CODIGO, NOME)
VALUES(:CODIGO, :NOME)
END-EXEC.
EXEC SQL
UPDATE tabela
SET(coluna, coluna, ...)
=(valor, valor, ...)
WHERE condição
END-EXEC
Ou
EXEC SQL
UPDATE tabela
SET coluna=valor, coluna=valor, ....
WHERE condição
END-EXEC
Se alguma das colunas do comando UPDATE for do tipo VARCHAR, o INDICATOR precisa ser
carregado com o comprimento real do valor da coluna. Ex.:
MOVE 10 TO NOME-LEN
EXEC SQL
UPDATE PRODUTO
SET NOME = :NOME
WHERE CODIGO = :CODIGO
END-EXEC.
Este tipo de atualização ocorre quando a atualização é feita em uma linha da RESULT TABLE que foi
posicionada por um comando FETCH de um CURSOR. Neste caso a clausula WHERE do UPDATE
não define a condição de seleção da linha, mas declara que está usando a posição corrente do
CURSOR.
Para usar uma atualização posicionada, a declaração do CURSOR precisa definir que ele será usado
para atualizações, preferivelmente citando a coluna que vai ser atualizada com a sintaxe seguinte:
EXEC SQL
DECLARE nome-do-cursor CURSOR FOR
SELECT linhas
FROM tabela
WHERE condição
FOR UPDATE OF coluna,coluna ....
END-EXEC
Se a lógica do programa não souber antecipadamente a coluna a ser atualizada numa atualização
posicionada, o CURSOR pode ser declarado para atualização generica com a sintaxe:
EXEC SQL
DECLARE nome-do-cursor CURSOR FOR
SELECT linhas
FROM tabela
WHERE condição
FOR UPDATE
END-EXEC
Quando o cursor foi declarado para atualização com as sintaxes acima, após cada FETCH o
programa pode atualizar a linha lida com a sintaxe abaixo:
EXEC SQL
UPDATE tabela
SET coluna=valor, coluna=valor, ....
WHERE CURRENT OF CURSOR
END-EXEC
A sintaxe do comando para excluir linhas em uma tabela é a mesma vista no comando DELETE de
SQL.
Sintaxe para o comando:
EXEC SQL
DELETE FROM tabela
WHERE condição
END-EXEC
Exemplo:
EXEC SQL
DELETE FROM PRODUTO
WHERE CODIGO = :CODIGO
END-EXEC.
Este tipo de atualização ocorre quando é feita a exclusão de uma linha da RESULT TABLE que foi
posicionada por um comando FETCH de um CURSOR. Neste caso a clausula WHERE do DELETE
não define a condição de seleção da linha, mas declara que está usando a posição corrente do
CURSOR.
Para usar uma exclusão posicionada, a declaração do CURSOR precisa definir que ele será usado
para atualizações com a seguinte sintaxe:
EXEC SQL
DECLARE nome-do-cursor CURSOR FOR
SELECT linhas
FROM tabela
WHERE condição
FOR UPDATE
END-EXEC
Quando o cursor foi declarado para atualização com as sintaxes acima, após cada FETCH o
programa pode excluir a linha lida com a sintaxe abaixo:
EXEC SQL
DELETE FROM tabela
WHERE CURRENT OF CURSOR
END-EXEC
4 - COMMIT / ROLLBACK
COMMIT - Responsável por efetivar a transação corrente, pois quando se trabalha com um
banco de dados em que vários usuários vão utilizá-lo ao mesmo tempo, tem que se
efetivar a operação, pois sem o COMMIT a alteração não será visualizada para as
outras "sessões", salvo se a sessão em que fez a alteração for fechada, o que por
sua vez, traria muitos prejuízos, pois outros usuários iriam trabalhar com um banco de
dados desatualizado e podendo até causar redundância de dados.
Quando usamos o comando COMMIT o sistema fecha todos os cursores abertos,
destrói todas as sentenças preparadas e torna inválidos todos os cursores que
estejam associados a uma sentença preparada.
Resumo:
Indica término bem sucedido de uma unidade de trabalho
Alteração dos dados serão gravadas.
Todas os PAGE LOCKS serão liberados
CURSOR fechado, exceto para CURSOR WITH HOLD
Direitos Autorais – ISP Consultoria
www.escoladeprogramadores.com.br
32
DB2
EXEC SQL
COMMIT
END-EXEC
EXEC SQL
ROLLBACK
END-EXEC
Quando se faz uma operação no BD (INSERT, UPDATE, DELETE), este por sua vez
retorna se a operação foi ou não bem sucedida. A partir daqui podemos imaginar
como podem nos ser úteis as cláusulas.
4 – TABELAS DE SISTEMA.
O Sistema de Gestão de Bases de Dados DB2 mantém um conjunto de tabelas (o catálogo do DB2)
com dados relativos aos vários objectos DB2. Estes dados podem ser consultados através do
comando SELECT (usando um interface interactivo - SPUFI ou QMF), tal como se tratassem de
quaisquer outras tabelas. De entre as tabelas do catálogo DB2 destacam-se:
SELECT *
FROM SYSIBM.SYSKEYS
WHERE IXNAME LIKE 'ITIT063%'
;
DB2 - SQLCode
+100 - Linha não encontrada para FETCH, UPDATE, DELETE ou o resultado de uma QUERY é uma
tabela vazia.
+304 - Um valor com tipo de dado tipo 1 não pode ser contido em uma variável HOST, porquê o seu
conteúdo não é compatível tipo 2
-102 - O tamanho da constante na STRING é maior que 254 caracteres ou 124 caracteres gráficos.
-111 - Uma função de coluna não incluiu o nome de uma das colunas
-112 - O operando de uma função de coluna é outra função de coluna ou DISTINCT seguido de uma
expressão.
-115 - Um predicado é inválido porque o operador de comparação operador é seguido de uma lista
entre parênteses ou pôr um ou todos predicados sem uma subQUERY.
-118 - A tabela objeto ou VIEW de um comando INSERT, DELETE, ou UPDATE está também
identificado na clausula FROM.
-119 - Uma coluna citada em uma cláusula HAVING não foi inclusa na cláusula GROUP BY.
-120 - Uma cláusula WHERE ou SET inclui uma função de coluna ou a cláusula WHERE referencia-
se a uma coluna que deriva de uma função de coluna de uma VIEW definida.
-121 - O nome da coluna foi citado mais de uma vez no comando INSERT ou UPDATE
-122 - Um comando SELECT sem cláusula GROUP BY contém um nome de coluna e uma coluna de
função na cláusula SELECT ou, um nome de coluna está contido na cláusula SELECT mas não no
GROUP BY.
-126 - O comando SELECT contém uma cláusula UPDATE e uma cláusula ORDER BY
ao mesmo tempo.
-132 - Um predicado LIKE está inválido porquê o primeiro operando não é uma coluna ou o segundo
operando não é um STRING.
-133 - Uma função de coluna em uma SUBQUERY de uma cláusula HAVING está inválida porquê ela
contém uma expressão que utiliza um operador para uma referencia correlata.
-134 - Uso impróprio de uma coluna STRING muito grande nome_de_coluna ou uma variável HOST
com tamanho máximo maior que 254.
-136 - SORT não pode ser executado porquê o tamanho da chave do SORT possui mais que 4000
bytes.
-138 - O segundo ou terceiro argumento de uma função SUBSTR está fora do limite (RANGE).
-150 - O objeto de um comando INSERT, DELETE, ou UPDATE é uma VIEW que não permite esse
comandos solicitados.
-151 - A coluna nome_da_coluna não pode ser alterado pôr fazer parte também de uma chave
partilhada (partitioning key) de uma tabela partilhada (tablespace partitioned) ou derivada de uma
função ou expressão SQL.
-153 - O comando CREATE VIEW não inclui uma lista de colunas solicitadas.
-154 - O comando CREATE VIEW falhou porquê a definição da VIEW contém um UNION ou um
Direitos Autorais – ISP Consultoria
www.escoladeprogramadores.com.br
36
DB2
UNION ALL.
-156 - O comando ALTER TABLE, DROP TABLE, LOCK TABLE, ou CREATE INDEX referencia-se a
uma VIEW.
-158 - O numero de colunas especificadas para a VIEW não é o mesmo especificado pela cláusula
SELECT.
-160 - A opção WITH CHECK não pode ser utilizada pela VIEW especificada.
-161 - O INSERT ou UPDATE não é permitido porquê a linha resultante não satisfaz a definição da
VIEW.
-164 - auth_id1 Não possui privilégio para criar VIEW com qualificação auth_id1
-183 - Uma expressão aritmética em uma DATA ou TIMESTAMP possuí um resultado inválido para o
range de datas.
-184 - Uma expressão aritmética com valore DATETIME contém um PARAMETER MAKER.
-185 - A opção formato local está sendo usada com uma data ou hora e a saída NO LOCAL está
sendo instalada.
-186 - O tamanho da data/hora local está sendo aumentado e executando um programa que ajusta o
tamanho antigo.
-207 - a cláusula ORDER BY está inválida porque nela está incluso um nome de coluna que não faz
parte do resultado do UNION ou UNION ALL
-208 - a cláusula ORDER BY está inválida porque o nome da coluna não faz parte da Tabela.
-301 - o valor da variável HOST não pode ser utilizado como especificado devido ao tipo de dado.
-302 - o valor de uma variável de entrada é muito grande para o tipo de coluna definida.
-303 - um valor não pode ser assinalado para uma variável HOST porque os tipos de dados não são
compatíveis.
-304 - o valor não pode ser armazenado na variável HOST devido a ultrapassar o valor máximo
permitido. Alterar o formato da HOST de smallint para integer ou decimal.
-305 - valor null não pode ser armazenado na HOST devido a falta de variável indicadora.
-309 - o predicado é inválido pois a variável HOST referenciada contém valor nulo
-313 - o número de variáveis HOST assinaladas no INTO difere das colunas assinaladas no SELECT.
-401 - tipos de dados na comparação são incompatíveis ( ex.: comparação de numérico =alfa)
-402 - uma função ou operador aritmético está sendo utilizado para um campo CHAR ou DATETIME
-404 - o comando UPDATE ou INSERT possui uma STRING de tamanho muito grande.
-405 - a literal numérica não pode ser utilizada adequadamente pôr estar fora do range ou seja, a
variável é smallint e o valor ultrapassa o máximo permitido para esta configuração.
-406 - um valor calculado ou derivado numérico está fora do range permitido para a coluna ( vide -
405).
-407 - o valor de um UPDATE ou INSERT é nulo, mas a coluna não aceita nulo.
-408 - o valor de um UPDATE ou INSERT não é compatível com o tipo de dado da coluna.
-411 - a DATETIME corrente ou chave do usuário não pode ser utilizada como especificado.
-415 - as colunas referenciadas em um UNION ou UNION ALL não são compatíveis com as
descrições.
-417 - a string construída inclui marcadores de parâmetros como operandos do mesmo operador (PS:
não entendi nada)
-419 - a operação de divisão decimal é inválida pois o resultado poderá ser em escala negativa.
-421 - os operandos de um UNION ou UNION ALL não possuem o mesmo número de colunas
-503 - uma coluna não pôde ser alterada pois não está identificada na clausula SELECT do comando
CURSOR.
-508 - o CURSOR identificado no comando UPDATE OU DELETE não está posicionado em uma
linha.
-509 - A tabela identificada no comando DELETE ou UPDATE não é a mesma que consta do
comando CURSOR, verifique.
-510 - A tabela identificada no comando DELETE ou UPDATE não é pode ser alterada.
-511 - A clausula UPDATE não pôde ser especificada pois a tabela referenciada não permite
alterações.
-513 - O ALIAS não deve estar definido em outro local ou ALIAS remoto.
-517 - O CURSOR não pode ser usado pois o nome do comando não foi identificado
-531 - A chave primária em uma linha paterna (parent row) não pode ser alterado pois possui uma ou
mais linhas dependentes (dependent rows) em um relacionamento.
-534 - A chave primária não pode ser alterada pôr causa de multiple-rows UPDATE
-536 - O comando DELETE está inválido pois a tabela pode ser afetada pela operação.
-537 - A chave primária ou estrangeira foi identificada na cláusula mais de uma vez
-538 - A chave estrangeira não está conforme a descrição da chave primária da tabela
-540 - A definição da tabela está incompleta porque não possui um índice primário.
-541 - A chave estrangeira está inválida porque ela é duplicate referential constraint
-542 - A coluna não pode ser chave primária porque pode conter nulos.
-551 - O usuário não possui privilégio para efetuar a operação. (falta de GRANT)
-556 - O privilégio não pode ser revogado porque o usuário não possui autoridade para revogá-lo.
-603 - O índice único não pode ser criado pois nele está incluso colunas com valores duplicados.
-614 - O índice não pode ser criado porque a soma do tamanho interno das colunas é maior que o
máximo permitido.
-616 - Objeto não pode ser dropado (apagado) porque é referenciado pôr outro objeto.
-619 - Operação desabilitada porque o arquivo de trabalho do banco de dados está operante.
-620 - chave keyword IN strn type1 comando não é permitido para um tablespace no workfile data
base
-625 - Tabela não tem obrigatoriedade de paridade no índice para a chave primária.
-626 - O comando ALTER não é executado porque o pageset não foi parado.
-627 - O comando ALTER está inválido porque o pageset esta user-managed data sets
-629 - O valor nulo não pode ser setado pois a chave estrangeira não pode conter valor nulo
-632 - A tabela não pode ser definida como dependente de outra pôr causa das regras de restrições
de DELETE.
-638 - Tabela não pode ser criada porque está faltando definição da coluna
-639 - Uma coluna de uma chave estrangeira que permite valores nulos com uma regra de DELETE
de SET NULL não pode ser uma coluna de chave de um índice particionado.
-646 - A tabela não pode ser criada em um tablespace particionada/default porque ele já contém uma
Direitos Autorais – ISP Consultoria
www.escoladeprogramadores.com.br
41
DB2
tabela
-647 - O bufferpool não pôde ser especificado porque não havia sido ativado.
-653 - A tabela no tablespace particionado não está disponível porque o índice particionado não havia
sido criado.
-660 - Índice não pode ser criado ou partilhado porque chaves limites não foram especificadas.
-661 - Índice não pode ser criado ou partilhado porque o número de partes especificadas não é igual
ao número de partições.
-662 - Índice particionado não pode ser criado em uma tablespace não particionada.
-663 - O nr. de chave limite de valores é zero ou maior que o nr de colunas da chave índice.
-664 - O tamanho interno da chave-limite de campos para o indice particionado excede o tamanho
imposto pelo gerenciador de índices.
-666 - stmt-verb object NÃO PODE SER EXECUTADA PORQUE function ESTÁ SENDO
EXECUTADA.
-667 - O índice CLUSTERING para um tablespace particionada não pode ser EXPLICIT DROPPED
-668 - A coluna não pode ser adicionada a tabela porque a tabela possui um EDIT PROCEDURE
-671 - O atributo BUFFERPOOL da tablespace não pode ser alterado como foi especificado porque
isso poderia afetar o tamanho de página da tablespace.
-676 - Uma página de 32k BUFFERPOOL não pode ser utilizada ou indexada.
-678 - A literal xxx especificada como chave limite de índice deve estar de acordo com o tipo de dado
xxx para a coluna correspondente xxxxx
-679 - O objeto xxx não pode ser criado pois há um DROP pendente para ele.
-681 - Column column-name in violation of installation defined field procedure. RT: return-code, RS:
reason-code, MSG: message-tokes
-686 - A coluna definida com um campo procedure não pode ser comparada com outra coluna de
campo procedure diferente.
-803 - O valor de uma ou mais linhas estão inválidos pois a coluna objeto não permite duplicidade.
(chave única).
-804 - Um erro foi encontrado no parametro de entrada do programa de aplicação para o comando sql
-811 - O resultado de um comando select embedded é uma tabela de mais de uma linha, ou o
resultado da de um predicado basico da subquery possui mais de um valor
-817 - O insert , update, delete, DDL ou autorização não pode ser executada porque a transação
IMS/VS é somente inquiry
-818 - O precompiler-generated timestamp x in the load module é diferente do bind timestamp y built
from the dbrm
-819 - A view não pode ser recriada porque ela referencia a uma view que não pode ser recriada.
-820 - O comando SQL nào pode ser processado porque catalog-table contém um valor que não é
válido nesta versão.
-821 - A view view-creator.view-name está sendo dropado durante a migração. Criador synonym-
creator de sinônimo synonym-name não pode ser resolvido.
-840 - Muitos itens retornados em uma lista de select ou insert .This help file was created with
HelpScribble.
-901 - Execução mal sucedida causada por um erro de sistema que não impede a execução com
sucesso dos comandos SQL seguintes.
-902 - Execução mal sucedida causada por um erro de sistema que impede a execução com sucesso
dos comandos SQL seguintes
-904 - Cancelamento causado por um recurso indisponivel reason-code, tipo de recurso resource-
type, e nome do recurso resource-name.
-906 - O comando SQL não pode ser executado porque esta função está desabilitada por um erro
anterior.
-910 - O comando SQL não pode ser acessar um objeto pois há um comando DROP ou ALTER
pendente
-923 - Conexão não estabelecida : DB2 condition REASON reason-code, TYPE resource-type, NAME
resource-name
Exemplo: Insert
ID DIVISION.
PROGRAM-ID. DB2INSER.
ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SPECIAL-NAMES. DECIMAL-POINT IS COMMA.
DATA DIVISION.
WORKING-STORAGE SECTION.
77 ASTERISCO PIC X(53) VALUE ALL '*'.
01 WS-LINHA.
03 WS-MATRICULA PIC 9(5).
03 WS-NOME PIC X(20).
03 WS-SALARIO PIC 9(5)V99.
03 WS-COD-CARGO PIC 99.
03 WS-COD-DEPTO PIC 99.
03 WS-DATA-ADMISSAO.
05 WS-DIA PIC XX.
05 WS-MES PIC XX.
05 WS-ANO PIC X(4).
01 WS-DATA.
03 WS-ANO PIC X(4).
03 FILLER PIC X VALUE '-'.
03 WS-MES PIC XX.
03 FILLER PIC X VALUE '-'.
03 WS-DIA PIC XX.
EXEC SQL
INCLUDE MFUNCION
END-EXEC.
EXEC SQL
INCLUDE SQLCA
END-EXEC.
PROCEDURE DIVISION.
000-PRINCIPAL SECTION.
PERFORM 100-INICIO.
PERFORM 200-PROCESSAR UNTIL WS-MATRICULA = ZEROS.
PERFORM 300-FINAL.
STOP RUN.
000-FIM. EXIT.
100-INICIO SECTION.
MOVE 30 TO NOME-LEN.
ACCEPT WS-LINHA FROM SYSIN.
100-FIM. EXIT.
200-PROCESSAR SECTION.
MOVE WS-MATRICULA TO MATRICULA.
MOVE WS-NOME TO NOME-TEXT.
MOVE WS-SALARIO TO SALARIO.
MOVE WS-COD-CARGO TO COD-CARGO.
MOVE WS-COD-DEPTO TO COD-DEPTO.
MOVE CORR WS-DATA-ADMISSAO TO WS-DATA.
MOVE WS-DATA TO DATA-ADMISSAO.
EXEC SQL
INSERT INTO FUNCIONARIO
(MATRICULA,NOME,SALARIO,COD_CARGO,COD_DEPTO,
DATA_ADMISSAO)
VALUES
(:MATRICULA,:NOME,:SALARIO,:COD-CARGO,:COD-DEPTO,
:DATA-ADMISSAO)
END-EXEC.
IF SQLCODE = -803
DISPLAY 'MATRICULA: ' WS-MATRICULA ' JA EXISTE.'
DISPLAY ASTERISCOS
END-IF.
IF SQLCODE = -530
Exemplo: UPDATE
ID DIVISION.
PROGRAM-ID. DB2UPDA.
ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SPECIAL-NAMES. DECIMAL-POINT IS COMMA.
DATA DIVISION.
WORKING-STORAGE SECTION.
77 ASTERISCOS PIC X(53) VALUE ALL '*'.
01 WS-LINHA.
03 WS-MATRICULA PIC 9(5).
03 WS-NOME PIC X(20).
03 WS-SALARIO PIC 9(5)V99.
03 WS-COD-CARGO PIC 99.
03 WS-COD-DEPTO PIC 99.
03 WS-DATA-ADMISSAO.
05 WS-DIA PIC XX.
05 WS-MÊS PIC XX.
05 WS-ANO PIC X(4).
01 WS-DATA.
03 WS-ANO PIC X(4).
03 FILLER PIC X VALUE '-'.
03 WS-MES PIC XX.
03 FILLER PIC X VALUE '-'.
03 WS-DIA PIC XX.
EXEC SQL
INCLUDE MFUNCION
END-EXEC.
EXEC SQL
INCLUDE SQLCA
END-EXEC.
PROCEDURE DIVISION.
000-PRINCIPAL SECTION.
PERFORM 100-INICIO.
PERFORM 200-PROCESSAR UNTIL WS-MATRICULA = ZEROS.
PERFORM 300-FINAL.
STOP RUN.
000-FIM. EXIT.
100-INICIO SECTION.
MOVE 30 TO NOME-LEN.
ACCEPT WS-LINHA FROM SYSIN.
100-FIM. EXIT.
200-PROCESSAR SECTION.
MOVE WS-MATRICULA TO MATRICULA.
MOVE WS-NOME TO NOME-TEXT.
MOVE WS-SALARIO TO SALARIO.
MOVE WS-COD-CARGO TO COD-CARGO.
MOVE WS-COD-DEPTO TO COD-DEPTO.
MOVE CORR WS-DATA-ADMISSAO TO WS-DATA.
MOVE WS-DATA TO DATA-ADMISSAO.
EXEC SQL
UPDATE FUNCIONARIO SET NOME=:NOME,SALARIO=:SALARIO,
COD_CARGO=:COD-CARGO,
COD_DEPTO=:COD-DEPTO,
DATA_ADMISSAO=:DATA-ADMISSAO
WHERE :MATRICULA = MATRICULA
END-EXEC.
IF SQLCODE = +100
DISPLAY 'MATRICULA: ' WS-MATRICULA
DISPLAY 'FUNCIONARIO NAO CADASTRADO.'
DISPLAY ASTERISCOS
END-IF.
IF SQLCODE = -530
Direitos Autorais – ISP Consultoria
www.escoladeprogramadores.com.br
48
DB2
Exemplo: DELETE
ID DIVISION.
PROGRAM-ID. DB2DELE.
ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SPECIAL-NAMES. DECIMAL-POINT IS COMMA.
DATA DIVISION.
WORKING-STORAGE SECTION.
77 ASTERISCOS PIC X(40) VALUE ALL '*'.
01 WS-MATRICULA PIC 9(5).
EXEC SQL
INCLUDE MFUNCION
END-EXEC.
EXEC SQL
INCLUDE SQLCA
END-EXEC.
PROCEDURE DIVISION.
000-PRINCIPAL SECTION.
PERFORM 100-INICIO.
PERFORM 200-PROCESSAR UNTIL WS-MATRICULA = ZEROS.
PERFORM 300-FINAL.
STOP RUN.
000-FIM. EXIT.
100-INICIO SECTION.
ACCEPT WS-MATRICULA FROM SYSIN.
100-FIM. EXIT.
200-PROCESSAR SECTION.
MOVE WS-MATRICULA TO MATRICULA.
EXEC SQL
DELETE FROM FUNCIONARIO
WHERE MATRICULA =:MATRICULA
END-EXEC.
IF SQLCODE = +100
DISPLAY 'MATRICULA: ' WS-MATRICULA
' FUNCIONARIO NAO EXISTE.'
DISPLAY ASTERISCOS
END-IF.
ACCEPT WS-MATRICULA FROM SYSIN.
200-FIM. EXIT.
300-FINAL SECTION.
DISPLAY '********** FIM DO PROCESSAMENTO **********'.
300-FIM. EXIT.