Grande Porte - COBOL Level 2 - Versão 2.2.3

316

Click here to load reader

description

GRANDE PORTE LEVEL 2 - VERSAO 2

Transcript of Grande Porte - COBOL Level 2 - Versão 2.2.3

Page 1: Grande Porte - COBOL Level 2 - Versão 2.2.3

www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218

COBOL Level 1

Page 2: Grande Porte - COBOL Level 2 - Versão 2.2.3

Versão 2.3.5 – PDF liberado em 26/04/2015

Fique atento para novas versões em nosso site.

Sobre o autor

Prof. Nelson Goncalves de Oliveira

Cientista da Computacão pelo IMES-SCS,

Especialista em Telecomunicacões pela

FAAP-SP, mestrando em ciência da

computacão pela UFAbc-sp.

Iniciou a carreira como desenvolvedor de

software em 1987, especializando-se em

COBOL para Mainframes IBM.

Professor universitário Desde 2000,

leciona diversas disciplinas nos cursos de

Ciência da Computacão e Informática.

fundou a Grande Porte em 2008 com o

objetivo de difundir essa experiência para

o mercado.

“O COBOL tem aberto as portas de

diversas empresas para os nossos

alunos e, mesmo após 55 anos de

existência, continua firme e forte

suportando globalmente o comércio

mundial.”

,

, ,

,

,

[email protected]

Page 3: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte

Desenvolveu o modelo de banco de dados relacional, quandoera pesquisador no laboratório da IBM em San José

Edgar Frank Codd 1923 – 2003

Page 4: Grande Porte - COBOL Level 2 - Versão 2.2.3

Versão 2.2.3a

Page 5: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 1

www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218

3

1

Antes de iniciarmos, vamos conversar sobre os tópicos apresentados na capa desta parte. Isso é importante para que seu instrutor e seus colegas saibam como está seu conhecimento sobre o assunto e se você precisa ou pode fornecer ajuda aos colegas e instrutor.

O que você já sabe?

O que você não sabe?

Porque é importante conhecer estes tópicos?

Quais são os seus temores?

O que você considera difícil?

Depois de falar sobre o assunto com seus colegas e instrutor, escreva,

desenhe, rabisque, diga algo sobre o que você vai fazer para dominar esses tópicos.Comprometa-se!

Preparation

Trocando Ideias É agora que você fala !!

Reflexão É aqui que você se compromete !!

Page 6: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 1

www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218

4

Parabéns você concluiu o curso COBOL Level 1, onde seus programas

manipulavam arquivos sequenciais (QSAM) e indexados (VSAM KSDS).

No curso COBOL Level 2 você deverá escrever programas que irão manipular

dados armazenados em tabelas no DB2.

Há todo um jargão novo para aprender: modelagem, D.E.R, M.E.R, chave

primária, chave estrangeira, normalização, SQL, e etc.

Então vamos começar pelo principio e aprender a ler e a fazer modelos de

dados usando o paradigma relacional.

Presentation

História Uma nova fase !!

Page 7: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 1

www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218

5

1

A Modelagem de Dados é a atividade de determinar os dados necessários para

suportar um negócio, organizando-os em uma estrutura que evite a sua redundância e

facilite sua manutenção pelos sistemas de informação.

É uma atividade realizada por Analistas de Sistemas, com o suporte de um

DBA (Data Base Administrator – Administrador de Banco de Dados) que conhece as

peculiaridades do SGBD (Sistema Gerenciador de Banco de Dados) e pode sugerir

mudanças no modelo de acordo com o software utilizado (Oracle, DB2, Sybase, SQL

Server, etc), visando utilizar de forma otimizada os recursos desses softwares.

Os produtos da Modelagem de Dados são os modelos: Conceitual, Lógico e

Físico dos dados. O Modelo Conceitual é uma visão de alto nível cuja finalidade é

comunicar a essência dos dados que se deseja manipular. O Modelo Lógico leva em

conta os limites impostos pelo paradigma de banco de dados escolhido, em nosso

caso esse paradigma é o Relacional, agrupando os dados em Entidades e seus

relacionamentos. O Modelo Físico já traz detalhes da implementação física desses

dados no SGBD escolhido.

Esses modelos documentam a camada de dados do sistema de informação

que está sendo desenvolvido e serve para comunicar a todos os profissionais

envolvidos quais são os dados e como eles devem ser implementados.

A vantagem em se desenvolver esses três modelos é evitar uma solução física

prematura da definição da camada de dados em um sistema de informação, o que

pode consumir muito tempo se for necessário fazer grandes modificações neste

modelo de dados. É mais fácil reprojetar uma casa enquanto ela está ainda no papel.

TeoriaDefinição de

modelagem de dados

Page 8: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 1

www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218

6

É uma visão macro dos dados do sistema que se deseja desenvolver. Os

dados que dão suporte ao negócio são agrupados em Entidades, que podem estar

relacionadas entre si. Vamos fazer algumas definições:

Atributos – são os dados que dão suporte ao negócio que desejamos modelar,

por exemplo: nome do cliente, endereço do fornecedor, data da venda, etc.

Instância de atributo – são exemplos de dados que o atributo pode conter.

Exemplo: o atributo nome do cliente pode ter as seguintes instâncias José da Silva,

Joaquim José da Silva Xavier, Maria Antonieta, etc.

Entidade – são agrupamentos de dados (atributos) sobre algum objeto de

interesse que desejamos modelar. Por exemplo: cliente, fornecedor, empresa,

funcionário, etc.

Relacionamento – são associações entre as entidades de um modelo. O

relacionamento entre as entidades se dá através de atributos comuns entre as

entidades. Por exemplo: na entidade Cliente temos o atributo código do cliente e na

entidade Venda, também temos o atributo código do cliente, para o qual a venda foi

realizada.

É a representação do modelo conceitual de dados. Neste diagrama utilizamos

os seguintes símbolos:

Entidade

Relacionamento

Linha de ligação

Atributo

Atributo identificador

TeoriaDer – diagrama

Entidade - relacionamento

Teoria Modelo conceitual de dados

Page 9: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 1

www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218

7

1Exemplo de um DER:

Indicam quantas ocorrências de uma entidade participam, no mínimo e no

máximo, do relacionamento. Ela é colocada sobre o relacionamento. No exemplo

acima temos uma cardinalidade 1:N; isso significa que 1 Cliente pode fazer N Pedidos,

mas que cada Pedido é de apenas 1 Cliente, dando uma cardinalidade 1:N (leia-se 1

para N).

As cardinalidades representam os tipos de relacionamentos, que podem ser 1:1,

1:N, N:1 ou N:N.

Cardinalidade 1:1 uma instância da entidade A se relaciona com nenhuma ou

somente uma instância da entidade B. Exemplo: As entidades Fotografia e Cliente

possuem uma cardinalidade 1:1 porque uma Fotografia exibe apenas 1 Cliente e 1

Cliente possui apenas 1 Fotografia.

Cliente FotografiaExibe1 1

1 1

1:1

Teoria CArdinalidade

Cliente PedidoFaz1 N

1 1

1:N

Page 10: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 1

www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218

8

Em um relacionamento com cardinalidade 1 para 1, existe o lado opcional e o

lado obrigatório. O atributo que identifica o lado opcional deve aparecer no lado

obrigatório, para que haja o relacionamento. No exemplo acima, um Cliente pode não

ter Fotografia, que é opcional. Porém toda Fotografia pertence a um Cliente, que é

obrigatório. Então o atributo Código Fotografia deve aparecer na entidade Cliente.

Cardinalidade 1:N uma instância da entidade A se relaciona com nenhuma,

uma ou muitas instâncias da entidade B. Exemplo: As entidades Classificação e

Cliente possuem um relacionamento com cardinalidade 1:N, porque uma Classificação,

por exemplo 5 estrelas, pode classificar muitos Clientes e cada Cliente possui apenas

1 classificação.

Em um relacionamento com cardinalidade 1:N ou N:1, o atributo que identifica

o lado 1 deve aparecer no lado N, para que haja o relacionamento. No Exemplo, uma

Classificação pode não ter Cliente relacionado, pode ter 1 ou pode ter muitos, mas um

Cliente pode ter somente uma Classificação.

Cardinalidade N:N uma instância da entidade A se relaciona com nenhuma,

uma ou muitas instâncias da entidade B e vice-versa. Exemplo: As entidades Cliente e

Produto, possuem um relacionamento com cardinalidade N:N porque 1 Cliente pode

comprar muitos Produtos e 1 Produto pode ser comprado por muitos Clientes.

Cliente ProdutoCompra1 N

N 1

N:N

Classificação1 1

N 1

N:1

ClassificaCliente1

Page 11: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 1

www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218

9

1

Peça

Forma

N 1

N:N

1

N

Em um relacionamento com cardinalidade N:N não há como colocar o atributo

identificador de uma entidade na outra. Por exemplo, não podemos colocar o código

do Cliente na entidade Produto, porque um Produto pode ser comprado por N Clientes.

Da mesma forma não podemos colocar o código do produto no Cliente, porque um

Cliente pode comprar N Produtos.

Assim, um relacionamento com cardinalidade N:N precisa de uma entidade

associativa, que possa receber os atributos identificadores de ambas entidades.

Porém, no DER, não representamos essas entidades associativas, deixando a

cardinalidade N:N. Essa entidade associativa aparecerá no Modelo Lógico.

Indica o número de entidades que participam de um relacionamento.

Relacionamento Unário: Também conhecido como auto-relacionamento. É

quando existe relacionamento entre apenas uma entidade. Por exemplo, uma Peça é

formada por nenhuma, uma ou muitas outras Peças.

Teoria Grau do relacionamento

Page 12: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 1

www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218

10

Relacionamento Binário: É quando existe relacionamento entre apenas duas

entidades. Por exemplo, um Fornecedor comercializa Materiais que são utilizados em

diversos Projetos. Observe que temos 3 entidades e dois relacionamentos com grau 2

(binário).

Fornecedor Material1 N

N 1

N:N

Comercializa

Utiliza

1

N

N

1

N:N

Projeto

Page 13: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 1

www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218

11

1Relacionamento Ternário: É quando existe relacionamento entre três

entidades. Por exemplo, um Fornecedor comercializa Materiais que são utilizados em

Projetos específicos. Observe que temos 3 entidades e apenas 1 relacionamento com

grau 3 (ternário).

Fornecedor Material

N

N:NUtiliza

N

Projeto

1

1N 1

N:N

N:N

Page 14: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 1

www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218

12

a) Uma Pizzaria precisa de um DER para

organizar seus dados. Foram identificadas as

seguintes entidades e atributos básicos:

Pedido – Número Pedido, Data e hora do Pedido.

Cliente – Código Cliente, Nome Cliente, Endereço Cliente, Telefone Cliente

Produto – Código do Produto, Descrição do Produto, Qtde. Estoque Produto

Entregador – Código Entregador, Nome Entregador, Alcunha Entregador

Histórico – Código Histórico, Texto Histórico, Data Criação Histórico, Data

Última Alteração Histórico

Tabela de Preço – Número Preço, Data Início Preço, Preço

As seguintes regras devem ser observadas:

Um cliente pode fazer muitos pedidos ao longo do tempo, porém um pedido

pertence a um só cliente.

Um entregador pode entregar muitos pedidos, porém um pedido só pode ser

entregue por um entregador.

Um pedido pode ter muitos produtos e um produto ser solicitado em muitos

pedidos.

Um Cliente possui um histórico e cada histórico é de apenas um cliente.

Um produto pode ter seu preço alterado várias vezes ao longo do tempo, mas

cada preço é de apenas um produto.

Atividade Trabalho em dupla

Page 15: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 1

www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218

13

1

Page 16: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 1

www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218

14

É uma visão mais detalhada do modelo de dados. Deriva do modelo conceitual,

possui entidades associativas em lugar de relacionamentos N:N e aglutina as

entidades com relacionamento 1:1 (aglutina o opcional no obrigatório e elimina a

chave primária do opcional), apresenta apenas relacionamentos 1:N e N:1, adequação

ao padrão de nomenclatura para entidades e atributos que devem ser bem

documentados em um dicionário de dados.

Vamos fazer algumas definições:

Chave Primária (PK = Primary Key) é o atributo ou agrupamento de atributos

(concatenação) que identifica de forma única cada ocorrência de instância da entidade.

Por exemplo codprod (código do produto), numnf (número da nota fiscal), etc

Chave Candidata é o atributo ou agrupamento de atributos que, não sendo

chave primária, também identifica de forma única uma ocorrência da instância da

entidade. Também é conhecida como chave alternativa. Por Exemplo: cpfcli (CPF do

Cliente), cnpjemp (CNPJ da Empresa), etc.

Chave Estrangeira (FK = Foreign Key) é o atributo ou agrupamento de

atributos que formam a chave primária de uma entidade em outra entidade, com a qual

faz relacionamento. Por exemplo, o codcli (código do cliente na entidade nota fiscal), o

codprod (código do produto na entidade item da nota fiscal), etc Em geral a chave

estrangeira mantem o mesmo nome da chave primaria de onde se originalizou.

Teoria Modelo lógico de dados

Lógica?

É comigo

Mesmo!

Page 17: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 1

www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218

15

1

É a representação do modelo lógico de dados. Neste modelo utilizamos os

seguintes símbolos:

TeoriaMer – modelo

entidade - relacionamento

Entidade

Nenhum (cardinalidade mínima)

Um

Nenhum ou um

Muitos (cardinalidade máxima)

Nenhum ou muitos

Um ou muitos

Nenhum, um ou muitos

Eu pedi umrabo de galo!

Page 18: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 1

www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218

16

Exemplo de M.E.R. (Modelo Entidade Relacionamento)

Neste MER podemos concluir que pode haver clientes para o qual nenhuma

venda foi feita. Isso significa que a empresa faz um cadastro de clientes em potencial.

Há também produtos que ainda não foram vendidos e que toda venda possui no

mínimo 1 item vendido.

Os atributos de cada entidade são relacionados em uma planilha, suas chaves

primária (PK) e estrangeira (FK) são identificadas e algumas instâncias são colocadas

para verificar se há coerência com o modelo. Para o nosso exemplo temos:

tabcliente

codcli (PK) Nomecli enderecocli cpfcli telefonecli

0001 ANTONIA MARIA ROSA RUA DAS FLORES, 123 23244454378 49993433

0002 MARCOS VASCONVELOS RUA DAS OLIVEIRAS, 45 23456578733 44335566

0003 JOAQUIM JOSE RUA DAS GOIABEIRAS, 432 32145398745 32226778

0004 JOANA DA ARCA RUA DAS FIGUEIRAS, 12 21234589755 43346656

tabproduto

codprod (PK) descprod precovenda qtdeestoque

0001 PARAFUSO SEXTAVADO 3/4 12.32 1230

0002 PORCA DE ACO NUMERO 12 10.15 230

0003 MARTELO 1,5 KG 35.78 23

0004 ALICATE UNIVERSAL 43.54 49

tabvenda

numvenda (PK) datavenda codcli (FK)

00001 20/05/2009 0002

00002 12/06/2009 0002

00003 30/10/2009 0001

tabcliente

codcli (PK)nomeclienderecoclicpfclitelefonecli

tabvenda

numvenda (PK)datavendacodcli (FK)

tabitemvenda

numitem(PK)numvenda (FK)qtdeitemcodprod (FK)

tabproduto

codprod (PK)descprodprecovendaqtdeestoque

Page 19: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 1

www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218

17

1

Sempre que no D.E.R. for definido um relacionamento com cardinalidade N:N,

deveremos substituí-lo por uma entidade associativa. O procedimento para isto é o

seguinte:

1º) desenhar as entidades com cardinalidade N:N e representá-las com os

símbolos do M.E.R. conforme a imagem à esquerda.

2º) colocar a entidade associativa entre elas e o N que estava nas pontas vai

para o meio invertendo a ordem: o de baixo sobe e o de cima desce.

TABVENDA TABVENDA

TABITEMVENDA

TABPRODUTOTABPRODUTO

Simplesassim ?

Page 20: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 1

www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218

18

Ao se montar uma chave primária de uma entidade associativa, temos três

opções, podemos usar um NSU (Número Sequencial Único) ou uma chave

concatenada (FK+NSU ou FK+FK).

1. NSU

Uma NSU é um número natural, começando de 1 e sempre acrescido de 1 a

cada nova linha (tupla) da tabela. No exemplo acima foi usada uma NSU para a chave

primária de todas as entidades (tabelas).

2. FK+NSU

Na chave primária concatenada, a entidade tabitemvenda recebe o atributo

numvenda como chave estrangeira, concatenada ao numitem para formar uma chave

primária concatenada, como mostra a tabela abaixo:

tabitemvenda

(numvenda (FK) + numitem) (PK) qtdeitem codprod (FK)

0000100001 3 0004

0000100002 2 0002

0000100003 3 0001

0000200001 5 0001

0000300001 4 0001

0000300002 1 0004

Observe que o numvenda se repete e o numitem recomeça em 1 para cada

novo item, mas concatenados não ocorre repetição, sendo uma chave primária válida.

tabitemvenda

numitem (PK) numvenda (FK) qtdeitem codprod (FK)

00001 00001 3 0004

00002 00001 2 0002

00003 00001 3 0001

00004 00002 5 0001

00005 00003 4 0001

00006 00003 1 0004

Page 21: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 1

www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218

19

13. FK+FK

Outra forma de montar uma chave primária concatenada é unir numvenda com

o codprod, como mostra a tabela abaixo.

tabitemvenda

(numvenda (FK) + codprod(FK)) (PK) qtdeitem

0000100004 3

0000100002 2

0000100001 3

0000200001 5

0000300001 4

0000300004 1

Page 22: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 1

www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218

20

Uma Pizzaria precisa de um MER para organizar

seus dados. Foram identificadas as seguintes entidades e

atributos básicos:

Pedido – Número Pedido, Data e hora do Pedido.

Cliente – Código Cliente, Nome Cliente, Endereço Cliente, Telefone Cliente

Produto – Código do Produto, Descrição do Produto, Qtde. Estoque Produto

Entregador – Código Entregador, Nome Entregador, Alcunha Entregador

Histórico – Código Histórico, Texto Histórico, Data Criação Histórico, Data

Última Alteração Histórico

Tabela de Preço – Número Preço, Data Início Preço, Preço

As seguintes regras devem ser observadas:

Um cliente pode fazer muitos pedidos ao longo do tempo, porém um pedido

pertence a um só cliente.

Um entregador pode entregar muitos pedidos, porém um pedido só pode ser

entregue por um entregador.

Um pedido pode ter muitos produtos e um produto ser solicitado em muitos

pedidos.

Um Cliente possui um histórico e cada histórico é de apenas um cliente.

Um produto pode ter seu preço alterado várias vezes ao longo do tempo, mas

cada preço é de apenas um produto.

Atividade Trabalho em dupla

Page 23: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 1

www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218

21

1

Page 24: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 1

www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218

22

Faça tabelas, com instâncias dos atributos para verificar se a modelagem está

correta.

CL

IEN

TE

PR

OD

UT

O

EN

TR

EG

AD

OR

Page 25: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 1

www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218

23

1PRECO

PEDIDO

ITEM

Page 26: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 1

www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218

24

O Modelo Físico já traz detalhes da implementação física desses dados no

SGBD escolhido, tais como o tipo de dado, seu tamanho e domínio.

Domínio – são os possíveis valores de um atributo. Por exemplo: o atributo

alturaaluno tem como domínio os valores de 0 a 3 metros. Para garantir que o atributo

tenha os valores definidos no Domínio escrevemos restrições (constraints), por

exemplo: alturaaluno> 0 andalturaaluno< 3

O nome da Entidade e de seus atributos deve seguir as regras de nomeação

do SGBD, não podendo ter espaço em branco, letras acentuadas, hífem e cedilha em

sua formação.

Segue abaixo o modelo físico da entidade Produto:

Produto

ATRIBUTO TIPO UNICIDADE PREENCHIMENTO RESTRICAO

CODPROD CHAR(4) UNIQUE NOT NULL

DESCPROD VARCHAR(40) NOT NULL

PRECOVENDA DECIMAL (8,2) > 0

QTDEESTOQUE SMALLINT >= 0

Teoria modelo físico de dados

Físico?

É comigo

Mesmo!

Page 27: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 1

www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218

25

1

Um Lava-Rápido precisa de um DER para

organizar seus dados. Foram identificadas as seguintes

entidades e atributos básicos:

Ordem de Serviço – Número OS, Data e hora OS

Veículo – Placa veículo, modelo veículo, Cor veículo, Ano veículo

Cliente – Código Cliente, Nome Cliente, Endereço Cliente, Telefone Cliente

Serviço – Código Serviço, Descrição Serviço

Funcionário – Código Funcionário, Nome Funcionário

Tabela de Preço – Número Preço, Data Início Preço, Preço

Fotografia do Veículo– Número da Fotografia, Data Fotografia, Imagem

Fotografia

As seguintes regras devem ser observadas:

Um cliente pode solicitar muitas OS, mas cada OS é de apenas 1 cliente.

Uma OS atua sobre apenas um veículo, mas um veículo pode ter muitas OS.

Uma OS pode executar muitos serviços e um serviço pode ser solicitado por

muitas OS.

Um funcionário participa de muitas OS e uma OS pode ter a participação de

muitos funcionários.

Um serviço pode ter seu preço alterado várias vezes ao longo do tempo, mas

cada preço é de apenas um serviço.

Um veículo pode ter nenhuma ou uma fotografia, mas uma fotografia exibe

apenas um veículo.

Practice

Atividade Trabalho em dupla

Page 28: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 1

www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218

26

Page 29: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 1

www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218

27

1

Um Lava-Rápido precisa de um MER para

organizar seus dados. Foram identificadas as seguintes

entidades e atributos básicos:

Ordem de Serviço – Número OS, Data e hora OS

Veículo – Placa veículo, modelo veículo, Cor veículo, Ano veículo

Cliente – Código Cliente, Nome Cliente, Endereço Cliente, Telefone Cliente

Serviço – Código Serviço, Descrição Serviço

Funcionário – Código Funcionário, Nome Funcionário

Tabela de Preço – Número Preço, Data Início Preço, Preço

Fotografia do Veículo– Número da Fotografia, Data Fotografia, Imagem

Fotografia

As seguintes regras devem ser observadas:

Um cliente pode solicitar muitas OS, mas cada OS é de apenas 1 cliente.

Uma OS atua sobre apenas um veículo, mas um veículo pode ter muitas OS.

Uma OS pode executar muitos serviços e um serviço pode ser solicitado por

muitas OS.

Um funcionário participa de muitas OS e uma OS pode ter a participação de

muitos funcionários.

Um serviço pode ter seu preço alterado várias vezes ao longo do tempo, mas

cada preço é de apenas um serviço.

Um veículo pode ter nenhuma ou uma fotografia, mas uma fotografia exibe

apenas um veículo.

Atividade Trabalho em dupla

Page 30: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 1

www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218

28

Vai

um

M

ER a

í?

Page 31: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 1

www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218

29

1Faça tabelas, com instâncias dos atributos para verificar se a modelagem está

correta.

VEICULO

CLIENTE

SERVICO

FUNCIONARIO

OS

Page 32: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 1

www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218

30

FUNCOS

SERVOS

PRECO

TÁ MEIO

APERTADO!

Page 33: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 1

www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218

31

1

Dado o DER abaixo, representando a camada de

dados de um sistema de informação de uma loja de som

automotivo, referente a uma loja que vende e/ou instala

som automotivo, fazer o MER. Determine as chaves

primárias, estrangeiras e se necessário, represente as

entidades associativas.

Performance

Atividade Trabalho em dupla

tabforpag tabvendaPaga1 N

N 1

N:N

Gera tabclienteN

1

1

1

N:1

tabprodutotabfornectabservico

vende

Fornece

Vende

1 N

N 1

N:NN:N

1 N

N 1

1

N

N

1

N:N

Page 34: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 1

www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218

32

Page 35: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 1

www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218

33

1Faça tabelas, com instâncias dos atributos para verificar se a modelagem está

correta.

TABCLIENTE

TABSERVICO

TABPRODUTO

TABFORNEC

TABFORPAG

Page 36: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 1

www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218

34

TABVENDA

TABPAGAMENTO

TABFORNECIMENTO

TABPRODVENDIDO

TABSERVVENDIDO

Page 37: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 1

www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218

35

1

Page 38: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 1

www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218

36

Avaliação Então...Como foi ?!?

Estou fera!

Fiz Certo!

Muito Bom Bom regular ruim Muito ruim

Page 39: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte

Matemático britânico, esteve envolvido com o trabalho deCodd no desenvolvimento do modelo relacional. Seu livro“Introdução a Sistemas de Banco de Dados” é amplamentereconhecido como texto fundamental para a área.

Christopher J. Date 1941 – (72)

Page 40: Grande Porte - COBOL Level 2 - Versão 2.2.3

Versão 2.2.3a

Page 41: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 2

www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218

3

2

Antes de iniciarmos, vamos conversar sobre os tópicos apresentados na capa desta parte. Isso é importante para que seu instrutor e seus colegas saibam como está seu conhecimento sobre o assunto e se você precisa ou pode fornecer ajuda aos colegas e instrutor.

O que você já sabe?

O que você não sabe?

Porque é importante conhecer estes tópicos?

Quais são os seus temores?

O que você considera difícil?

Depois de falar sobre o assunto com seus colegas e instrutor, escreva,

desenhe, rabisque, diga algo sobre o que você vai fazer para dominar esses tópicos.Comprometa-se!

Preparation

Trocando Ideias É agora que você fala !!

Reflexão É aqui que você se compromete !!

Page 42: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 2

www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218

4

Existe outra forma de modelar os dados, é só seguir as NORMAS. Codd, Date

e Boyce contribuíram muito para o desenvolvimento de um conjunto de regras que

auxiliam na modelagem.

O objetivo primeiro da modelagem é a economia de disco, evitando a

redundância dos dados, mas atualmente com o preço do Gigabyte abaixo de R$ 0,10

e usuários cada vez mais impacientes, o foco mudou para performance.

Mesmo assim, é fundamental saber modelar usando essas regras para depois,

racionalmente, colocar redundância de dados, objetivando uma maior performance.

A XPTO consultoria em desenvolvimento de software conta com você para

perpetuar sua fama de ter os modelos de dados mais bem equilibrados entre

economia e performance.

Presentation

História Normas e mais normas

Page 43: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 2

www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218

5

2

Após o levantamento dos dados (atributos) que darão suporte aos negócios de

um empreendimento é preciso organizá-los em entidades e relacioná-las entre si.

Para que se evite ao máximo a redundância de dados, ou seja, ter os mesmos

dados repetidos em várias entidades, foi elaborado por Edgar Frank Codd (matemático

britânico) um conjunto de regras, que passou a ser conhecido como Normalização,

que uma vez seguidas, eliminam essa redundância de dados.

A motivação para a criação da Normalização foi a baixa capacidade de

armazenamento das primeiras unidades de disco, como mostra a figura abaixo.

Esse conjunto de regras é denominado Formas Normais. Embora existam 7

formas normais, na maioria dos casos apenas as 3 primeiras, propostas originalmente

por Codd em 1970 são usadas.

Teoria Normalização

Disco IBM 350Apresentado em 13/09/1956

Pilha de 40 discos de 24 polegadas

Capacidade 4,4 Megabytes

Aluguel de US$ 35.000,00

Edgar Frank Codd 23/08/1923 18/04/2003

Page 44: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 2

www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218

6

Para aplicarmos as formas normais, precisamos de um agrupamento de dados

não normalizado. Como exemplo, vamos pegar alguns dados (atributos) de uma Nota

Fiscal, colocá-las em uma tabela e definir instâncias para as linhas (tuplas).

Neste exemplo, temos uma entidade com

18 atributos, trata-se de uma Nota Fiscal (com

dados básicos) onde foram vendidos 3 produtos

para um mesmo Cliente e transportados pela

mesma Transportadora. Agora vamos aplicar as

regras de normalização à esse agrupamento de

dados não normalizado.

Eu sou a Norma!

Tenho algumas

normas para

você...

TUPLA ?

Você não

quis dizer

SUPLA !

Atributos Instância 1 Instância 2 Instância 3

Número NF 1025 1025 1025

Data Emissão NF 25/10/2009 25/10/2009 25/10/2009

CNPJ Cliente 09.154.125/0001-10 09.154.125/0001-10 09.154.125/0001-10

Razão Social Cliente Chamex Inc Paper Chamex Inc Paper Chamex Inc Paper

Endereço Cliente Rua Davila, 34 - Centro - SP Rua Davila, 34 - Centro - SP Rua Davila, 34 - Centro - SP

Telefone Cliente 11-3221-8844 11-3221-8844 11-3221-8844

CNPJ Transportadora 07.458.478/0001-58 07.458.478/0001-58 07.458.478/0001-58

Razão Social Transportadora Zaz Traz Transportes Zaz Traz Transportes Zaz Traz Transportes

Endereço Transportadora Av. Angela, 22 - Centro - SBC Av. Angela, 22 - Centro - SBC Av. Angela, 22 - Centro - SBC

Telefone Transportadora 11-4432-8844 11-4432-8844 11-4432-8844

Número Item NF 1 2 3

Codigo Produto 1232 3221 8776

Descrição Produto Scanner HP Super Computador Básico Impressora Jato Tinta HP

Preço Unitário Produto 450,13 1250,21 333,13

Qtd. Estoque 200 80 127

Qtd. Item NF 5 12 3

Valor total do Item NF 2250,65 15002,52 999,39

Valor total da NF 18252,56 18252,56 18252,56

Page 45: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 2

www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218

7

2

Um agrupamento de dados está na 1FN se não possuir dados em

repetição (ocorrência).

Observe que no exemplo acima, os dados em destaque (cinza) são digitados

repetidamente, para cada novo item da Nota Fiscal. Para que fiquem na 1FN, será

necessário dividir o agrupamento de dados em duas entidades, Nota Fiscal e Item

Nota Fiscal, como mostra a tabela abaixo:

Foram definidas as chaves primárias e estrangeiras das entidades e os dados

da Nota Fiscal agora só aparecem uma vez, pois estão relacionados pela chave

estrangeira Numero NF na entidade Item Nota Fiscal.

TeoriaPrimeira formanormal (1fn)

“Uma relação de variáveis está

em 1FN, se e somente se, em

todo valor válido dessa relação

de variáveis, cada tupla contém

exatamente um valor para cada

atributo”

C. J. Date

Nota Fiscal

Número NF (PK) 1025

Data Emissão NF 25/10/2009

CNPJ Cliente 09.154.125/0001-10

Razão Social Cliente Chamex Inc Paper

Endereço Cliente Rua Davila, 34 - Centro - SP

Telefone Cliente 11-3221-8844

CNPJ Transportadora 07.458.478/0001-58

Razão Social Transportadora Zaz Traz Transportes

Endereço Transportadora Av. Angela, 22 - Centro - SBC

Telefone Transportadora 11-4432-8844

Valor total da NF 18252,56

Item Nota Fiscal

Número Item NF (PK) 1 2 3

Número NF (FK) 1025 1025 1025

Codigo Produto 1232 3221 8776

Descrição Produto Scanner HP Super Computador Básico Impressora Jato Tinta HP

Preço Unitário Produto 450,13 1250,21 333,13

Qtd. Estoque 200 80 127

Qtd. Item NF 5 12 3

Valor total do Item NF 2250,65 15002,52 999,39

Norma

número um!

Page 46: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 2

www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218

8

Um agrupamento de dados está na 2FN se estiver na 1FN e todo atributo

não chave depender funcionalmente da chave primária.

O atributo B depende funcionalmente do atributo A, indica-se AB, se quando

se muda o valor de A, também muda o valor de B. Por exemplo, A Descrição do

Produto depende funcionalmente do Código do Produto, pois toda vez que o Código

do Produto muda, muda também a Descrição do Produto, pois se trata de outro

Produto.

Vamos analisar essas duas entidades e colocar setas a partir dos atributos não

chave em direção ao atributo que dependam funcionalmente.

Teoriasegunda formanormal (2fn)

Nota Fiscal

Número NF (PK) 1025

Data Emissão NF 25/10/2009

CNPJ Cliente 09.154.125/0001-10

Razão Social Cliente Chamex Inc Paper

Endereço Cliente Rua Davila, 34 - Centro - SP

Telefone Cliente 11-3221-8844

CNPJ Transportadora 07.458.478/0001-58

Razão Social Transportadora Zaz Traz Transportes

Endereço Transportadora Av. Angela, 22 - Centro - SBC

Telefone Transportadora 11-4432-8844

Valor total da NF 18252,56

Item Nota Fiscal

Número Item NF (PK) 1

Número NF (FK) 1025

Codigo Produto 1232

Descrição Produto Scanner HP Super

Preço Unitário Produto 450,13

Qtd. Estoque 200

Qtd. Item NF 5

Valor total do Item NF 2250,65

Page 47: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 2

www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218

9

2

Norma

número dois!

Foram localizados atributos que dependem funcionalmente de outros atributos

não chaves. Esses atributos não chave irão formar outras entidades. O atributo da

qual eles dependem funcionalmente será a chave primária dessa nova entidade e

chave estrangeirana entidade original. As novas entidades criadas são Cliente,

Transportadora e Produto. Após a aplicação da 2FN temos:

“Uma relação de variáveis está

em 2FN, se e somente se, está

em 1FN e todo atributo não

chave é irredutivelmente

dependente da chave primária”

C. J. Date

Nota Fiscal

Número NF (PK) 1025

Data Emissão NF 25/10/2009

CNPJ Cliente (FK) 09.154.125/0001-10

CNPJ Transportadora (FK) 07.458.478/0001-58

Valor total da NF 18252,56

Item Nota Fiscal

Número Item NF (PK) 1 2 3

Número NF (FK) 1025 1025 1025

Codigo Produto (FK) 1232 3221 8776

Qtd. Item NF 5 12 3

Valor total do Item NF 2250,65 15002,52 3075,00

Page 48: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 2

www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218

10

Um agrupamento de dados está na 3FN se estiver na 2FN e os atributos

que não são chave não podem depender de forma transitiva de outro atributo

que também não é chave.

O atributo Valor total do Item NF é calculado como sendo o produto entre os

atributos Qtd. Item NF e Preço Unitário Produto. Temos um atributo não chave que

depende do conteúdo de outros atributos não chave. Para que o agrupamento de

dados fique na 3FN o atributo Valor total do Item NF deve ser eliminado.

A mesma regra se aplica ao atributo Valor total da NF, que é a soma dos totais

dos itens da nota fiscal. Esse atributo também deve ser eliminado. Finalmente,

utilizando a notação do MER, temos:

Teoriaterceira formanormal (3fn)

“Uma relação de variáveis está

em 3FN, se e somente se, está

em 2FN e todo atributo não

chave é dependente de forma não

transitiva da chave primária”

C. J. Date

Cliente

CNPJ Cliente (PK)

Razão Social Cliente

Endereço Cliente

Telefone Cliente

Nota Fiscal

Número NF (PK)

Data Emissão NF

CNPJ Cliente (FK)

CNPJ Transportadora (FK)

Item Nota Fiscal

Número Item NF (PK)

Número NF (FK)

Codigo Produto (FK)

Qtd. Item NF

Transportadora

CNPJ Transportadora (PK)

Razão Social Transportadora

Endereço Transportadora

Telefone Transportadora

Produto

Codigo Produto (PK)

Descrição Produto

Preço Unitário Produto

Qtd. Estoque

E essa

é a Norma

número três!

Page 49: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 2

www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218

11

2

O objetivo primeiro da Normalização é a economia de espaço em disco. Isso é

obtido com a criação de mais entidades e o uso abundante de entidades associativas.

O problema da Normalização Extrema é que para se obter informações dos

modelos de dados, é necessário buscar esses dados em diversas entidades o que

impacta a performance das consultas.

Nos últimos anos, temos visto uma crescente diminuição de custo dos

dispositivos de armazenamento de massa (HDs, SSDs, etc), e também um crescente

aumento na velocidade com que o usuário quer o resultado de sua consulta, o que nos

faz refletir sobre até onde vale a pena Normalizar, e o que vale a pena redundar.

A figura abaixo mostra que é necessário encontrar um ponto de equilíbrio entre

a Normalização extrema e a redundância total. Este ponto de equilíbrio varia em cada

caso, cabendo ao analista de sistemas e o DBA localizá-lo.

Teoria O impacto da normalização

Economia

do espaco

em discoGanho de

Performance

Normalizar

Desnormalizar

,

Page 50: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 2

www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218

12

Normalizar os agrupamentos de dados abaixo,

desenhando um MER com as entidades, relacionamentos,

atributos e chaves.

1) Ordem de Compra (código ordem de compra, data de emissão, código do fornecedor, nome do fornecedor, endereço do fornecedor, valor total da ordem). Cada ordem de compra possui um ou vários itens com os seguintes atributos: número item de compra, código do material, descrição do material, quantidade comprada, valor unitário e valor total do item.

Practice

Atividade Trabalho em dupla

Page 51: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 2

www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218

13

2

2) Empregado (Número do Empregado, Nome do Empregado, Número do Departamento, Nome do Departamento, Número do Gerente, Nome do Gerente, Número do Projeto, Nome do Projeto, Data de Início do Projeto, Data de Término do Projeto, Número de horas trabalhadas no projeto). Vale a pena notar que o gerente é um empregado.

Page 52: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 2

www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218

14

Normalizar os agrupamentos de dados abaixo,

desenhando um MER com as entidades,

relacionamentos, atributos e chaves, depois peça para

que seu colega corrija.

3) Notas Fiscais (Número NF, Série, Data emissão, Código Cliente, Nome cliente, Endereço cliente, CNPJ cliente, Código Mercadoria, Descrição Mercadoria, Quantidade vendida, Preço de venda, Total da venda da Mercadoria e Total Geral da Nota). Cada nota pode ter mais do que uma mercadoria. O número da nota fiscal recomeça em 1 para cada série da nota fiscal.

Atividade Revisão aos pares

Page 53: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 2

www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218

15

2

4) Inscrição (Código do Aluno, Nome do Aluno, Telefone para contato, Ano de Admissão no curso, Código da Disciplina, Nome da Disciplina, Código do Curso, Nome do Curso, Data da Matricula na Disciplina). O aluno escolhe qual disciplina, pertencente ao curso, quer cursar.

Page 54: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 2

www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218

16

Normalizar os agrupamentos de dados abaixo,

desenhando um MER com as entidades, relacionamentos,

atributos e chaves, utilize um flip-chart, apresente aos

colegas e anote o melhor entre eles.

5) Paciente (número do paciente, nome do paciente, número do quarto, descrição do quarto, número de cômodos no quarto, número da cama). Médico (código do médico, nome do médico, fone do médico).

Atividade Flip chart

Page 55: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 2

www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218

17

2

A biblioteca de uma universidade empresta livros

para seus alunos regularmente matriculados. Foram

coletadas as seguintes informações com a bibliotecária.

1 livro tem 1 ou N autores

1 autor pode escrever 1 ou N livros

1 assunto pode aparecer em 1 ou muitos livros

1 livro pode ter 1 ou N exemplares

1 exemplar é sempre de 1 livro

Os exemplares são emprestados aos alunos. Cada exemplar possui um

número de identificação único, chamado TOMBO

O prazo de empréstimo é sempre de uma semana, podendo ser renovado,

desde que o livro não esteja reservado por outro aluno

Um aluno pode reservar 1 ou N livros

Para cada dia de atraso na devolução de um exemplar é cobrada uma multa de

um determinado valor

Alunos em atraso não podem pegar novos empréstimos

Fazer um MER para atender as necessidades desse sistema

Performance

Atividade Trabalho em dupla

Page 56: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 2

www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218

18

Lembre-se

Das três

Normas

Page 57: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 2

www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218

19

2

Page 58: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 2

www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218

20

Avaliação Então...Como foi ?!?

Estou fera!

Fiz Certo!

Muito Bom Bom regular ruim Muito ruim

Page 59: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte

O nome DB2 foi dado para o Sistema de Gerenciamentode Banco de Dados que a IBM lançou em 1983 baseado emSQL/DS para seu mainframe. A principio o produto foichamado System R que fora iniciado em 1978. O projeto DB2

começou no inicio dos anos 70 quando Edgar Frank Codd,trabalhando para IBM descreveu a teoria dos Banco de dadosRelacionais e publicou sua teoria em Junho de 1970.

Page 60: Grande Porte - COBOL Level 2 - Versão 2.2.3

Versão 2.2.3a

Page 61: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 3

www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218

3

3

Antes de iniciarmos, vamos conversar sobre os tópicos apresentados na capa desta parte. Isso é importante para que seu instrutor e seus colegas saibam como está seu conhecimento sobre o assunto e se você precisa ou pode fornecer ajuda aos colegas e instrutor.

O que você já sabe?

O que você não sabe?

Porque é importante conhecer estes tópicos?

Quais são os seus temores?

O que você considera difícil?

Depois de falar sobre o assunto com seus colegas e instrutor, escreva,

desenhe, rabisque, diga algo sobre o que você vai fazer para dominar esses tópicos.Comprometa-se!

Preparation

Trocando Ideias É agora que você fala !!

Reflexão É aqui que você se compromete !!

Page 62: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 3

www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218

4

Vamos para a Parte Prática do nosso curso de COBOL Level 2. Você começará

a usar o DB2 a princípio de forma interativa, depois via programa COBOL.

Para poder usar o DB2 em seu Hércules, você precisará se logar no TSO

usando a Procedure IKJJANIN e na tela do OS/390, você precisará subir o DB2 com o

seguinte comando:

-DB2N START DB2

Pratique bastante não só aqui na Grande Porte, mas também no conforto de

seu lar. Lembre-se que a prática leva à perfeição.

Consegue ver

o hífen do início?

Presentation

História Mão na massa!!

Page 63: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 3

www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218

5

3

O DB2 é um Sistema Gerenciador de Banco de Dados (SGBD) ou Data Base

Management System (DBMS) relacional da IBM. O DB2 é a nova tecnologia,

enquanto VSAM é a velha.

O VSAM (que é a sigla para Virtual Storage Access Method) é somente um

método de acesso à dados. Nele você pode ler um arquivo VSAM no método

sequencial (sequential mode) registro por registro, fazer acesso randômico (random

access), saltar (pular) diretamente para um registro em particular. O Skip-sequential

(salto-sequencial) é o melhor dos dois mundos, você pula para o 1º registro desejado,

e então comeca a leitura sequencial dos registros subsequentes um por um.

O DB2 é um pacote de software completo, que permite criar, armazenar,

atualizar e recuperar dados de forma sistemática. Suas características são:

a) Abstração de dados. Ele apresenta uma visão lógica e estruturada dos

dados para o usuário. O usuário não precisa se preocupar sobre os detalhes de

como os dados estão fisicamente armazenados no disco (DASD).

b) Independência dos dados. O DB2 provê uma camada de

independência entre a aplicação ou programa COBOL e os dados. Toda vez que a

estrutura dos dados muda (como adicionar uma nova coluna na tabela

Empregado) você não precisa reescrever o programa COBOL. Essa

independência dos dados é conhecida como arquitetura em duas camadas

(TwoTiers).

c) Segurança dos dados. O DB2 controla o acesso aos dados. Nem todo

mundo pode ver todos os dados. Você pode vê-los somente se obter todos os

privilégios necessários.

d) Gerenciamento de transações e concorrência. O DB2 gerencia todas

as transações e garante que os dados permaneçam consistentes. Ele provê um

mecanismo de travamento, para acesso concorrente aos dados, ou seja, enquanto

uma transação está usando um determinado dado, nenhuma outra tem acesso a

ele.

e) Recuperação de dados. Quando ocorrem “crashes” (erros físicos no

disco) o DB2 permite que você recupere e restaure rapidamente os dados originais.

Teoria Introdução ao db2

Page 64: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 3

www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218

6

STORAGE GROUP (Grupo de Armazenamento)

É um conjunto de volumes (discos) que o DB2 utiliza para criar os Tablespaces

e os Índices. Os discos devem ter o mesmo DeviceType (3390). Fisicamente o DB2

utiliza arquivos VSAM. O DB2 fica responsável pelo gerenciamento do espaço alocado.

Ele é quem emite os comandos de DELETE/DEFINE CLUSTER. Os discos de um

STORAGE GROUP novo precisam ser dedicados ao DB2.

DATA BASE (Banco de Dados)

É um conjunto de Tablespaces, agrupados segundo critérios do DBA, por uma

questão de organização.

TABLESPACE (Espaço de Tabela)

É um Dataset físico VSAM LDS (Linear Data Set) que armazena linhas de uma

ou mais tabelas. Cada Tablespace consiste de um número de páginas. Suas páginas

podem ter o tamanho de 4K, 8K, 16K ou 32K. Uma linha de tabela precisa estar toda

em uma página. O tamanho da página é o limite para o tamanho de uma linha. Há 3

tipos de Tablespace:

a) Simples: As páginas de seus Datasets podem conter dados de uma ou mais

tabelas.

b) Segmentado: É dividido em segmentos (conjuntos de páginas) cada segmento

só pode conter dados de uma tabela. É a utilização recomendada pois permite

ao DB2 uma utilização melhor de espaço.

c) Particionado: Recomendado para tabelas gigantes. É dividido em partições

(Datasets VSAM). Requer um Índice Cluster com uma faixa de valores

estabelecidos para cada partição. O DB2 se baseia nesta faixa para saber em

qual partição gravar uma linha.

INDEXSPACE (Espaço de Índice)

Um indexspace é uma estrutura de armazenamento do DB2 que contém

apenas um índice. Quando você cria um índice, um indexspace é definido

automaticamente no mesmo data base da tabela que ele indexa.

Teoria Elementos do db2

Page 65: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 3

www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218

7

3

TABELAS

As TABELAS são estruturas lógicas mantidas pelo DB2 para representar uma

ENTIDADE. É formada por um conjunto de colunas. Exemplo:

Tabela FUNCIONARIOS

COLUNAS

As COLUNAS são os ATRIBUTOS da ENTIDADE. Nelas estão armazenados

os dados (instâncias) da ENTIDADE. O nome e o formato das colunas são mantidos

pelo DB2.

Tabela FUNCIONARIOS

Colunas

CODIGO

NOME

ENDERECO

DATAADMISSAO

SALARIO

LINHA

Uma LINHA é cada conjunto de valores das COLUNAS. Formam uma instância

da ENTIDADE. Exemplo:

Tabela FUNCIONARIOS

Colunas CODIGO NOME ENDERECO DATAADMISSAO SALARIO

Linha 1 000010 PEDRO ALVARES CABRAL RUA DAS FLORES, 117 01/10/2001 5600.00

Linha 2 000023 MARIA ANTONIETA RUA GUILHOTINA, 21 30/05/1987 4300.00

ÍNDICES

É uma lista ordenada de valores que apontam para os dados nas tabelas. É

utilizada para agilizar a leitura dos dados, pois realiza busca binária. Também pode ser

usada para forçar a unicidade dos dados (UNIQUE INDEX). Pode ser formado por

uma (simples) ou mais colunas (composto). Está armazenado em um VSAM LDS

conhecido como INDEXSPACE. Há 3 tipos de índices:

a) Unique: Força a unicidade dos dados

b) Normal: Permite a duplicidade dos dados

c) Cluster: Usado para manter a sequência física dos dados na Tablespace.

VIEW

É uma tabela virtual, formada por um subconjunto de uma ou mais tabelas, sua

utilização, em principio nada difere de uma tabela normal. Conforme o caso uma view

pode ser usada somente de leitura.

Page 66: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 3

www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218

8

SINÔNIMO

É um nome alternativo (apelido) para uma Tabela ou View. Uma vez criado,

sua utilização é restrita a um Auth-id.(Proprietário ou usuário).

ÁLIAS

É um nome alternativo (apelido) para uma Tabela ou View. Utilizado mais como

um nome local de uma tabela remota. Seu uso é compartilhado.

Todos esses conceitos podem ser vistos na figura abaixo:

INDEX 4

TABELA1

TABELA2

TABLESPACE A

TABELA3

TABLESPACE B

INDEX 1

INDEX 2

INDEX 3

INDEX 4

INDEX 2

INDEX 1

VIEW A

VIEW B

ÁLIAS

SINÔNIMO

VOLUME 1

VOLUME 2

VOLUME 3

TABLESPACE A

TABLESPACE B

STORAGE GROUP

INDEX 3

DATABASE X

INDEXSPACE 1

INDEXSPACE 2

INDEXSPACE 3

INDEXSPACE 4

Igualzinho

Lá em casa!

Page 67: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 3

www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218

9

3

É uma coluna ou conjunto de colunas selecionadas para identificar as linhas da

tabela. As chaves podem identificar linhas dentro da própria tabela ou linhas de outra

tabela (Foreign Keys).

O DB2 aceita os seguintes tipos de KEYs:

UNIQUE KEY

Chave que identifica de maneira unívoca uma linha da tabela. Não existe mais

de uma linha da tabela com a mesma UNIQUE KEY. A UNIQUE KEY tem as seguintes

propriedades:

deve ser não vazia (NOT NULL).

deve possuir um índice único (UNIQUE INDEX).

podem ocorrer nenhuma, uma ou muitas vezes na tabela.

PRIMARY KEY

Chave única escolhida para identificar univocamente cada linha da tabela. A

PRIMARY KEY tem as seguintes propriedades:

deve ser uma UNIQUE KEY.

pode ser formada por mais de uma coluna da tabela (chave primária composta).

podem ocorrer nenhuma ou uma vez na tabela (não é obrigatória)

PARENT KEY

É uma PRIMARY KEY ou UNIQUE KEY de uma TABELA PAI (tabela PAI é a

tabela da posição 1 na relação 1:N do MER). O valor da PARENT KEY será replicado

nas FOREIGN KEY(chave estrangeira) das tabelas relacionadas (lado N na relação

1:N).

FOREIGN KEY

É uma KEY em uma TABELA RELACIONADA (lado N na relação 1:N do MER)

que identifica uma linha da TABELA PAI. As propriedades da FOREIGN KEY são:

podem ocorrer nenhuma, uma ou muitas vezes na tabela.

podem ter conteúdo vazio (NULL) – dependendo da regra de integridade

referencial.

Teoria Tipos de chaves

Page 68: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 3

www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218

10

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.

É a regra usada para definir UNIQUE KEYS. Esta regra define que uma ou

mais colunas (KEYS), da tabela não podem repetir valores.

INTEGRIDADE DE VALORES (CHECK CONSTRAINTS)

Esta regra define valores permitidos para colunas de uma tabela.

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 PAI. A INTEGRIDADE REFERENCIAL deve ser definida na criação da tabela.

O DB2 testa a INTEGRIDADE REFERENCIAL nos comandos de inclusão

(INSERT), alteração (UPDATE) e exclusão (DELETE) dos programas conforme

abaixo:

a) 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.

b) 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.

Teoria Regras de Integridade

Page 69: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 3

www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218

11

3

c) INTEGRIDADE NA EXCLUSÃO.

A exclusão de linhas com FOREIGN KEY não tem restrição, mas 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.

Page 70: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 3

www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218

12

Os formatos dos dados nas colunas de uma tabela DB2 se dividem em 3

grandes grupos:

STRING

NUMERIC

DATETIME

FORMATO STRING

É o formato para armazenar caracteres. São eles:

CHAR

Define colunas de caracteres com tamanho fixo com até 255 caracteres.

Exemplo:

CODCLI CHAR(6)

VARCHAR

Define colunas de caracteres com tamanho variável. Podem conter até 32.704

caracteres, mas tamanhos acima de 255 tem restrições em alguns comandos SQL.

Exemplo:

NOMECLI VARCHAR(50)

Teoria Tipos de dados

Page 71: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 3

www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218

13

3

FORMATOS NUMÉRICOS

INTEGER

Define colunas para conter números inteiros usando 31 bits mais sinal. Uma

coluna INTEGER pode conter valores na faixa de –2.147.483.648 até +2.147.483.647.

Exemplo:

QUANTIDADE INTEGER

SMALLINT

Define colunas para conter números inteiros usando 15 bits mais sinal. Uma

coluna SMALLINT pode conter valores na faixa de –32.768 até +32.767. Exemplo:

IDADE SMALLINT

DECIMAL

O tipo DECIMAL define colunas com números reais (contendo parte inteira e

decimal). O DB2 aceita colunas DECIMAL com até 31 algarismos. Exemplo: Para

definir a coluna PRECO para 6 algarismos inteiros e 2 decimais (valores até

999999,99). Exemplo:

PRECO DECIMAL(8,2)

REAL

O tipo REAL define colunas com números no formato PONTO FLUTUANTE de

simples precisão. O DB2 usa 32 bits para este formato, e consegue controlar valores

na seguinte faixa:

Exemplo:

PESO REAL

-3,402 x 1038 -1,175 x 10-37 1,175 x 10-37 3,402 x 10380

Page 72: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 3

www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218

14

DOUBLE

O tipo DOUBLE define colunas com números no formato PONTO FLUTUANTE

de dupla precisão. O DB2 usa 64 bits para este formato, e consegue controlar valores

na seguinte faixa:

Exemplo:

MEDIDA DOUBLE

Com tantos formatos numéricos, podemos seguir os seguintes critérios para

definir o melhor tipo de dado:

a) Faixa de valores requerido

b) Tipo de composição necessária para os processamentos

c) Comparação entre números de tipos diferentes implica em

overhead necessário para a conversão e riscos maiores devido a

erros induzidos por arredondamento.

-1,79769 x 10308 -2,225 x 10-307 2,225 x 10-307 1,79769 x 103080

Vou criar meu

próprio

formato de

dado numérico.

Ops...

Page 73: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 3

www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218

15

3

FORMATOS DATETIME

Os formatos DATETIME definem formatos para armazenar datas e horas. Os

valores no formato DATETIME podem fazer parte de expressões aritméticas, isto é,

pode-se somar e subtrair duas variáveis com formato DATETIME. São 3 os tipos de

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. Exemplo:

DATANASCIMENTO DATE

TIME

O tipo TIME define uma coluna com o horário. O formato interno é um formato

binário próprio do DB2, mas o conteúdo da coluna conterá HORA, MINUTO e

SEGUNDOS.Exemplo:

HORAPARTIDA 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á ANO, MES, DIA, HORA, MINUTO, SEGUNDOS e

MICROSSEGUNDOS. Exemplo:

DATACRIACAO TIMESTAMP

Page 74: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 3

www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218

16

No DB2 as constantes alfanuméricas devem ser colocadas entre

APÓSTROFES. Exemplo:

‘JOAQUIM JOSE DA SILVA XAVIER’

As constantes numéricas são escritas sem os apóstrofes. As constantes com

decimais devem usar o ponto para separar as decimais. Exemplo:

3.14159

As constantes de DATA e HORA devem ser escritas no formato do exemplo

abaixo, entre apóstrofes. Exemplo:

‘10/30/2010’ MM/DD/AAAA formato USA

‘2010-10-30’ AAAA-MM-DD formato ISO

’30.10.2010’ DD.MM.AAAA formato EUR

‘16:35:15’ HH:MM:SS

SPECIAL REGISTERS (registradores especiais) 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 com as mais usadas:

CURRENT DATE Data do sistema operacional no formato DATE

CURRENT TIME Data do sistema operacional no formato TIME

CURRENT TIMESTAMP TIMESTAMP do sistema operacional no formato TIMESTAMP

USER Usuário do sistema no formato CHAR(8)

Teoria constantes

Teoria Special registers

Page 75: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 3

www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218

17

3

Associe as características do DB2 com suas definições

a) Abstração de dados

b) Independência dos dados

c) Segurança dos dados

d) Gerenciamento de transações e concorrência

e) Recuperação de dados

(XXXX) O DB2 controla o acesso aos dados. Nem todo mundo pode ver os dados.

Você pode vê-los somente se obter todos os privilégios necessários.

(XXXX) O DB2 prove uma camada de independência entre a aplicação ou programa

COBOL e os dados. Toda vez que a estrutura dos dados muda (como adicionar uma

nova coluna na tabela Empregado) você não precisa reescrever o programa COBOL.

Essa independência dos dados é conhecida como arquitetura em duas camadas

(TwoTiers).

(XXXX) Quando ocorrem “Crashes” (erros físicos no sistema) o DB2 permite que você

recupere e restaure rapidamente os dados originais.

(XXXX) O DB2 gerencia todas as transações e garante que os dados permaneçam

consistentes. Ele provê um mecanismo de travamento, para acesso concorrente aos

dados, ou seja, enquanto uma transação está usando um determinado dado, nenhuma

outra tem acesso a ele.

(XXXX) Ele apresenta uma visão lógica e estruturada dos dados para o usuário. O

usuário não precisa se preocupar sobre os detalhes de como os dados estão

fisicamente armazenados no disco (DASD).

Practice

Atividade Revisão aos pares

Page 76: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 3

www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218

18

Associe os elementos do DB2 com o resumo se

suas definições.

a) StorageGroup

b) Data Base

c) Tablespace

d) Tabelas

e) Colunas

f) Linha

g) Índice

h) View

i) Sinônimo

j) Alias

(XXXX) É um nome alternativo para uma tabela ou View. Seu uso é compartilhado.

(XXXX) É um subconjunto de uma ou mais tabelas. Sua utilização em principio nada

difere de uma tabela normal.

(XXXX) É um DATASET físico VSAM LDS (linear dataset) que armazena linhas de

uma ou mais tabelas. Pode ser Simples, Segmentada ou Particionada.

(XXXX) São os atributos da Entidade. Seus nomes e formatos são mantidos pelo DB2.

(XXXX) É um nome alternativo para uma Tabela ou View, com utilização restrita.

(XXXX) É um conjunto de valores das colunas, formam uma instância da entidade.

(XXXX) É um conjunto de Tablespaces e Índices, agrupados segundo critérios do DBA,

por uma questão de organização.

(XXXX) É um conjunto de volumes (Disco) que o DB2 utiliza para criar os Tablespaces

e os Índices.

(XXXX) São estruturas lógicas mantidas pelo DB2 para representar uma entidade.

(XXXX) É uma lista ordenada de valores que apontam para os dados nas Tabelas. É

usado para agilizar a leitura dos dados, pois realiza uma busca binária.

Atividade Revisão aos pares

Page 77: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 3

www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218

19

3

Localize no quadro abaixo as palavras em vermelho.

O DB2 aceita uma grande variedade de tipos de dados,

tais como STRING, NUMERIC e DATETIME. Do primeiro tipo

temos CHAR e VARCHAR, cuja principal diferença é que CHAR

armazena sempre o tamanho máximo daSTRING com espaços

à direita e o VARCHAR só armazena a STRING informada

ignorando os espaços à direita. Do segundo tipo temos

INTEGER, SMALLINT, DECIMAL, REAL, DOUBLE. Apesar de

haver vários tipos numéricos com capacidades diferentes o mais usado é o DECIMAL,

pois permite ao desenvolvedor formatar o número (casas inteiras decimais) com total

precisão. Do terceiro tipo temos DATE, TIME e TIMESTAMP. Sempre que for

importante registrar o exato momento de um acontecimento (abertura de um

chamado,entrada e saída do estacionamento, início e término de uma chamada

telefônica, etc) usamos TIMESTAMP, pois ele registra o tempo completo (ano, mês,

dia, hora, minuto, segundo e microsegundo).

Atividade Caça-palavras

S U B T R A C T S E L E C T V A L U E

P E R F O R M U N T I L V A R C H A R

I N T O I N T E G E R O W I D H C O U

C L O S E I E I O U T P U T S A L P P

X C P G M C L S M A L L I N T R O E D

R O E E P A B T O E R E A D R E S N A

E M N P I L U X T Y S 2 B D I N P U T

A M U Z C L O A W R L T E O N A B S E

L A M I C E D A D D A X A M G C D I E

X S E T C O M P U T E W H M O V E N F

C O R R E S P O N D L N G W P 3 4 G G

T O I N P U T D A T E T I M E S D S T

O T C A N C E L E N V I R O N M E N T

Page 78: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 3

www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218

20

Nomeie as chaves como UNIQUE KEY, PRIMARY KEY,

PARENT KEY ou FOREIGN KEY, preenchendo as linhas do M.E.R

abaixo.

Atividade Correndo contra o tempo

5 minutos

funcionario

codfuncnomefunccpffunccoddepto

departamento

coddeptonomedepto

chamado

numchamadodatahorachamadocodfunctextofunc

Page 79: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 3

www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218

21

3Atividade Todos juntos

Dado o MER abaixo, atribua o melhor formato e

tamanho aos diversos atributos.

Performance

cnpjcliente (PK)

razaosocialcliente

enderecocliente

telefonecliente

cliente

cnpjtransportadora(PK)

razaosocialtransportadora

enderecotransportadora

telefonetransportadora

transportadora

numeroitemnf(PK)

numeronf(FK)

codigoproduto(FK)

qtdeitemnf

itemnotafiscal

codigoproduto(PK)

descricaoproduto

precounitarioproduto

qtdeestoque

produto

numeronf(PK)

dataemissaonf

cnpjcliente(FK)

cnpjtransportadora(FK)

notafiscal

Page 80: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 3

www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218

22

Avaliação Então...Como foi ?!?

Estou fera!

Fiz Certo!

Muito Bom Bom regular ruim Muito ruim

Page 81: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte

Don Chamberlin é melhor conhecido como o co-inventor dalinguagem SQL (Structured Query Language), a linguagem debanco de dados mais utilizada no mundo. Desenvolvida em

meados de 1970 por Chamberlin e Raymond Boyce, a SQL foi aprimeira linguagem comercial de sucesso para banco de dadosrelacionais.

Donald Don Chamberlim 1944 - (68)

Page 82: Grande Porte - COBOL Level 2 - Versão 2.2.3

Versão 2.2.3

Page 83: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 4

www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218

3

4

Antes de iniciarmos, vamos conversar sobre os tópicos apresentados na capa desta parte. Isso é importante para que seu instrutor e seus colegas saibam como está seu conhecimento sobre o assunto e se você precisa ou pode fornecer ajuda aos colegas e instrutor.

O que você já sabe?

O que você não sabe?

Porque é importante conhecer estes tópicos?

Quais são os seus temores?

O que você considera difícil?

Depois de falar sobre o assunto com seus colegas e instrutor, escreva,

desenhe, rabisque, diga algo sobre o que você vai fazer para dominar esses tópicos.Comprometa-se!

Preparation

Trocando Ideias É agora que você fala !!

Reflexão É aqui que você se compromete !!

Page 84: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 4

www.grandeporte.com.br (11) 4427-4579(11) 99903-3218

4

Para dominar a linguagem SQL precisaremos construir uma infraestrutura de

algumas tabelas relacionadas, que usaremos para “brincar” de SQL.

Apesar de não ser usada por programadores, é importante conhecer a

linguagem SQL DDL, pois pode despertar seu interesse pelo cargo de DBA (Data

Base Administrator), que precisa conhecê-la a fundo.

Vamos então construir nossa casa, onde desenvolveremos nossas habilidades

em SQL DDL.

Presentation

História Construindo a casa

Page 85: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 4

www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218

5

4

A SQL (Structure Query Language ou Linguagem de Consulta Estruturada) é

uma linguagem de pesquisa declarativa para banco de dados relacional. Muitas das

características originais do SQL foram inspiradas na álgebra relacional.

A SQL foi desenvolvida originalmente em 1974 nos laboratórios da IBM em San

Jose (Califórnia) por Donald Don Chamberlin e Raymond F. Boyce, dentro do

projeto SYSTEM R, que tinha por objetivo demonstrar a viabilidade da implementação

do modelo relacional proposto por Edgard Frank Codd. O nome original da linguagem

era SEQUEL, acrônimo para StructuredEnglish Query Language (Linguagem de

Consulta Estruturada em Inglês), vindo daí o fato de, até hoje, a sigla em inglês, ser

comumente pronunciada “Síquel” ao invés de “és-kiu-él”, letra a letra. No entanto, em

português a pronuncia mais corrente é a letra a letra “ésse-quê-éle”.

A linguagem SQL é um grande padrão em uso dos Sistemas Gerenciadores de

Bancos de Dados. Isso decorre de sua simplicidade e facilidade de uso. Ela se

diferencia de outras linguagens de consulta à banco de dados no sentido em que uma

consulta SQL especifica a forma do resultado e não o caminho para chegar até ele.

Ela é uma linguagem declarativa em oposição as outras linguagens procedurais. Isto

reduz o ciclo de aprendizado daqueles que iniciam na linguagem.

Embora a SQL tenha sido originalmente criada pela IBM, rapidamente surgiram

vários dialetos desenvolvidos por outros produtores. Essa expansão levou a

necessidade de ser criado um padrão para a linguagem. Essa tarefa foi realizada pela

American National Standards Institute (ANSI) em 1986 e pelo

InternationalOrganization for Standarnization (ISO) em 1987, mas isso não impediu a

proliferação de variações e extensões produzidas pelos diferentes fabricantes de

Sistemas Gerenciadores de Bancos de Dados.

Os comandos da linguagem SQL podem ser usados em um dos modos abaixo:

SQL Interativo: Os comandos SQL são executadas diretamente em um terminal e

o resultado desses comandos são visualizados no próprio terminal. Utiliza-se um

programa que permite essa interação tal como o QMF e o SPUFI.

Programa com SQL Estático: Os comandos SQL são codificados em uma

linguagem hospedeira, em nosso caso o COBOL, e após o processo de

compilação esses comandos ficam imutáveis no programa.

Programa com SQL Dinâmico: Os comandos SQL 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.

TeoriaA Linguagem sql

(Structured query language)

Page 86: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 4

www.grandeporte.com.br (11) 4427-4579(11) 99903-3218

6

Os comandos SQL podem ser submetidos ao DB2 pelos seguintes modos:

QMF (QUERY MANAGEMENT FACILITY)

Este é um produto da IBM para submeter os comandos SQL para o DB2 e

visualizar os resultados. Abaixo tela inicial do QMF:

O QMF oferece três estilos de consulta diferentes para o usuário com

diferentes níveis de conhecimento:

Consulta Orientada: um método de consulta fácil de ser utilizar que solicita as

informações necessárias enquanto você estiver criando uma consulta. É adequada

para iniciantes e usuários ocasionais de QMF que desejam criar uma consulta mas

não conhecem SQL.

SQL (Structured Query Management): Usa a linguagem SQL que descreve

suas solicitações para os dados no banco de dados.

QBE (Query-By-Example): Um método “gráfico” para consultar, atualizar,

excluir ou inserir dados. Minimiza a sequencia de teclas e economiza tempo ao digitar

uma consulta.

Teoria Ambientes para o uso do sql

Page 87: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 4

www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218

7

4

SPUFI

O TSO tem uma opção dentro do menu DB2 (opção D;1) chamado SPUFI

(SQL PROCESSING USING FILE INPUT). O SPUFI tem um menu onde o usuário

especifica um dataset (pode ser um particionado) contendo o texto do comando SQL a

ser executado, e um dataset para receber o resultado do comando (resulttable).

Usando o SPUFI o usuário pode facilmente executar quase todos os comandos SQL.

Abaixo telas do SPUFI.

Page 88: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 4

www.grandeporte.com.br (11) 4427-4579(11) 99903-3218

8

Programas

Os comandos SQL podem ser codificados dentro de programas escritos em

várias linguagens, incluindo o COBOL. Exemplo:

Page 89: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 4

www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218

9

4

Os comandos SQL se dividem em 4 grandes grupos:

DDL – DATA DEFINITION LANGUAGE.

Neste primeiro grupo estão os comandos para criar e alterar a estrutura das

tabelas do DB2. Este grupo de comandos é usado geralmente pelo DBA ou pessoal de

suporte. (CREATE, DROP, ALTER)

DML – DATA MANIPULATION LANGUAGE

Neste segundo grupo estão os comandos para pesquisar e manipular os

valores existentes nas tabelas do DB2. Este grupo de comandos compõe o material

usado em programação dos aplicativos usando DB2. (SELECT, INSERT, UPDATE,

DELETE)

DCL – DATA CONTROL LANGUAGE

Neste terceiro grupo estão os comandos para dar ou tirar privilégios de acesso

aos objetos do DB2 (GRANT, REVOKE)

DTL – DATA TRANSACTION LANGUAGE

Neste quarto grupo estão os comandos para manipular as transações enviadas

ao DB2. (COMMIT, ROLLBACK).

Teoria Comandos sql

Sou DBA,devo conhecer SQL DDL e DCL

a fundo.

Sou programador,devo conhecerSQL DML e DTL

a fundo.

Page 90: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 4

www.grandeporte.com.br (11) 4427-4579(11) 99903-3218

10

A SQL DDL é formada basicamente por três comandos:

CREATE Define objetos novos

ALTER Altera objetos previamente definidos

DROP Elimina objeto previamente definido

NOMEANDO OBJETOS

Toda Tabela, Índice, Coluna, View, precisa de um nome. A regra para nomear

objetos no DB2 é a seguinte:

O primeiro caractere deve ser de A a Z, $, @ ou # os demais caracteres podem

ser de A a Z, $, @, #, de 0 a 9 ou _.

O nome da tabela é único através do seu Owner/Creator/Schema. Já onome da

coluna deve ser único na tabela. Exemplo

Teoria SQL DDL

Owner/Creator/Schema

GPXXNN

Nome Simples da Tabela

TBPROD

Nome Qualificado da Tabela

(Completo)GPXXNN.TBPROD

Nome da Tabela

TBPROD

Nome da Coluna

DESCPROD

Nome Qualificado da Coluna

(Completo)TBPROD.DESCPROD

Page 91: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 4

www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218

11

4

CRIANDO TABELAS

Apesar de ser tecnicamente possível, os comandos SQL para criar e alterar

tabelas não são usados em programas COBOL.

O comando SQL para criar uma nova tabela é o CREATE TABLE. Podem ser

criadas tabelascom até 750 colunas e 16 terabytes de tamanho total. O comando

define o nome da tabela seguido de uma série de especificações de colunas.

Exemplo 1:

CREATE TABLE PRODUTO

( CODIGO CHAR(6) UNIQUE NOT NULL,

NOME VARCHAR(20) ,

PRECO DECIMAL(8,2) NOT NULL,

DEPTOFABR CHAR(3) ,

DATAFABR DATE DEFAULT

)

Neste exemplo o argumento UNIQUE que aparece em CODIGO indica que o

valor desta coluna não pode se repetir nas linhas da tabela (Unique Key).

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.Os valores default para o DB2 depende do tipo de

dado da coluna, conforme a tabela abaixo:

CHAR VARCHAR

Espaço em Branco

INTEGER SMALLINT DECIMAL REAL DOUBLE

Zero

DATE Data Corrente do Sistema

TIME Hora Corrente do Sistema

TIMESTAMP Data e Hora Corrente do Sistema

É possível definir um valor default diferente, basta informar esse valor na

sequência do comando, observe que WITH é opcional. Exemplo:

COMISSAO DECIMAL(8,2) WITH DEFAULT 100

TIMEDOCORACAO VARCHAR(30) DEFAULT ‘OLARIA F.C.’

Page 92: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 4

www.grandeporte.com.br (11) 4427-4579(11) 99903-3218

12

Exemplo 2:

CREATE TABLE DEPTO

( CODDEPTO CHAR(03) PRIMARY KEY NOT NULL,

NOMEDEPTO CHAR(10) NOT NULL,

ENDERDEPTO VARCHAR(60)

)

Neste exemplo a tabela DEPTO esta sendo criada com a chave primária

CODDEPTO.Será necessário criar um índice único (UNIQUE INDEX) na coluna

CODDEPTO antes de inserir dados na tabela.

Exemplo 3:

CREATE TABLE CHAMADO

( NUMCHAMADO DECIMAL(6,0) NOT NULL,

TEXTOCHAMADO VARCHAR(200) NOT NUll,

ABERTURACHAMADO TIMESTAMP DEFAULT ,

FECHAMENTOCHAMADO TIMESTAMP ,

PRIMARY KEY (NUMCHAMADO)

)

Neste exemplo, a definição de Chave Primária foi dada no final com PRIMARY

KEY (NUMCHAMADO).

Não foi bem isso

que eu quis dizer

com create table!

Page 93: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 4

www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218

13

4

CHECK CONSTRAINTS (restrições)

A verificação de restrições em tabelas especifica condições que são avaliadas

para cada linha da tabela no momento da inclusão ou alteração de dados. Você pode

especificar verificações de restrição para colunas individuais (check) ou para um grupo

de colunas (constraintnome_da_restrição). Você pode adicioná-las usando os

comandos CREATE ou ALTER TABLE.

O exemplo abaixo cria a tabela EMPREGADO com as seguintes restrições:

a) Os valores para os números do departamento devem estar entre 10 e 100

inclusive.

b) O cargo do empregado só pode ser um dos seguintes: ‘VENDAS’,

‘GERENTE’ ou ‘AUXILIAR’.

c) Cada empregado que foi admitido antes de 1986 deve ganhar mais de

R$ 40.000,00 de salário anual.

Exemplo:

CREATE TABLE EMPREGADO

( MATRICULA SMALLINT NOT NULL,

NOME VARCHAR(40) NOT NULL,

DEPTO SMALLINT

CHECK (DEPTO BETWEEN 10 AND 100),

CARGO VARCHAR(8)

CHECK(CARGO IN (’VENDAS’,’GERENTE’,’AUXILIAR’)),

DATAADMIN DATE,

SALARIO DECIMAL(7,2),

COMISSAO DECIMAL(7,2),

PRIMARY KEY (MATRICULA),

CONSTRAINT SALARIOANUAL CHECK (YEAR (DATAADMIN) >= 1986 OR

SALARIO * 12 > 40000))

Quando a verificação é sobre uma coluna, coloca-se CHECK imediatamente

após a definição desta coluna. Quando a verificação é sobre um grupo de colunas,

cria-se.umaconstraintnome_da_restrição e no check se informa a verificação desejada.

Page 94: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 4

www.grandeporte.com.br (11) 4427-4579(11) 99903-3218

14

CRIANDO ÍNDICES

Toda coluna definida como Unique ou Primary Key precisa de um índice único,

antes da tabela começar a receber dados. Para a criação de índices únicos usamos o

comando SQL CREATE UNIQUE INDEX.Exemplo:

CREATE UNIQUE INDEX IDXDEPTO

ON DEPTO (CODDEPTO)

Neste exemplo IDXDEPTO é o nome do índice. ON indica qualtabela será

indexada e entre os parênteses é colocado a coluna que será indexada, no caso

CODDEPTO.

Qualquer coluna não Unique pode também ter um índice. Os índices

aumentam a performance das pesquisas que usam esta coluna. Exemplo:

CREATE INDEX IDXNOME

ON EMPREGADO (NOMEEMP)

Neste exemplo como pode haver mais de um empregado com o mesmo nome,

a cláusula Unique não foi usada.

Índice Tabela

IDXDEPTO DEPTO

CODDEPTO

001

002

003004

NOMEDEPTO

PRODUCAO

PINTURA

FUNILARIATAPECARIA

CODDEPTO

003

001

004002

ÍndiceTabela

NOMEEMP

BARNABE ATANASIO

CARLOS MOURA

AMBROSIO TEIXEIRABARNABE ATANASIO

CODDEPTO

002

001

004003

NOMEEMP

AMBROSIO TEIXEIRA

BARNABE ATANASIO

BARNABE ATANASIOCARLOS MOURA

EMPREGADO IDXNOME

Page 95: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 4

www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218

15

4

ALTERANDO TABELAS

O comando SQL para alterar a estrutura de uma tabela é o ALTER TABLE.

Este comando pode ser usado tanto para alterar a especificação das colunas já

existentes como para transformar as colunas em PRIMARY KEY ou FOREIGN KEY.

Também é possível inserir ou excluir restrições. Os exemplos abaixo mostram

algumas dessas possibilidades.

Exemplo 1 – transforma a coluna CODIGO, que já era UNIQUE, em PRIMARY KEY.

ALTER TABLE PRODUTO

ADD PRIMARY KEY (CODIGO)

Exemplo 2 – transforma a coluna DEPTOFABR, em uma FOREIGN KEY para a tabela

DEPTO. Depois desta alteração, uma linha de PRODUTO somente poderá ser

incluída se houver na tabela DEPTO uma linha descrevendo o departamento onde

este produto será fabricado. Também foi definida uma restrição para a exclusão da

linha do departamento em DEPTO, especificando que se a linha DEPTO for excluída o

DB2 deverá inserir NULL na coluna DEPTOFABR dos produtos relacionados.

ALTER TABLE PRODUTO

ADD FOREIGN KEY (DEPTOFABR)

REFERENCES DEPTO (CODDEPTO)

ON DELETE SET NULL

Pode-se também usar:

ON DELETE RESTRICT – que não permite a exclusão da PARENT KEY

enquanto houverem FOREIGN KEY relacionada.

ON DELETECASCADE – que exclui todas linhas com essa chave estrangeira

antes de excluir a PARENT KEY.

Page 96: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 4

www.grandeporte.com.br (11) 4427-4579(11) 99903-3218

16

Exemplo 3 – adiciona a coluna TAXAIMP na tabela PRODUTO. As novas colunas são

inseridas no final da estrutura da tabela.

ALTER TABLE PRODUTO

ADD COLUMN TAXAIMP DECIMAL(6,4)

Exemplo 4 – exclui a coluna TAXAIMP da tabela PRODUTO.

ALTER TABLE PRODUTO

DROP COLUMN TAXAIMP

Exemplo 5 – adiciona uma restrição na tabela PRODUTO.

ALTER TABLE PRODUTO

ADD CONSTRAINT QUANTIDADES CHECK (QTDMAX > QTDMIN)

Exemplo 6 – exclui uma restrição da tabela PRODUTO.

ALTER TABLE PRODUTO

DROP CONSTRAINT QUANTIDADES

CRIANDO VISÕES (VIEW)

Uma visão pode ser criada referenciando de 1 a 255 tabelas, dependendo da

complexidade da instrução SELECT, que não pode conter ORDER BY. Exemplo:

CREATE VIEW VDEPTOSEL

(COD_DEPTO_SEL, NOME_DEPTO_SEL)

AS

SELECT COD_DEPTO, NOME_DEPTO

FROM DEPARTAMENTO

WHERE COD_DEPTO BETWEEN ‘010’ AND ‘050’

Toda vez que a tabela DEPARTAMENTO sofrer alterações, a VIEW irá refleti-

las. Não é possível inserir dados na VIEW (INSERT), mas podemos alterar (UPDATE)

e excluir (DELETE) dados, o que acarreta alteração e exclusão na tabela original.

departamento

vdeptoselcod_depto_sel nome_depto_sel

cod_depto cod_gerente nome_depto centro_custo telefone

015 0141 Produção 127125 4455-1021038 0525 Marketing 130220 4455-1025052 0084 Vendas 130250 4455-1017067 0092 SAC 130300 4455-1035

015038

ProduçãoMarketing

Page 97: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 4

www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218

17

4

HIRARQUIA DE EXCLUSÕES

A eliminação de qualquer objeto faz com que:

Os objetos dependentes sejam eliminados

As informações associadas sejam perdidas

As informações necessárias para recuperação sejam perdidas

Planos/Packages que referenciam os objetos sejam invalidados

A figura a seguir mostra a hierarquia dos objetos:

EXCLUINDO TABELAS

Para excluir uma tabela, usa-se o comando DROP TABLE. Exemplo:

DROP TABLE PRODUTO

Caso a tabela seja uma PARENT TABLE, ou seja, fornecedora de chave

estrangeira, a exclusão só será permitida quando a restrição de exclusão for SET

NULL ou não houver referência de sua PRIMARY KEY como FOREIGN KEY na tabela

destino. Ao se excluir uma tabela, todos os seus Índices são também excluídos.

EXCLUINDO ÍNDICES

Para excluir um índice, usa-se o comando DROP INDEX. Exemplo:

DROP INDEX IDXPRODUTO

EXCLUINDO VIEW

Para excluir uma VIEW, usa-se o comando DROP VIEW. Exemplo:

DROP VIEW VDEPTOSEL

Database Tablespace Tabela

View

Índice

Olá Tabelas,

procuro a tabcliente

Alguém a viu?

tabcliente

codcli (PK)nomecli

enderecocli

cpfclitelefonecli tabvendanumvenda (PK)

datavendacodcli (FK)

tabitemvenda

numitem(PK)

numvenda (FK)

qtdeitemcodprod (FK)

tabproduto

codprod (PK)

descprodprecovenda

qtdeestoque

Page 98: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 4

www.grandeporte.com.br (11) 4427-4579(11) 99903-3218

18

CATALOGO DB2

O CATÁLOGO DB2 é um conjunto de tabelas da IBM para descrever todo o banco de

dados do DB2 o OWNER do CATALOGO é SYSIBM. Algumas tabelas podem ser consultadas

como por exemplo:

CATÁLOGO Que tipo de informação contém

SYSIBM.SYSCOPY Cópias e tipos das cópias

SYSIBM.SYSTABLES Tabela, criador, tipo, qual database, qual tablespace

SYSIBM.SYSCOLUMNS Coluna, a qual tabela pertence, default, nulidade

SYSIBM.TABAUTH Autorização de tabela, view-automatizador, autorizado

SYSIBM.SYSINDEXES Índices, colunas, tabela, ascendente, descendente

SYSIBM.SYSKEYS Colunas dos índices

SYSIBM.SYSPACKAGE Pacotes, token de consistência

SYSIBM.SYSDBRM DBRMs, token de consistência

SYSIBM.SYSPLAN Planos, válido, operativo

SYSIBM.SYSPLANAUTH Autorização de planos

CONSULTANDO TABELAS, COLUNAS E ÍNDICES

Para consultar as tabelas existentes no DB2, usamos o comando:

SELECT *

FROM SYSIBM.SYSTABLES

Para consultar as tabelas criadas por determinado usuário, usamos o

comando:

SELECT *

FROM SYSIBM.SYSTABLES

WHERE CREATOR = ‘GPXXNN’

Para consultar as colunas de uma determinada tabela, usamos o comando:

SELECT *

FROM SYSIBM.SYSCOLUMNS

WHERE TBNAME = ‘TABELA’ AND

TBCREATOR = ‘GPXXNN’

Page 99: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 4

www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218

19

4

Para consultar os índices criados por determinado usuário, usamos o comando:

SELECT *

FROM SYSIBM.SYSINDEXES

WHERE CREATOR = ‘GPXXNN’

Para consultar as colunas de um determinado índice, usamos o comando:

SELECT *

FROM SYSIBM.SYSKEYS

WHERE IXCREATOR = ‘GPXXNN’ AND

IXNAME = ‘INDICE’

Page 100: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 4

www.grandeporte.com.br (11) 4427-4579(11) 99903-3218

20

Apontando o SPUFI para a instalação de DB2 desejada.

A partir do Menu Principal do TSO, digitar as opções D (DB2 Interactive) e D

(DB2 Defaults). No painel DB2I DEFAULTS, no campo 1 DB2 NAME digitar DB2N e

pressionar a tecla ENTER. No painel COBOL DEFAULTS não mudar nada e

pressionar a tecla ENTER. Isso mudará o SSID para DB2N.

Teoria Como usar o spufi

Page 101: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 4

www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218

21

4

1

2

3

Informando ao SPUFI os arquivos de entrada e saída

A partir do Menu Principal do TSO, digitar as opções D (DB2 Interactive) e 1

(SPUFI). No painel do SPUFI preencher os campos:

1. Entre apóstrofes, colocar o nome do arquivo sequencial ou particionado

com o membro entre parenteses, contendo o texto SQL DDL. Usaremos o

arquivo particionado GP.GPXXNN.JCLDATA(membro).

2. Entre apóstrofes, colocar o nome do arquivo sequencial, variável blocado,

para receber o resulttable. Usaremos o arquivo sequencial

GP.GPXXNN.DB2SAI.

3. Deixar NO na opção CHANGE DEFAULTS e pressionar a tecla ENTER

para digitar o comando SQL desejado.

Page 102: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 4

www.grandeporte.com.br (11) 4427-4579(11) 99903-3218

22

Veja como o SPUFI interage com o DB2

1. O TSO envia ao SPUFI um arquivo de entrada contendo comando SQL

2. O SPUFI passa ao DB2 esse comando SQL

3. Após a execução, o DB2 DEVOLVE ao SPUFI o resultado do comando SQL

4. O SPUFI grava esse resultado no arquivo de saída e devolve o controle ao TSO

TSO

GP.GPXXNN.JCLDATA (CREATE1)PDS

GP.GPXXNN.DB2 SAIPS/VB

DB2SPUFI

1 2

34

Page 103: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 4

www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218

23

4

Digitando o comando SQL, executando e exibindo o resultado

1. Digitar o comando SQL desejado e pressionar a tecla PF3, que sai salvando

2. A mensagem informa que você terminou de editar o comando SQL e que

precisa pressionar a tecla ENTER para executar o comando. Observe que o

campo 6 está com *, indicando que não entrará novamente na edição (Se

desejar editar novamente, coloque Y neste campo)

3. Agora você está vendo (BROWSE) o arquivo de saída. Para voltar ao painel do

SPUFI pressione a tecla PF3.

Para comentar os comandos, utilize dois hífens em qualquer coluna. Tudo que

vier na sequência será ignorado pelo DB2.

1

2

3

Page 104: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 4

www.grandeporte.com.br (11) 4427-4579(11) 99903-3218

24

Coloque entre os parentêses em qual grupo os

comandos SQL pertencem, depois peça para seu colega

corrigí-lo.

DDL–Data Definition Language

DML – Data Manipulation Language

DCL – Data Control Language

DTL – Data Transaction Language

1. ( ) SELECT

2. ( ) ROLLBACK

3. ( ) CREATE

4. ( ) UPDATE

5. ( ) ALTER

6. ( ) DROP

7. ( ) GRANT

8. ( ) COMMIT

9. ( ) REVOKE

10. ( ) INSERT

11. ( ) DELETE

Practice

Atividade Revisão aos pares

Page 105: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 4

www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218

25

4

Escreva os comandos SQL DDL para atender os

seguintes requisitos.

1) Inserir a coluna PRECOVENDA DECIMAL(9,2) NOT NULL na tabela TBPROD.

2) Tirar a coluna OBSCLIENTE da tabela CADCLI.

Atividade Trabalho em dupla

Page 106: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 4

www.grandeporte.com.br (11) 4427-4579(11) 99903-3218

26

3) Criar o índice IDXENDERECO para a tabela TBCLI coluna ENDCLI.

4) Excluir o índice IDXCPF.

5) Exibir todos os índices criados pelo seu usuário.

6) Exibir todas as colunas de todas as tabelas criadas por seu usuário.

Page 107: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 4

www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218

27

4

Criar as cinco tabelas abaixo conforme

layout, com suas Constraints, Índices, Primary

Keys e Foreign Keys com as restrições de exclusão

indicadas.

Performance

Atividade Prática de laboratório

1 2

3 4

5

SE

T N

UL

L

CA

SC

AD

E

RE

ST

RIC

T

SE

T N

UL

L

TBTIPOCLI

CODTIPOCLI (PK)DESCTIPOCLI

IDXTIPOCLI

TBVENDA

NUMVENDA (PK)DATAHORAVENDAQTDEVENDACODCLI (FK)CODPROD (FK)

IDXVENDA

TBTIPOPROD

CODTIPOPROD (PK)DESCTIPOPROD

IDXTIPOPROD

TBPROD

CODPROD (PK)DESCPRODPRECOPRODUNIDPRODCODTIPOPROD (FK)

IDXPRODTBCLI

CODCLI (PK)NOMECLIENDCLIDATANASCCLIALTURACLICODTIPOCLI (FK)

IDXCLI

Page 108: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 4

www.grandeporte.com.br (11) 4427-4579(11) 99903-3218

28

Layout das tabelas

Tabela TBTIPOCLI

Colunas CODTIPOCLI CHAR(2) UNIQUE NOT NULL

DESCTIPOCLI VARCHAR(30) NOT NULL

Tabela TBTIPOPROD

Colunas CODTIPOPROD CHAR(2) UNIQUE NOT NULL

DESCTIPOPROD VARCHAR(30) NOT NULL

Tabela TBCLI

Colunas CODCLI CHAR(4) UNIQUE NOT NULL

NOMECLI VARCHAR(30) NOT NULL

ENDCLI VARCHAR(40)

DATANASCCLI DATE >= 01/01/1900

ALTURACLI DECIMAL(3,2) >= 1.00

CODTIPOCLI CHAR(2)

Tabela TBPROD

Colunas CODPROD CHAR(4) UNIQUE NOT NULL

DESCPROD VARCHAR(30) NOT NULL

PRECOPROD DECIMAL(9,2) > 0

UNIDPROD VARCHAR(10) ‘KG’,’PECA’,’PCT’,’LITRO’

CODTIPOPROD CHAR(2)

Tabela TBVENDA

Colunas NUMVENDA CHAR(6) UNIQUE NOT NULL

DATAHORAVENDA TIMESTAMP DEFAULT

QTDEVENDA SMALLINT > 0

CODCLI CHAR(4) NOT NULL

CODPROD CHAR(4) NOT NULL

Page 109: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 4

www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218

29

4

Os membros do arquivo particionado GP.GPXXNN.JCLDATA conterão os

comandos SQL DDL para a criação das tabelas, índices, chaves primária e estrangeira

de acordo com a numeração dada às tabelas (de 1 a 5).

1) Escrever os comandos SQL DDL para a criação das tabelas:

Membro Tabela

CREATE1 TBTIPOCLI

CREATE2 TBTIPOPROD

CREATE3 TBCLI

CREATE4 TBPROD

CREATE5 TBVENDA

2) Escrever os comandos SQL DDL para a criação dos índices únicos (UNIQUE

INDEX) para as colunas UNIQUE NOT NULL:

Membro Índice Tabela Coluna

INDEX1 IDXTIPOCLI TBTIPOCLI CODTIPOCLI

INDEX2 IDXTIPOPROD TBTIPOPROD CODTIPOPROD

INDEX3 IDXCLI TBCLI CODCLI

INDEX4 IDXPROD TBPROD CODPROD

INDEX5 IDXVENDA TBVENDA NUMVENDA

3) Escrever os comandos SQL DDL para alterar as tabelas inserindo as chaves

primárias.

Membro Tabela Primary Key

PRIKEY1 TBTIPOCLI CODTIPOCLI

PRIKEY2 TBTIPOPROD CODTIPOPROD

PRIKEY3 TBCLI CODCLI

PRIKEY4 TBPROD CODPROD

PRIKEY5 TBVENDA NUMVENDA

4) Escrever os comandos SQL DDL para alterar as tabelas inserindo as chaves

estrangeiras.

Membro Tabela Foreign Key on Delete

FORKEY3 TBCLI CODTIPOCLI SET NULL

FORKEY4 TBPROD CODTIPOPROD SET NULL

FORKEY5 TBVENDA CODCLI CASCADE

CODPROD RESTRICT

Page 110: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 4

www.grandeporte.com.br (11) 4427-4579(11) 99903-3218

30

Avaliação Então...Como foi ?!?

Estou fera!

Fiz Certo!

Muito Bom Bom regular ruim Muito ruim

Page 111: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte

Matemático inglês, desenvolveu a lógicamatemática de Boole, estabeleceu umarepresentação das intersecções e uniões de

conjuntos através de diagramas que levam o seunome.

John Venn1834- 1923

Page 112: Grande Porte - COBOL Level 2 - Versão 2.2.3

Versão 2.2.3

Page 113: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 5

www.grandeporte.com.br (11) 4427-4579(11) 99903-3218

3

5

Antes de iniciarmos, vamos conversar sobre os tópicos apresentados na capa desta parte. Isso é importante para que seu instrutor e seus colegas saibam como está seu conhecimento sobre o assunto e se você precisa ou pode fornecer ajuda aos colegas e instrutor.

O que você já sabe?

O que você não sabe?

Porque é importante conhecer estes tópicos?

Quais são os seus temores?

O que você considera difícil?

Depois de falar sobre o assunto com seus colegas e instrutor, escreva,

desenhe, rabisque, diga algo sobre o que você vai fazer para dominar esses tópicos.Comprometa-se!

Preparation

Trocando Ideias É agora que você fala !!

Reflexão É aqui que você se compromete !!

Page 114: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 5

www.grandeporte.com.br (11) 4427-4579(11) 99903-3218

4

Do ponto de vista do desenvolvedor, a linguagem SQL DML é a mais

importante, pois é a que permite a manipulação dos dados, importante para os

processos de tomada de decisão por parte do usuário.

Você aprenderá a “popular” as tabelas, atribuindo valores às suas colunas, a

consultar esses dados das mais variadas formas, algumas bem complexas, a alterar

seus valores e a excluir esses dados.

Esta parte do treinamento é longa e cobre muitos aspectos da SQL DML.

Dedique-se bastante ao SELECT e suas variantes. Isso vai ajudá-lo bastante no

momento de escrever os programas COBOL com SQL.

Presentation

História MANIPULANDO OS DADOS

Page 115: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 5

www.grandeporte.com.br (11) 4427-4579(11) 99903-3218

5

5

A linguagem SQL DML (Data Manipulation Language) é a mais usada em

programação, para acesso a Banco de Dados Relacionais e a usaremos

extensivamente na linguagem COBOL. São quatro os principais comandos:

INSERT Para inserir novas linhas

SELECT Para consultar dados

UPDATE Para atualizar colunas

DELETE Para excluir linhas

A seguir veremos em detalhes cada um desses comandos:

O comando INSERT é usado para inserir novas linhas em uma tabela. Sua

sintaxe básica é:

INSERT INTO tabela

(coluna1, coluna2,...)

VALUES

(valor1, valor2,...)

Este comando SQL define o nome da tabela onde a linha será inserida, em

seguida dentro de parênteses, uma série de colunas para as quais serão informados

os valores, e após o argumento VALUES, os valores de cada coluna, na mesma

ordem de aparição das colunas.

Quando se insere 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 (valor = NULL) até que

uma alteração (UPDATE) crie esta coluna, a menos que tenha sido definido um valor

default para a coluna.

Teoria Sql dml

Teoria insert

Page 116: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 5

www.grandeporte.com.br (11) 4427-4579(11) 99903-3218

6

Exemplo 1:

-- INFORMANDO NULL NO VALOR DA COLUNA

INSERT INTO FUNCIONARIOS

(CODIGO, NOME, SALARIO)

VALUES

(‘00120’, ‘JOSE DA SILVA’, NULL)

-- NAO INFORMANDO A COLUNA SALARIO

INSERT INTO FUNCIONARIOS

(CODIGO, NOME)

VALUES

(‘00120’, ‘JOSE DA SILVA’)

A série de colunas 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, mas os valores informados em VALUES devem estar na ordem das colunas

informadas.

Exemplo 2:

-- NA ORDEM DE CRIACAO DA TABELA

INSERT INTO FUNCIONARIOS

(CODIGO, NOME, SALARIO)

VALUES

(‘00120’, ‘JOSE DA SILVA’, 1325.50)

-- EM UMA ORDEM QUALQUER

INSERT INTO FUNCIONARIOS

(NOME, SALARIO, CODIGO)

VALUES

(‘JOSE DA SILVA’,1325.50, ‘00120’)

Nos casos em que o INSERT preenche valores para todas as colunas da

tabela, a sequência de colunas pode ser omitida, e o comando se simplifica como:

INSERT INTO nome-tabela

VALUES (valor1 , valor2 ,valor3 , ...)

Neste caso terá de ser informado os valores de todas as colunas na sequência

em que as colunas foram definidas na tabela.

Exemplo 3:

-- COM COLUNAS INFORMADAS

INSERT INTO FUNCIONARIOS

(CODIGO, NOME, SALARIO)

VALUES

(‘00120’,’JOSE DA SILVA’,1325.50)

Page 117: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 5

www.grandeporte.com.br (11) 4427-4579(11) 99903-3218

7

5

-- SEM INFORMAR AS COLUNAS

INSERT INTO FUNCIONARIOS

VALUES

(‘00120’, ‘JOSE DA SILVA’, 1325.50)

Uma forma interessante e pouco conhecida é utilizar o resultado de um

comando SELECT (RESULT TABLE) para inserir dados em uma tabela.

As colunas relacionadas com SELECT devem ser do mesmo tipo e tamanho

daqueles onde seus dados serão inseridos.

Assim, se a tabela TBCLIGERAL tem o seguinte layout:

CODCLI CHAR(5)

NOMECLI VARCHAR(50)

FONECLI CHAR(10)

SALDOCLI DECIMAL(9,2)

e a tabela TBCLINEG temo seguinte layout:

CODCLI CHAR(5)

SALDOCLI DECIMAL(9,2)

e desejarmos carregar a TBCLINEG com os clientes da TBCLIGERAL com saldo

negativo, podemos proceder da seguinte maneira:

-- INFORMANDO AS COLUNAS NO INSERT

INSERT INTO TBCLINEG

(CODCLI, SALDOCLI)

SELECT CODCLI, SALDOCLI

FROM TBCLIGERAL

WHERE SALDOCLI < 0

-- NAO INFORMANDO AS COLUNAS NO INSERT

INSERT INTO TBCLINEG

SELECT CODCLI, SALDOCLI

FROM TBCLIGERAL

WHERE SALDOCLI < 0

Page 118: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 5

www.grandeporte.com.br (11) 4427-4579(11) 99903-3218

8

Proibido em

muitas empresas!

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

FROM tabela

WHERE restrição

No argumento SELECT é especificado o conjunto de colunas ou valores,

separados por vírgula, que deverão compor a tabela resultado da pesquisa. O

caractere asterisco (*) pode ser usado em colunas para indicar que todas as colunas

da tabela devem ser selecionadas.

No argumento FROM indicam-se os nomes das tabelas de onde serão

retiradas as colunas para formar a tabela resultado.

No argumento WHERE (que é opcional) especificam-se os critérios de

pesquisa usando operadores relacionais.

Exemplo1:

SELECT CODIGO, NOME, SALARIO

FROM FUNCIONARIOS

WHERE SALARIO > 1000

Neste exemplo a tabela resultado conterá uma relação com o código, nome e

salário da tabela FUNCIONARIOS, para aqueles cujo SALARIO é maior que

R$ 1000,00.

Exemplo 2:

SELECT *

FROM FUNCIONARIOS

Este exemplo lista todas as colunas da tabela

FUNCIONARIOS. Não há restrição (WHERE), portanto todas as

linhas da tabela serão exibidas. Isso consome muita CPU.

Teoria Select

Page 119: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 5

www.grandeporte.com.br (11) 4427-4579(11) 99903-3218

9

5

Exemplo 3:

SELECT NOME, SALARIO * 12 AS SALARIOANUAL

FROM FUNCIONARIOS

Neste exemplo a tabela resultado conterá uma relação com o nome e salário

anual dos funcionários da tabela FUNCIONARIOS. UmÁlias (rótulo)pode ser colocado

para nomear as colunas. AS é opcional, podendo então ser omitido.

Exemplo 4:

SELECT PRECOPRODAS LISTA,

PRECOPROD * 0.9 AS DESCONTO,

PRECOPROD * 1.1 AS AUMENTO

FROM TABPRODUTOAS PROD

Outro exemplo do uso de alias. Aqui foram dados Álias para as colunas e

também para a tabela, artifício que facilitará a digitação de SELECTs com várias

tabelas, como veremos adiante.

Exemplo 5:

SELECT CODCLI AS “CODIGO DO CLIENTE”,

NOMECLI AS “NOME COMPLETO”,

FONECLI AS “TELEFONE RESIDENCIAL”

FROM TBCLI

Neste exemplo o Álias tem espaço em branco, e deve ser informado entre

aspas, observando o limite máximo de 18 caracteres.

A S

PROD

Page 120: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 5

www.grandeporte.com.br (11) 4427-4579(11) 99903-3218

10

Os critérios de pesquisa do argumento WHERE envolvem comparações entre

valores de colunas, variáveis, expressões aritméticas ou constantes empregando os

operadores da tabela:

Operador

Descrição

= <>

> >=

< <=

¬> ¬<

¬=

Igual Diferente

Maior Maior ou igual

Menor Menor ou igual

Não Maior Não Menor

Não igual

BETWEEN

O valor deve estar entre os dois limites, inclusive. Exemplos:

IDADE BETWEEN 1 AND 9

NOME BETWEEN ‘B%’ AND ‘F%’

IN

O valor deve ser um dos fornecidos na lista. Exemplo:

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 1 caractere. Exemplo:

NOME LIKE ‘CARLA’ Nomes exatamente iguais a CARLA

NOME LIKE ‘AN%’ Nomes iniciando com AN

NOME LIKE ‘%A’ Nomes Terminando com A

NOME LIKE ‘%SH%’ Nomes que contenham SH

NOME LIKE ‘___E%’ Nome com E na posição 4

Se o sinal ¬não estiver presente no teclado, ele pode ser obtido digitando em

hexadecimal o valor 5F.

O operador NOT pode ser usado junto com qualquer dos operadores acima.

Exemplos:

IDADE NOT BETWEEN 1 AND 9

IDADE NOT IN (1, 3, 5, 7, 9)

NOME NOT LIKE ‘%SILVA’

Page 121: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 5

www.grandeporte.com.br (11) 4427-4579(11) 99903-3218

11

5

Os operadores lógicos AND e OR podem ser usados na construção restrições

com múltiplas condições.

Exemplo 6:

SELECT CODFUNC, NOMEFUNC, FONEFUNC

FROM FUNCIONARIOS

WHERE SALARIOFUNC > 2500 AND CODDEPTOFUNC = ‘050’

Neste exemplo somente os funcionários com salário maior que R$ 2500,00 e

que trabalhem no departamento ‘050’ são selecionados.

Vale relembrar que a prioridade dos operadores lógicos é:

1º. NOT

2º. AND

3º. OR

Assim as duas restrições abaixo produzem resultados diferentes:

WHERE CARGO = ‘PEAO’ AND SALARIO > 1200 OR DEPTO = ‘050’

WHERE CARGO = ‘PEAO’ AND (SALARIO > 1200 OR DEPTO = ‘050’)

Exemplo 7:

SELECT NOMEFUNC || ‘, ’ || FONEFUNC

FROM FUNCIONARIOS

Neste exemplo o nome do funcionário será concatenado com uma vírgula e um

espaço em branco, que por sua vez será concatenado com seu telefone. Para que a

concatenação ocorra, utilize dois símbolos pipe ||. Se o sinal | não estiver presente no

teclado, ele pode ser obtido digitando em hexadecimal o valor 4F.

Exemplo 8:

SELECT 'CODIGO..: ' , CODPROD,

'MINIMO..: ' , QTDMIN ,

'MAXIMO..: ' , QTDMAX ,

'ESTOQUE.: ' , QTDEST

FROM PRODUTO

Neste exemplo uma constante precede a coluna e também será exibida em

cada linha da consulta. As constantes são delimitadas por apóstrofes.

Page 122: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 5

www.grandeporte.com.br (11) 4427-4579(11) 99903-3218

12

Exemplo 9:

SELECT CODFUNC, NOMEFUNC, COMISSAO

FROM FUNCIONARIO

WHERE COMISSAO IS NULL

Neste exemplo foi usado o argumento IS NULL como critério de seleção da

coluna. Pode-se inverter esse critério com NOT:

WHERE COMISSAO IS NOT NULL

ELIMINANDO REPETIÇÕES DA TABELA RESULTADO

O argumento DISTINCT é opcional, e quando especificado a tabela resultado

não conterá linhas com valores repetidos para a coluna informada. A sintaxe é a

seguinte:

SELECT DISTINCT coluna

FROM tabela

WHERE restrição

O exemplo abaixo lista o código dos produtos vendidos, sem repetição, que

foram vendidos mais de 10 unidades.

Exemplo 10:

SELECT DISTINCT CODPROD

FROM TBVENDA

WHERE QTDVENDA > 10

A palavra chave DISTINCT deve aparecer logo depois do SELECT.

O uso do DISTINCT pode implicar o uso da área de Sort do DB2. Use

preferencialmente colunas que fazem parte do índice.

DISTINCT gentleman

There is no other like him

Page 123: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 5

www.grandeporte.com.br (11) 4427-4579(11) 99903-3218

13

5

OPERAÇÕES ARITMÉTICAS

Os seguintes operadores aritméticos podem ser usados em SQL:

Prioridade Sinal Operação

0 ( ) Parênteses – Agrupa expressões

1 * / Multiplicação e Divisão

2 + - Soma e Subtração

Exemplo 11:

SELECT NUMEFUNC, SALARIO+COMISSAO AS RENDIMENTOS

FROM FUNCIONARIO

WHERE SALARIO+COMISSAO >= 20000

ARITMÉTICA com DATE/TIME

Os formatos DATE, TIME e TIMESTAMP armazenam dados como decimal

compactado sem sinal, de acordo com a tabela abaixo:

Tipo de Dado Formato Interno

DATE aaaammdd

TIME hhmmss

TIMESTAMP aaaammddhhmmssnnnnnn

Os programas só lidam com o formato externo que é uma string de caracteres,

de acordo com o padrão em uso, como mostra a tabela abaixo:

Padrão Formato Time

Tamanho Formato Date

Tamanho

ISO hh.mm.ss 8 Bytes aaaa-mm-dd 10 Bytes

USA hh.mm AM hh.mm PM

8 Bytes mm/dd/aaaa 10 Bytes

EUR hh.mm.ss 8 Bytes dd.mm.aaaa 10 Bytes

JIS hh:mm:ss 8 Bytes aaaa-mm-dd 10 Bytes

Timestamp usa o formato aaaa-mm-dd-hh-mm-ss-nnnnnn com 26 Bytes.

A subtração fornece o seguinte resultado:

horário – horário ===> duração em hhmmss

data – data ===> duração em aaaammdd

Há também a subtração e adição com DURAÇÃO ROTULADA, que é um

número n seguido da palavra chave YEARS, MONTHS, DAYS, HOURS, MINUTES,

SECONDS ou MICROSECONDS.

horário duração rotulada ===> horário

data duração rotulada ===>data

Page 124: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 5

www.grandeporte.com.br (11) 4427-4579(11) 99903-3218

14

Exemplo 12:

SELECT CURRENT DATE - DATAADMISSAO

FROM FUNCIONARIO

Neste exemplo será exibido no formato aaaammdd o tempo que o funcionário

tem de empresa.

Exemplo 13:

SELECT DATANASCIMENTO + 18 YEARS

FROM TABCLIENTE

Neste exemplo será exibido no formato de data (de acordo com o padrão do

sistema) a data em que o cliente terá 18 anos.

Exemplo 14:

SELECT DATAVENCTO + 1 MONTHS – 3 DAYS

FROM TABBOLETOS

Neste exemplo será exibido no formato de data (de acordo com o padrão do

sistema) a data de vencimento do boleto somando 1 mês e subtraindo 3 dias.

Page 125: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 5

www.grandeporte.com.br (11) 4427-4579(11) 99903-3218

15

5

ORDENAÇÃO DA TABELA RESULTADO

Para ordenar as linhas na tabela resultado usamos ORDER BY, sua sintaxe é a

seguinte:

SELECT DISTINCT colunas

FROM tabela

WHERE restrição

ORDER BY colunas ASC

Com esta sintaxe a tabela resultado será ordenada pelas colunas especificadas

no argumento ORDER BY. O argumento ASC é opcional, pode ser DESC, e indica se

a ordenação é crescente ou decrescente.

Exemplo 15:

SELECT DISTINCT NOME

FROM FUNCIONARIOS

ORDER BY NOME

Neste exemplo é listado sem repetição, os nomes dos funcionários em ordem

alfabética.

Exemplo 16:

SELECT NOME,CARGO,DEPTO,SALARIO

FROM FUNCIONARIOS

ORDER BY 4

Neste exemplo foi usado a posição da coluna no SELECT como argumento do

ORDER BY.

Colunas classificadas não precisam ser referenciadas pelo SELECT.

Nulos são considerados como valor mais alto.

Podemos especicar colunas para o ORDER BY fornecendo um número que

indique suas posições na cláusula SELECT.

ORDER BY classifica uma tabela resultante.Logo,deve ser a última a aparecer

numa instrução SELECT.

ORDER BY pode implicar no uso de área de Sort do DB2.Use

preferencialmente colunas que fazem parte de índice.

É possível usar mais de uma coluna para fazer a ordenação:

Exemplo 17:

SELECT CODCLI,CODPROD

FROM TBVENDA

ORDER BY CODCLI ASC, CODPROD DESC

Page 126: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 5

www.grandeporte.com.br (11) 4427-4579(11) 99903-3218

16

BUILT-IN FUNCTIONS

O DB2 possui um conjunto de funções pré-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 ou não existe uma tabela

para preencher o argumento FROM do SELECTdeve-se usar a pseudo-tabela

SYSIBM.SYSDUMMY1. Exemplo de um SELECT para obter a data do sistema:

Exemplo 18:

SELECT CURRENT DATE

FROM SYSIBM.SYSDUMMY1

A lista de funções é extensa e as principais estão na tabelas abaixo:

Funções de Data/Hora

DATE(coluna) Devolve um valor DATE contido na expressão

ou coluna do tipo DATE ou TIMESTAMP

DAY(expressão)

Devolve o dia do mês se a expressão for do tipo

DATE, ou a quantidade de dias se a expressão

representar uma diferença de datas.

DAYS(expressão)

Devolve um numero inteiro representando o

numero de dias transcorridos entre o valor DATE

da expressão e o dia 01/01/0001.

HOUR(expressão)

Retorna o valor da HORA contido na expressão.

Expressão deve ter formato TIME ou

TIMESTAMP.

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

MONTH(expressão)

Devolve o valor do MES contido na expressão.

Expressão deve ter formato DATE ou

TIMESTAMP

SECOND(expressão)

Devolve o valor dos SEGUNDOS contidos na

expressão. Expressão deve ter formato TIME ou

TIMESTAMP

YEAR(expressão)

Devolve o valor do ANO contido na expressão.

Expressão deve ter formato DATE ou

TIMESTAMP

Page 127: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 5

www.grandeporte.com.br (11) 4427-4579(11) 99903-3218

17

5

Funções Agregativas

AVG(DISTINCT coluna)

Obtém a média aritmética dos valores das

colunas ou expressões. Se DISTINCT for usado,

os valores repetidos serão desprezados.

COUNT(* ou DISTINCT coluna)

* obtém a quantidade de linhas selecionadas. Se

DISTINCT for usado, as linhas repetidas não

serão contadas.

MAX(coluna) Obtém o maior valor contido nas colunas ou

expressões selecionadas.

MIN(coluna) Obtém o menor valor contido nas colunas ou

expressões selecionadas.

SUM(DISTINCT coluna)

Obtém a soma dos valores das colunas ou

expressões selecionadas. Se DISTINCT for

usado, os valores repetidos não serão somados.

Funções de Conversão

CHAR(expressão)

Converte o resultado de expressão para

STRING. O resultado de expressão pode estar

nos formatos:INTEGER ou SMALLINT

DECIMAL

REAL ou DOUBLE

DECIMAL(expressão,n1,n2)

Transforma o valor de expressão em valor no

formato DECIMAL, contendo um total de n1

algarismos e n2 decimais.

DIGITS(expressão)

Retorna o valor da expressão com os algarismos

no formato de um STRING de caracteres,

preenchendo com zeros a esquerda. A

expressão deve estar no formato INTEGER,

SMALLINT ou DECIMAL.

FLOAT(expressão) Retorna o valor da expressão ou coluna no

formato FLOAT.

HEX(expressão) Retorna um STRING de dígitos hexadecimais

com o valor da expressão.

INTEGER(expressão) Retorna o valor da expressão no formato

INTEGER

LENGTH(expressão) Retorna o numero de caracteres do valor da

expressão (ou coluna)

VALUE(expressão,expressão) Retorna o valor da primeira expressão cujo valor

não for NULL. São duas funções equivalentes. COALESCE (expressão,expressão)

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.

Page 128: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 5

www.grandeporte.com.br (11) 4427-4579(11) 99903-3218

18

AGRUPANDO LINHAS NO RESULTADO

A tabela resultado pode ter suas linhas agrupadas e resumidas segundo o valor

de uma coluna especifica com a sintaxe:

SELECT colunas

FROM tabela

WHERE restriçã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. WHERE seleciona linhas e HAVING seleciona grupos.

Exemplo 19:

SELECT CARGO,SUM(SALARIO)

FROM FUNCIONARIOS

GROUP BY CARGO

HAVING SUM(SALARIO) > 10000

Este exemplo lista os cargos e a respectiva soma de salários da tabela de

funcionários somente para os cargos cuja soma de salários é superior a R$ 10.000,00.

Exemplo 20:

SELECT DEPTO, SUM(SALARIO),SUM(COMISSAO)

FROM FUNCIONARIOS

WHERE CARGO <> ‘GERENTE’

GROUP BY DEPTO

Este exemplo lista os departamentos e a respectiva soma de salários e

comissão da tabela de funcionários somente para os cargos diferentes de GERENTE.

Exemplo 21:

SELECT DEPTO, CARGO, SUM(SALARIO)

FROM FUNCIONARIO

GROUP BY DEPTO, CARGO

Este exemplo lista os departamentos e os cargos dentro do departamento com

a respectiva soma de saláriosda tabela de funcionários.

Podemos fazer GROUP BY sobre múltiplas colunas.Colunas GROUP BY não

precisam ser referenciadas pelo SELECT.Colunas referenciadas pelo SELECT que

não tenham função aplicada precisam ser agrupadas pelo GROUP BY. Isso é um erro

muito frequente.O resultado contém uma linha sumário para cada grupo.Todos os

valores nulos são considerados como um grupo.

Page 129: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 5

www.grandeporte.com.br (11) 4427-4579(11) 99903-3218

19

5

UNINDO SELECTS (UNION e UNION ALL)

Dois ou mais SELECTs podem ser reunidos para formar uma única tabela

resultado. O comando UNION tem a seguinte sintaxe:

1º Comando SELECT

UNION

2º Comando SELECT

UNION ALL

3º Comando SELECT

Os SELECTs são executados serialmente. A quantidade de colunas precisa ser

igual em todos os SELECTs. O data type das colunas correspondentes deve ser igual.

O tamanho das colunas não precisa ser igual, é considerado o tamanho do maior. O

Operador UNION usa as tabelas resultantes e elimina as linhas duplicadas, o que

implica no uso do SORT. O operador UNION ALL também une as tabelas, mas não

elimina as linhas duplicadas. Portanto não usa O SORT.

Exemplo 22:

SELECT CODCLISP, NOMECLISP, FONECLISP

FROM TBCLISP

UNION

SELECT CODCLIRJ, NOMECLIRJ, FONECLIRJ

FROM TBCLIRJ

Neste exemplo dois cadastros de clientes são consultados para formas uma

única tabela resultado. Caso o mesmo cliente esteja em ambos os cadastros com o

mesmo código, nome e telefone, ele não será repetido.

Exemplo 23:

SELECT CODCLISP AS CODIGO, NOMECLISP, FONECLISP

FROM TBCLISP

UNION ALL

SELECT CODCLIRJ AS CODIGO, NOMECLIRJ, FONECLIRJ

FROM TBCLIRJ

ORDER BY CODIGO

Neste exemplo os mesmos dois cadastros de clientes são consultados para

formas uma única tabela resultado. Foi atribuído o mesmo Álias nas colunas de código

do cliente, o que permitiu o uso de ORDER BY. O uso do UNION ALL faz com que

clientes cadastrados em duplicidade apareçam na tabela resultado.

Page 130: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 5

www.grandeporte.com.br (11) 4427-4579(11) 99903-3218

20

JOIN

O JOIN é o processo do SELECT de pesquisar dados em mais de uma tabela.

A tabela resultado conterá valores provenientes de colunas das várias tabelas. Para

que seja possível esta união das linhas de várias tabelas para compor uma linha da

tabela resultado, é necessário que as linhas das várias tabelas tenham em comum

uma coluna que tenha valores correspondentes.

Para exemplificar, vamos usar 2 tabelas: FUNCIONARIOS e

DEPARTAMENTO com as seguintes colunas:

Queremos fazer uma relação de funcionários com o nome do departamento em

que trabalham. A tabela resultado deste SELECT deverá conter CODFUNC,

NOMEFUNC 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 DEPTOFUNC e CODDEPTO. O SELECT será o

seguinte:

SELECT CODFUNC, NOMEFUNC, NOMEDEPTO

FROM FUNCIONARIOS, DEPARTAMENTO

WHERE FUNCIONARIOS.DEPTOFUNC = DEPARTAMENTO.CODDEPTO

Podemos usar Áliaspara as tabelas, o que simplificaria a digitação. O SELECT

com o uso de Álias fica:

SELECT CODFUNC, NOMEFUNC, NOMEDEPTO

FROM FUNCIONARIOS AS TBF, DEPARTAMENTO AS TBD

WHERE TBF.DEPTOFUNC = TBD.CODDEPTO

Podemos colocar as seguintes regras para construir um JOIN:

1. As tabelas envolvidas precisam ter uma coluna com valores iguais. 2. A cláusula WHERE do SELECT deve especificar esta correspondência entre

colunas. 3. Não é necessário que as colunas do JOIN sejam ligadas como FOREIGN KEY.

Esta declaração só tem finalidade para garantir a INTEGRIDADE RELACIONAL. 4. Note que na cláusula WHERE as colunas estão prefixadas pelo nome da tabela

(Álias). O esquema de prefixação (nome da tabela, nome da coluna separados por ponto) é usado aqui para definir o JOIN. O esquema de prefixação pode ser usado, no entanto em qualquer comando SQL para resolver ambiguidades de nomes de colunas entre varias tabelas.

5. A quantidade máxima de tabelas que podem participar de um JOIN é 255 ou menos, dependendo da complexidade do comando.

FUNCIONARIOS

CODFUNC (PK)NOMEFUNCDEPTOFUNC(FK)SALARIOFUNC

DEPARTAMENTO

CODDEPTO (PK)NOMEDEPTO

Page 131: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 5

www.grandeporte.com.br (11) 4427-4579(11) 99903-3218

21

5

OS 7 TIPOS DE JOIN

Dada as tabelas TABCLISP e TABCLIRJ, definidas abaixo:

CREATE TABLE TBCLISP

(CODCLISP CHAR(3) NOT NULL,

NOMECLISP VARCHAR(10),

SALDOCLISP DECIMAL(8,2),

PRIMARY KEY (CODCLISP)

)

CREATE TABLE TBCLIRJ

(CODCLIRJ CHAR(3) NOT NULL,

NOMECLIRJ VARCHAR(10),

SALDOCLIRJ DECIMAL(8,2),

PRIMARY KEY (CODCLIRJ)

)

Com o seguinte conteúdo:

SELECT * FROM TBCLISP

SELECT * FROM TBCLIRJ;

CODCLISP NOMECLISP SALDOCLISP

---------+---------+---------+--

001 ANA 100.00

003 BEATRIZ 300.00

005 CARLA 500.00

008 PEDRO 2800.00

009 JOAO 2900.00

010 JOSE 3000.00

CODCLIRJ NOMECLIRJ SALDOCLIRJ

---------+---------+---------+--

002 DANIEL 200.00

004 ELIZABETE 400.00

006 FABIO 600.00

008 PEDRO 800.00

009 JOAO 900.00

010 JOSE 1000.00

Trata-se de dois cadastros de clientes, um de São Paulo (TBCLISP) e outro do

Rio de Janeiro (TBCLIRJ), mas com clientes em comum.

Usando diagrama de Venn, podemos observar que existe um grupo de linhas

com a mesma chave primária em ambas as tabelas:

Desejamos fazer uma consulta (SELECT) exibindo CODCLISP, NOMECLIRJ e

SALDOCLIRJ, como mostrado abaixo:

SELECT CODCLISP, NOMECLIRJ, SALDOCLIRJ

001003005

008009010

002004006

TBCLIRJTBCLISP

RIGHTLEFT

Page 132: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 5

www.grandeporte.com.br (11) 4427-4579(11) 99903-3218

22

1. A B Intersecção (INNER JOIN ou NATURAL JOIN)

Queremos os clientes cadastrados em duplicidade. São aqueles que existem

tanto no TBCLISP quanto no TBCLIRJ.

2. A B União (FULL OUTER JOIN)

Queremos o cadastro completo.

Quando o código do cliente existe em TBCLISP, mas não existe em TBCLIRJ

ou vice-versa, as colunas são preenchidas com NULL (o DB2 exibe essas colunas

preenchendo o seu tamanho com vários hífens).

A B

SELECT CODCLISP, NOMECLIRJ, SALDOCLIRJ

FROM TBCLISP INNER JOIN TBCLIRJ

ON CODCLISP = CODCLIRJ

CODCLISP NOMECLIRJ SALDOCLIRJ

---------+---------+---------+-----

008 PEDRO 800.00

009 JOAO 900.00

010 JOSE 1000.00

SELECT CODCLISP, NOMECLIRJ, SALDOCLIRJ

FROM TBCLISP FULL OUTER JOIN TBCLIRJ

ON CODCLISP = CODCLIRJ

CODCLISP NOMECLIRJ SALDOCLIRJ

-------+---------+---------+----

001 ---------- ----------

-------- DANIEL 200.00

003 ---------- ----------

-------- ELIZABETE 400.00

005 ---------- ----------

-------- FABIO 600.00

008 PEDRO 800.00

009 JOAO 900.00

010 JOSE 1000.00

BA

Page 133: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 5

www.grandeporte.com.br (11) 4427-4579(11) 99903-3218

23

5

3. Somente A (LEFT JOIN)

Queremos somente os clientes da TBCLISP e que também existam em

TBCLIRJ.

Somente os códigos dos clientes de São Paulo são exibidos. As colunas

correspondentes aos códigos dos clientes do Rio de Janeiro são preenchidas com

NULL.

4. Somente B (RIGHT JOIN)

Queremos somente os clientes da TBCLIRJ e que também existam em

TBCLISP.

Somente o nome e o saldo dos clientes do Rio de Janeiro são exibidos. Os

códigos dos clientes de São Paulo que não existem na TBCLIRJ são preenchidos com

NULL.

SELECT CODCLISP, NOMECLIRJ, SALDOCLIRJ

FROM TBCLISP LEFT JOIN TBCLIRJ

ON CODCLISP = CODCLIRJ

CODCLISP NOMECLIRJ SALDOCLIRJ

-------+---------+---------+----

001 ---------- ----------

003 ---------- ----------

005 ---------- ----------

008 PEDRO 800.00

009 JOAO 900.00

010 JOSE 1000.00

SELECT CODCLISP, NOMECLIRJ, SALDOCLIRJ

FROM TBCLISP RIGHT JOIN TBCLIRJ

ON CODCLISP = CODCLIRJ

CODCLISP NOMECLIRJ SALDOCLIRJ

-------+---------+---------+----

-------- DANIEL 200.00

-------- ELIZABETE 400.00

-------- FABIO 600.00

008 PEDRO 800.00

009 JOAO 900.00

010 JOSE 1000.00

A B

A B

Page 134: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 5

www.grandeporte.com.br (11) 4427-4579(11) 99903-3218

24

5. (A B) – B A menos B

Queremos exclusivamente os clientes de São Paulo. Eles não podem estar

cadastrados na TBCLIRJ.

Somente os códigos dos clientes de São Paulo que não existem na TBCLIRJ

são exibidos.Como eles não possuem correspondentes na TBCLIRJ, as colunas

NOMECLIRJ e SALDOCLIRJ são preenchidas com NULL.

6. (A B) – A B menos A

Queremos exclusivamente os clientes do Rio de Janeiro. Eles não podem estar

cadastrados na TBCLISP.

Somente as colunas NOMECLIRJ e SALDOCLIRJ, cujos códigos de cliente

não existem na TBCLISP são exibidas. A coluna CODCLISP será preenchida com

NULL.

SELECT CODCLISP, NOMECLIRJ, SALDOCLIRJ

FROM TBCLISP LEFT JOIN TBCLIRJ

ON CODCLISP = CODCLIRJ

WHERE CODCLIRJ IS NULL

CODCLISP NOMECLIRJ SALDOCLIRJ

-------+---------+---------+----

001 ---------- ----------

003 ---------- ----------

005 ---------- ----------

SELECT CODCLISP, NOMECLIRJ, SALDOCLIRJ

FROM TBCLISP RIGHT JOIN TBCLIRJ

ON CODCLISP = CODCLIRJ

WHERE CODCLISP IS NULL

CODCLISP NOMECLIRJ SALDOCLIRJ

-------+---------+---------+----

-------- DANIEL 200.00

-------- ELIZABETE 400.00

-------- FABIO 600.00

A B

BA

Page 135: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 5

www.grandeporte.com.br (11) 4427-4579(11) 99903-3218

25

5

7. (A B) – (A B ) União menos Intersecção

Queremos exclusivamente os clientes que não estão cadastrados ao mesmo

tempo em São Paulo e Rio de Janeiro.

Somente as colunas CODCLISP, NOMECLIRJ, SALDOCLIRJ cujos códigos de

clientes não são comuns são exibidas. As colunas que não possuem correspondente

na outra tabela são preenchidas com NULL.

SELECT CODCLISP, NOMECLIRJ, SALDOCLIRJ

FROM TBCLISP FULL OUTER JOIN TBCLIRJ

ON CODCLISP = CODCLIRJ

WHERE CODCLISP IS NULL OR

CODCLIRJ IS NULL

CODCLISP NOMECLIRJ SALDOCLIRJ

-------+---------+---------+---

001 ---------- ----------

-------- DANIEL 200.00

003 ---------- ----------

-------- ELIZABETE 400.00

005 ---------- ----------

-------- FABIO 600.00

Page 136: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 5

www.grandeporte.com.br (11) 4427-4579(11) 99903-3218

26

SUBQUERIES ou SUBSELECTs

O processo de SUBQUERIES acontece quando os elementos de comparação

da cláusula WHERE ou HAVING de um SELECT são resultado de um segundo

SELECT. Neste caso usamos um encadeamento de SELECTS, o que configura o uso

de SUB-QUERIES.

Exemplo 24:

Queremos uma lista dos funcionários do departamento P1 cujo salário é menor

que a média dos salários do departamento P2. Temos aqui o SELECT principal que

produz a lista de funcionários do departamento P1, e o SELECT auxiliar que calcula a

média dos salários do departamento P2. O SELECT completo com a SUBQUERY fica:

SELECT NOME,SALARIO

FROM FUNCIONARIOS

WHERE DEPTO = ‘P1’ AND

SALARIO < (SELECT AVG(SALARIO)

FROM FUNCIONARIOS

WHERE DEPTO = ‘P2’)

No exemplo acima, a SUBQUERY produziu somente uma linha. Nos casos em

que a SUBQUERY 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:

ALL

A condição do WHERE deve ser satisfeita para TODAS as linhas da

SUBQUERY.

IN

ANY

SOME

A condição do WHERE deve ser satisfeita pelo menos por UMA linha da

SUBQUERY

EXISTS

O WHERE é verdadeiro se a SUBQUERY tiver pelo menos UMA linha.

Uma Subquery é um SELECT embutido dentro de um SELECT. O resultado de

uma Subquery é usado pelo SELECT mais externo. Pode ser usado no WHERE ou no

HAVING. Pode ser encadeado. Deve estar à direita do operador na condição de

seleção. Deve ser colocado entre parênteses. Pode retornar uma ou mais linhas e isto

acaba determinando o operador a ser usado na condição de pesquisa. Não pode

conter ORDER BY.

Page 137: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 5

www.grandeporte.com.br (11) 4427-4579(11) 99903-3218

27

5

O comando UPDATE é usado para alterar valores em uma ou mais linhas de

uma tabela. O comando enumera as colunas e seus novos valores.

UPDATE Tabela

SET coluna1=valor1,

Coluna2=valor2,

.......

WHERE condição

Exemplo 1:

UPDATE FUNCIONARIOS

SET SALARIO = SALARIO * 1.10,

BONUS = NULL,

COMISSAO = 10.00

WHERE DEPTO = ‘P1’

Neste exemplo, todos os funcionários do departamento P1 terão um aumento

de 10% no salário, perderão o bônus e terão uma valor de comissão igual a R$ 10,00.

Uma Subquery pode ser usada no WHERE para aprimorar a seleção das linhas

alteradas.

Exemplo 2:

UPDATE FUNCIONARIOS

SET SALARIO = SALARIO * 1.35,

COMISSAO = 500.00

WHERE CODFUNCNOT IN (SELECT CODFUNC

FROM ADVERTIDOS)

Neste exemplo, todos os funcionários que não foram advertidos, terão um

aumento de 35% e uma comissão de R$ 500,00.

Teoria update

Page 138: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 5

www.grandeporte.com.br (11) 4427-4579(11) 99903-3218

28

O comando DELETE exclui linhas 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.

DELETE FROM Tabela

WHERE condição

Exemplo 1:

DELETE FROM FUNCIONARIOS

WHERE CODFUNC = ‘00120’

Uma Subquery pode ser usada no WHERE para aprimorar a seleção das linhas

excluídas.

Exemplo 2:

DELETE FROM FUNCIONARIOS

WHERE CODFUNC IN ( SELECT CODFUNC

FROM TABDEMITIDOS

WHERE DATADEMISSAO < YEAR(CURRENT DATE))

Neste exemplo, são excluídas as linhas da tabela FUNCIONARIOS cujo código

do funcionário esteja na tabela TABDEMITIDOS e a data de demissão seja menor que

o ano corrente.

Teoria delete

Esta bem, onde

estão as linhas

para delecão ?,

Page 139: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 5

www.grandeporte.com.br (11) 4427-4579(11) 99903-3218

29

5

Descreva o resultado dos SELECTs abaixo:

1 SELECT CODIGO,NOME

FROM FUNCIONARIOS

2 SELECT *

FROM FUNCIONARIOS

3

SELECT CODIGO,NOME

FROM FUNCIONARIOS

WHERE CARGO = ‘VENDAS’

4

SELECT NOME,SALARIO

FROM FUNCIONARIOS

WHERE CARGO = ‘VENDAS’

AND SALARIO > 1000

5

SELECT NOME,SALARIO

FROM FUNCIONARIOS

WHERE SALARIO BETWEEN

500 AND 2000

6

SELECT CODIGO,NOME

FROM FUNCIONARIOS

WHERE CARGO IN

(‘VENDAS’,’COBRANCA’)

Practice

Atividade TRABALHO EM DUPLA

Page 140: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 5

www.grandeporte.com.br (11) 4427-4579(11) 99903-3218

30

7

SELECT NOME

FROM FUNCIONARIOS

WHERE NOME LIKE

‘MARIA%’

8

SELECT NOME,SALARIO

FROM FUNCIONARIOS

WHERE SALARIO * 12 >

50000

9

SELECT NOME,

CURRENT DATE –

DATADEMISSAO

FROM FUNCIONARIOS

WHERE DATADEMISSAO

IS NOT NULL

10

SELECT NOME || ‘-‘

|| CODDEPTO

FROM FUNCIONARIOS

WHERE SALFUNC ¬> 10000

11

SELECT NOME, CARGO

FROM FUNCIONARIOS

WHERE DATAADMISSAO +

10 YEARS >

CURRENT DATE

12

SELECT NOMEFUNC, CARGO

FROM TABFUNCSP

UNION

SELECT NOMEFUNC, CARGO

FROM TABFUNCRJ

13

SELECT NOMEFUNC, CARGO

FROM TABFUNCSP

UNION ALL

SELECT NOMEFUNC, CARGO

FROM TABFUNCRJ

Page 141: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 5

www.grandeporte.com.br (11) 4427-4579(11) 99903-3218

31

5

Descreva o resultado dos SELECTs abaixo:

1

SELECT SUM(SALARIO),

AVG(COMISSAO)

FROM FUNCIONARIOS

WHERE DEPTO = ‘P1’

2

SELECT MAX(SALARIO),

MIN(SALARIO)

FROM FUNCIONARIOS

3

SELECT CARGO,

SUM(SALARIO)

FROM FUNCIONARIOS

GROUP BY CARGO

HAVING SUM(SALARIO) > 10000

4

SELECT SALARIO,

DECIMAL(SALARIO,6,1),

INTEGER(SALARIO),

HEX(SALARIO),

DIGITS(SALARIO)

FROM FUNCIONARIOS

5

SELECT NOME,

LENGTH(NOME)

FROM FUNCIONARIOS

Atividade TRABALHO EM DUPLA

Page 142: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 5

www.grandeporte.com.br (11) 4427-4579(11) 99903-3218

32

6 SELECT SUBSTR(NOME,1,3)

FROM FUNCIONARIOS

7 SELECT COUNT(*)

FROM FUNCIONARIOS

8

SELECT NOME,

VALUE(COMISSAO,0)

FROM FUNCIONARIOS

WHERE COMISSAO IS NULL

9

SELECT NOME,

YEAR(DATANASC)

FROM FUNCIONARIOS

WHERE CODFUNC = ‘0010’

10

SELECT NOME,

YEAR(DATANASC)

FROM FUNCIONARIOS

WHERE YEAR(CURRENT DATE

– DATANASC) >= 18

11

SELECT NOME, SALARIO * 12

FROM FUNCIONARIOS

WHERE YEAR(DATAADMISSAO

+ 10 YEARS) >

YEAR(CURRENT DATE)

12

SELECT NOME, TELEFONE,

COMISSAO + SALARIO

AS BONUS

FROM FUNCIONARIOS

WHERE MONTH(DATAADMISSAO)

= MONTH(CURRENT DATE)

13

SELECT NOME, TELEFONE

FROM FUNCIONARIO

WHERE SUBSTR(NOME,1,3) =

‘SIL’

Page 143: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 5

www.grandeporte.com.br (11) 4427-4579(11) 99903-3218

33

5

Descreva o resultado das Subqueries abaixo:

1

SELECT NOME,SALARIO

FROM FUNCIONARIOS

WHERE DEPTO = ‘P1’ AND SALARIO > ALL

( SELECT SALARIO

FROM FUNCIONARIOS

WHERE DEPTO = ‘P2’)

2

SELECT NOME,SALARIO

FROM FUNCIONARIOS

WHERE DEPTO = ‘P1’ AND SALARIO >ANY

( SELECT SALARIO

FROM FUNCIONARIOS

WHERE DEPTO = ‘P2’)

Atividade Revisão aos pares

Page 144: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 5

www.grandeporte.com.br (11) 4427-4579(11) 99903-3218

34

3

SELECT NOME,SALARIO

FROM FUNCIONARIOS

WHERE DEPTO = ‘P1’ AND SALARIO EXISTS

( SELECT SALARIO

FROM FUNCIONARIOS

WHERE DEPTO = ‘P2’)

4

SELECT DEPTO, AVG(SALARIO)

FROM FUNCIONARIOS

WHERE CARGO <> ‘GERENTE’

GROUP BY DEPTO

HAVING AVG(SALARIO) < ( SELECT AVG(SALARIO)

FROM FUNCIONARIOS

WHERE CARGO <> ‘GERENTE’)

ORDER BY 2 DESC

Page 145: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 5

www.grandeporte.com.br (11) 4427-4579(11) 99903-3218

35

5

Dado o MER monte os SELECTs para responder

as questões abaixo:

Atividade Revisão aos pares

CLIENTE

CODCLI(PK)NOMECLIFONECLI

PEDIDO

NUMPED(PK)DATAPEDCODCLI(FK)CODBOY(FK)

MOTOBOY

CODBOY(PK)NOMEBOYALCUNHABOY

ITEM

(FK)NUMPEDNUMITEMCODPROD(FK)QTDPROD

PK

PRODUTO

CODPROD(PK)DESCPRODPRECOPROD

FORMAPGTO

CODFORMA(PK)DESCFORMA

COMPAGTO

(FK)NUMPED(FK)CODFORMAVALORPAGTO

PK

Page 146: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 5

www.grandeporte.com.br (11) 4427-4579(11) 99903-3218

36

1) Qual é o nome dos clientes que o motoboy “Bigode” fez entregas ontem?

2) Qual é o produto mais vendido?

3) Quantos pedidos foram pagos em cheque este ano?

4) Qual produto nunca foi vendido?

Page 147: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 5

www.grandeporte.com.br (11) 4427-4579(11) 99903-3218

37

5

5) Qual cliente fez mais pedidos?

6) Qual a pizza mais cara?

7) Qual a forma de pagamento usada pela cliente “Ana Maria”?

8) Quantos pedidos foram feitos ontem?

Page 148: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 5

www.grandeporte.com.br (11) 4427-4579(11) 99903-3218

38

9) Quantos pedidos foram feitos antes de ontem?

10) A relação de pedidos por motoboy.

Page 149: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 5

www.grandeporte.com.br (11) 4427-4579(11) 99903-3218

39

5

Utilize as tabelas abaixo para executar os

comandos INSERT, SELECT, DELETE e UPDATE.

Performance

Atividade Prática de laboratório

1 2

3 4

5

SE

T N

UL

L

CA

SC

AD

E

RE

ST

RIC

T

SE

T N

UL

L

TBTIPOCLI

CODTIPOCLI (PK)DESCTIPOCLI

IDXTIPOCLI

TBVENDA

NUMVENDA (PK)DATAHORAVENDAQTDEVENDACODCLI (FK)CODPROD (FK)

IDXVENDA

TBTIPOPROD

CODTIPOPROD (PK)DESCTIPOPROD

IDXTIPOPROD

TBPROD

CODPROD (PK)DESCPRODPRECOPRODUNIDPRODCODTIPOPROD (FK)

IDXPRODTBCLI

CODCLI (PK)NOMECLIENDCLIDATANASCCLIALTURACLICODTIPOCLI (FK)

IDXCLI

Page 150: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 5

www.grandeporte.com.br (11) 4427-4579(11) 99903-3218

40

Monte os INSERTs para popular as tabelas.

Os membros do arquivo particionado GP.GPXXNN.JCLDATA conterão os

comandos SQL DML para os INSERTs de acordo com a numeração dada às tabelas

(de 1 a 5).

Membro Tabela Qtde. Linhas

INSERT1 TBTIPOCLI 5

INSERT2 TBTIPOPROD 5

INSERT3 TBCLI 10

INSERT4 TBPROD 10

INSERT5 TBVENDA 30

Dica: para digitar vários comandos SQL no mesmo membro, separe-os usando

ponto-e-vírgula como mostra o exemplo abaixo.

Atividade INSERT

Page 151: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 5

www.grandeporte.com.br (11) 4427-4579(11) 99903-3218

41

5

Monte os SELECTs para as consultas abaixo.

Os membros do arquivo particionado GP.GPXXNN.JCLDATA conterão os

comandos SQL DML para os SELECTs de acordo com a numeração de exercício.

Membro Consulta solicitada

SELECT01

Exibir o nome dos clientes com menos de 1.7m de altura

SELECT02

Exibir o nome e o endereço dos clientes do tipo ‘01’

SELECT03

Exibir a descrição dos produtos do tipo ‘03’

SELECT04

Exibir todos os dados (*) de vendas feitos para o cliente ‘0001’

SELECT05

Exibir o preço do produto mais caro (MAX)

Atividade select

Page 152: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 5

www.grandeporte.com.br (11) 4427-4579(11) 99903-3218

42

SELECT06

Exibir o nome dos clientes que moram em rua (LIKE)

SELECT07

Exibir a média de preço dos produtos do tipo ‘02’

SELECT08

Exibir todos os dados dos produtos (*) em ordem crescente de descrição (ORDER BY)

SELECT09

Exibir todos os dados dos clientes do tipo ‘03’e (AND) que tenham mais de 1.7m de altura em ordem decrescente de nome

SELECT10

Exibir quantas vendas foram feitas (COUNT) feitas para o cliente ‘0001’

SELECT11

Exibir a descrição dos produtos do tipo ‘01’, ’03’ e ‘05’ (IN)

Page 153: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 5

www.grandeporte.com.br (11) 4427-4579(11) 99903-3218

43

5

SELECT12

Exibir o preço dos produtos mais caros por tipo de produto (MAX e GROUP BY)

SELECT13

Exibir a média da altura dos clientes por tipo de cliente (AVG e GROUP BY)

SELECT14

Exibir o nome e a data de nascimento dos clientes maiores ou iguais a 18 anos. (YEAR e CURRENT DATE)

SELECT15

Exibir o nome e a descrição do tipo de cliente (JOIN)

SELECT16

Exibir a descrição dos produtos comprados por clientes do tipo ‘04’ (SUB-QUERIE)

Page 154: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 5

www.grandeporte.com.br (11) 4427-4579(11) 99903-3218

44

SELECT17

Exibir sem repetição, o nome dos clientes que compraram produtos do tipo ‘03’em ordem crescente de nome. (JOIN ou SUB-QUERIE)

SELECT18

Exibir o valor de cada compra feita pelo cliente ‘0002’(JOIN)

SELECT19

Exibir o valor do total de compras feitas pelo cliente ‘0001’ no mês e ano correntes. (JOIN)

Page 155: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 5

www.grandeporte.com.br (11) 4427-4579(11) 99903-3218

45

5

SELECT20

Exibir o nome dos clientes que compraram mais de R$ 1.000,00 em produtos do tipo ‘01’. (JOIN / SUB-QUERIE)

SELECT21

Exibir a descrição do tipo de produto que os clientes do tipo ‘03` compraram mais de 10 unidades por compra. (JOIN / SUB-QUERIE)

Page 156: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 5

www.grandeporte.com.br (11) 4427-4579(11) 99903-3218

46

Monte os UPDATEs para as alterações abaixo.

Os membros do arquivo particionado GP.GPXXNN.JCLDATA conterão os

comandos SQL DML para os UPDATEs de acordo com a numeração dada ao

exercício.

Membro Alteração Solicitada

UPDATE1

Aumentar o preço dos produtos do tipo ‘01’ em 15%

UPDATE2

Alterar os clientes do tipo ‘01’para tipo ‘03’

UPDATE3

Alterar para tipo ‘05’ os clientes nascidos depois de 1980 com mais de 1.6m de altura

UPDATE4

Abaixar os preços dos produtos nunca que foram vendidos em 10%

Atividade UPDATE

Page 157: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 5

www.grandeporte.com.br (11) 4427-4579(11) 99903-3218

47

5

Monte os DELETEs para as exclusões abaixo.

Os membros do arquivo particionado GP.GPXXNN.JCLDATA conterão os

comandos SQL DML para os DELETEs de acordo com a numeração dada ao

exercício.

Membro Exclusão solicitada

DELETE1

Excluir as vendas feitas para os clientes ‘0005’ e ‘0010’

DELETE2

Excluir os clientes que compraram os produtos ‘0001’ e ‘0003’

DELETE3

Excluir os produtos com preço entre R$ 500,00 e R$ 1500,00 e tipo de produto ‘01’

DELETE4

Excluir os produtos que nunca foram vendidos

Atividade DELETE

Lembrem-se das

Regras de integridade

Na exclusão

Cascade / delete / set null

Page 158: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 5

www.grandeporte.com.br (11) 4427-4579(11) 99903-3218

48

Avaliação Então...Como foi ?!?

Estou fera!

Fiz Certo!

Muito Bom Bom regular ruim Muito ruim

Page 159: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte

Ray Boyce foi um cientista da computaçãoamericano, mais conhecido por suas pesquisasem banco de dados relacionais. Trabalhou naIBM onde foi co-desenvolvedor da Forma Normal

Boyce-Codd (em parceria com Edgar FrankCodd) e da linguagem SQL (com Donald DonChamberlim)

Raymond Francis Boyce1947- 1974

Page 160: Grande Porte - COBOL Level 2 - Versão 2.2.3

Versão 2.2.3

Page 161: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 6

www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218

3

6

Antes de iniciarmos, vamos conversar sobre os tópicos apresentados na capa desta parte. Isso é importante para que seu instrutor e seus colegas saibam como está seu conhecimento sobre o assunto e se você precisa ou pode fornecer ajuda aos colegas e instrutor.

O que você já sabe?

O que você não sabe?

Porque é importante conhecer estes tópicos?

Quais são os seus temores?

O que você considera difícil?

Depois de falar sobre o assunto com seus colegas e instrutor, escreva,

desenhe, rabisque, diga algo sobre o que você vai fazer para dominar esses tópicos. Comprometa-se!

Preparation

Trocando Ideias É agora que você fala !!

Reflexão É aqui que você se compromete !!

Page 162: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 6

www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218

4

Chegou o momento de escrevermos o primeiro programa COBOL com DB2. É

agora que você irá aplicar seu conhecimento da SQL DML para que, via programa

COBOL possa manipular os dados armazenados nas tabelas do DB2.

Os arquivos VSAM (Virtual Storage Access Method), vistos no curso de COBOL

Level 1, estão aos poucos sendo substituídos por Banco de Dados armazenados em

DB2. Assim, é comum que novos sistemas já nasçam com a camada de dados

baseada em Sistemas Gerenciadores de Banco de Dados Relacional.

Há todo um jargão novo para aprender aqui, tais como DECLARATION, HOST

VARIABLES, INDICATOR, CURSOR, etc. Acostume-se com eles e utilize esse

linguajar durante seu treinamento. Assim, quando estiver em uma entrevista e utilizar

os termos certos para as situações certas, mostrará ao entrevistador que você está

preparado para os desafios de programação COBOL com DB2.

Presentation

História O PRIMEIRO PROGRAMA

Page 163: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 6

www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218

5

6

FORMATO DOS COMANDOS

Para codificar um comando SQL em COBOL basta colocá-lo entre as palavras

EXEC SQL e END-EXEC na margem B, como no modelo:

----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8

EXEC SQL

COMANDO SQL

END-EXEC

Exemplo:

----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8

EXEC SQL

DELETE FROM FUNCIONARIOS

WHERE DATAADMISSAO IS NOT NULL

END-EXEC

HOST VARIABLES

Quando se manipula os dados de tabelas em um programa COBOL, é preciso

primeiro anunciar (DECLARE) essas tabelas ao programa.

Por exemplo, dada a tabela EMPREGADO abaixo:

Antes do programa COBOL poder manipular seus dados, é preciso declará-la

na WORKING-STORAGE SECTION, como mostrado abaixo:

----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8

WORKING-STORAGE SECTION.

EXEC SQL

DECLARE EMPREGADO TABLE

(IDEMP INTEGER,

NOMEEMP CHAR(10),

SALARIOEMP DECIMAL(7,2),

DATAADMINEMP DATE)

END-EXEC

Teoria Programando em cobol

IDEMP NOMEEMP SALARIOEMP DATAADMINEMP

integer char(10) decimal(7,2) date

1 JOAO 1000.00 10/05/2000

2 JOSE 2000.00 11/06/2001

3 MARIA 3000.00 12/07/2002

Page 164: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 6

www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218

6

Essa declaração diz ao programa COBOL que será usada a tabela

EMPREGADO, composta pelas colunas (SQL FIELDS) IDEMP, NOMEEMP,

SALARIOEMP e DATAADMINEMP com seus respectivos tipos de dados. Como essa

declaração é um comando SQL, e não um comando COBOL é preciso delimitá-lo por

EXEC SQL e END-EXEC.

Quando os dados são trazidos dessas colunas para o COBOL, deve haver

variáveis correspondentes para receber esses dados. Para cada coluna da tabela

(SQL FIELDS) é preciso declarar uma variável COBOL correspondente (HOST

VARIABLE).

----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8

WORKING-STORAGE SECTION.

EXEC SQL

DECLARE EMPREGADO TABLE

(ID_EMP INTEGER,

NOME_EMP CHAR(10),

SALARIO_EMP DECIMAL(7,2),

DATAADMIN_EMP DATE)

END-EXEC.

01 WS-REG-EMPREGADO.

05 WS-ID-EMP PIC S9(9) COMP.

05 WS-NOME-EMP PIC X(10).

05 WS-SALARIO-EMP PIC S9(5)V99 COMP-3.

05 WS-DATAADMIN-EMP PIC X(10).

O processo de especificar o nome da tabela, colunas SQL (SQL FIELDS) e as

variáveis correspondentes no COBOL (HOST VARIABLES) é chamado de

DECLARATIONS.

A tabela abaixo mostra os SQL FIELDS e as HOST VARIABLES

correspondentes. É necessário haver uma compatibilidade completa entre o

formato do dado nas colunas das tabelas (SQL FIELDS) e as variável do COBOL

(HOST VARIABLE), pois ao contrário do COBOL que ajusta o formato dos dados nos

MOVEs, o DB2 não faz nenhuma conversão de formato nestas operações.

SQL Field Tipo de dado SQL Host Variable Tipo de dado COBOL

IDEMP INTEGER (4 Bytes) WS-IDEMP PIC S9(9) COMP.

NOMEEMP CHAR (10 Bytes) WS-NOMEEMP PIC X(10).

SALARIOEMP DECIMAL (4 Bytes) WS-SALARIOEMP PIC S9(5)V99 COMP-3.

DATAADMINEMP DATE (10 bytes) WS-DATAADMINEMP PIC X(10).

Qualquer variável definida no COBOL pode ser usada como HOST VARIABLE,

desde que seu formato seja completamente compativel (tamanho, PICTURE, casas

decimais etc) com a coluna da tabela com a qual troca dados.

Podemos fazer as declarações das tabelas manualmente, como visto

anteriormente, ou podemos gerá-las automaticamente pelo aplicativo chamado

DCLGEN (Declaration Generator Tool).Como mostra as telas a seguir:

Page 165: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 6

www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218

7

6

Para usar o painel do DCLGEN, a partir do menu principal do TSO, escolhemos

as opções D (DB2I) e 2 (DCLGEN). No painel preenchemos os seguintes campos:

1 Nome da tabela para a qual vamos criar as variáveis hospedeiras

4 Entre apóstrofes, o nome do arquivo particionado e seu membro, que conterá a

book das variáveis hospedeiras.

6 ADD quando for criar a book ou REPLACE quando a book já existe e será

atualizada.

Depois de pressionar a tecla ENTER, o terminal será notificado com a seguinte

mensagem, indicando o sucesso da operação:

Page 166: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 6

www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218

8

A área produzida pelo DCLGEN deve ser inserida na WORKING-STORAGE

SECTION do programa COBOL com o seguinte comando:

----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8

*----------------------------------------------------------------*

WORKING-STORAGE SECTION.

*----------------------------------------------------------------*

EXEC SQL

INCLUDE PRODUTO

END-EXEC

Mostramos abaixo um exemplo de declaração da tabela PRODUTO produzida

pelo DCLGEN:

----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8

******************************************************************

* DCLGEN TABLE(PRODUTO) *

* LIBRARY(GP.GPAZ99.JCLDATA(PRODUTO)) *

* LANGUAGE(COBOL) *

* QUOTE *

* ... IS THE DCLGEN COMMAND THAT MADE THE FOLLOWING STATEMENTS *

******************************************************************

EXEC SQL DECLARE PRODUTO TABLE

( CODPROD CHAR(4) NOT NULL,

DESCPROD VARCHAR(20) NOT NULL,

UNIDPROD CHAR(5),

LOCALPROD CHAR(5),

QTDEST DECIMAL(5, 0),

QTDMAX DECIMAL(5, 0),

QTDMIN DECIMAL(5, 0),

PRECOCOMPRA DECIMAL(8, 2),

PRECOVENDA DECIMAL(8, 2),

PERCOMIS DECIMAL(4, 2)

) END-EXEC.

******************************************************************

* COBOL DECLARATION FOR TABLE PRODUTO *

******************************************************************

01 DCLPRODUTO.

10 CODPROD PIC X(4).

10 DESCPROD.

49 DESCPROD-LEN PIC S9(4) USAGE COMP.

49 DESCPROD-TEXT PIC X(20).

10 UNIDPROD PIC X(5).

10 LOCALPROD PIC X(5).

10 QTDEST PIC S9(5)V USAGE COMP-3.

10 QTDMAX PIC S9(5)V USAGE COMP-3.

10 QTDMIN PIC S9(5)V USAGE COMP-3.

10 PRECOCOMPRA PIC S9(6)V9(2) USAGE COMP-3.

10 PRECOVENDA PIC S9(6)V9(2) USAGE COMP-3.

10 PERCOMIS PIC S9(2)V9(2) USAGE COMP-3.

******************************************************************

* THE NUMBER OF COLUMNS DESCRIBED BY THIS DECLARATION IS 10 *

******************************************************************

Todos os comandos SQL devem portanto usar HOST VARIABLES contidos

dentro destas áreas produzidas pelo DCLGEN. No exemplo acima estas variáveis

estão na área DCLPRODUTO.

O nome da variável hospedeira de nível 01 sempre será DCLnome-da-tabela.

Ela será usada quando se fizer uma leitura (SELECT) de todas as colunas (*) da

tabela.

Page 167: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 6

www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218

9

6

Existe uma equivalência na declaração de arquivos e tabelas. A figura abaixo

mostra essa equivalencia.

Precisamos contar ao COBOL sobre os arquivos e tabelas que o programa irá

manipular, bem como as variáveis espelho e hospedeira a serem usadas.

Variável Espelho

Variável Hospedeira

Declaration da Tabela

Definição do Arquivo

Page 168: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 6

www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218

10

Quando usadas nos comando SQL as HOST VARIABLES devem sempre estar

precedidas pelo caractere dois pontos(:). Se o compilador de comandos SQL encontra

o (:) antes de uma palavra, ela é interpretada como HOST VARIABLE, caso contrário é

interpretada como nome de coluna de tabela (SQL FIELD).

O exemplo abaixo mostra o de uso de variáveis hospedeiras. Um código de

funcionário é passado à variável hospedeira CODEMP e um SELECT faz o conteúdo

das colunas NOMEEMP e SALARIO carregarem as hospedeiras :NOMEEMP

e :SALARIO, para o funcionário “000001”. Depois essas variáveis são exibidas na

SYSOUT pelo comando DISPLAY.

----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8

MOVE “000001” TO CODEMP

EXEC SQL

SELECT NOMEEMP, SALARIO

INTO :NOMEEMP, :SALARIO

FROM EMPREGADOS

WHERE CODEMP = :CODEMP

END-EXEC

DISPLAY “CODIGO..: “ CODEMP

DISPLAY “NOME....: “ NOMEEMP

DISPLAY “SALARIO.: “ SALARIO

Observe que a variável hospedeira precisou usar os dois pontos (:) apenas no

comando SQL, isto é, entre EXEC-SQL e END-EXEC. No COBOL, a variável

hospedeira não precisa dos dois pontos (:).

EXEC SQL

DECLARE JULIETA

TABLE

Page 169: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 6

www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218

11

6

Use COPY para inserir book de arquivos, variáveis e rotinas em seu programa.

Lembre-se que é possível usar REPLACING para substituir coringas por strings que

você precisa. Exemplo:

----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8

COPY BK001D1 REPLACING ==::== BY ==WS-==.

Use INCLUDE para inserir as books de tabelas (DECLARATIONS) criadas pelo

DCLGEN ou por você mesmo. Só assim o compilador reconhecerá que se trata de

código especifico a ser tratado como SQL.

----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8

EXEC SQL

INCLUDE BK002TP

END-EXEC

Teoria Include x copy

Então eu disse a ele para fazer

COPY de book de arquivo e INCLUDE

de variáveis hospedeiras para as

tabelas, mas ele não me ouviu e ...

Page 170: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 6

www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218

12

Sempre que um comando SQL é executado, um código de retorno é gerado

automaticamente, semelhante ao FILE STATUS para os arquivos. É preciso declarar

uma book de variáveis chamada SQLCA (SQL Communication Area) que contém as

variáveis que armazenam esse retorno.

A principal variável da SQLCA é a SQLCODE, que será testada pelos

comandos do COBOL. Para declarar a SQLCA na WORKING-STORAGE dos

programas usamos a seguinte sintaxe:

----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8

*----------------------------------------------------------------*

WORKING-STORAGE SECTION.

*----------------------------------------------------------------*

EXEC SQL

INCLUDE SQLCA

END-EXEC

Esse INCLUDE carrega a seguinte área (BOOK de variáveis):

----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8

01 SQLCA.

05 SQLCAID PIC X(8).

05 SQLCABC PIC S9(9) COMP-4.

05 SQLCODE PIC S9(9) COMP-4.

05 SQLERRM.

49 SQLERRML PIC S9(4) COMP-4.

49 SQLERRMC PIC X(70).

05 SQLERRP PIC X(8).

05 SQLERRD OCCURS 6 TIMES

PIC S9(9) COMP-4.

05 SQLWARN.

10 SQLWARN0 PIC X.

10 SQLWARN1 PIC X.

10 SQLWARN2 PIC X.

10 SQLWARN3 PIC X.

10 SQLWARN4 PIC X.

10 SQLWARN5 PIC X.

10 SQLWARN6 PIC X.

10 SQLWARN7 PIC X.

05 SQLEXT.

10 SQLWARN8 PIC X.

10 SQLWARN9 PIC X.

10 SQLWARNA PIC X.

10 SQLSTATE PIC X(5).

Nem sempre o SQLCODE é suficiente para descobrir o motivo do não sucesso

na execução de um comando SQL. A variável SQLERRMC adiciona informações que

ajudam na análise do erro (mensagem de erro).

TeoriaTESTE DE ERRO NOS COMANDOS SQL(SQLCODE)

Page 171: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 6

www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218

13

6

Se a variável SQLWARN0 for igual a “ “ (espaço em branco), então as variáveis

de SQLWARN1 a SQLWARN6 estão em branco.

Mas se a variável SQLWARN0 for igual a “W”, significa que alguns SQLWARN

foram “setados” para “W”:

SQLWARN1 A string assinaladana variável Host foi truncada

SQLWARN2 Nulos ignorados no cálculo de uma função de coluna

SQLWARN3 Número de colunas maior que o de variáveis HOST

SQLWARN4 UPDATE ou DELETE “PREPARED” sem cláusula WHERE

SQLWARN5 Instrução SQL/DS inválida no DB2

SQLWARN6 Valor da Data ou Timestamp corrigidas de um valor inválido

resultante de uma operação aritmética.

Os valores a serem testados no SQLCODEsão:

SQLCODE = 0

Execução com sucesso.

SQLCODE < 0

Comando não foi executado. O codigo do erro é o valor do

SQLCODE.

SQLCODE > 0

O comando foi executado, com um WARNING dado pelo valor

do SQLCODE.

Os códigos de erro dados pelo SQLCODE podem ser encontrados no manual

de erros da IBM (DB2 MESSAGES AND CODES), mas a seguir temos alguns valores

importantes, que todo programador precisa saber:

SQLCODE = +100 Linha pesquisada não existe

SQLCODE = 0 Sucesso na execução do comando SQL

SQLCODE = -545 Há valores que não satisfazem as (CHECK CONSTRAINTS)

SQLCODE = -803 Linha com esta PRIMARY KEY já existe

0

Page 172: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 6

www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218

14

É necessário testar o código de retorno para todos os comandos SQL

executáveis (Os comandos DECLARE não são executáveis). Como a variável

SQLCODE é binária (PIC S9(9) COMP-4) é necessário movê-la para uma variável

formatada para poder ser exibida. Usaremos a variável WS-SQLCODE, como mostra

o exemplo:

----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8

WORKING-STORAGE SECTION.

EXEC SQL

INCLUDE SQLCA

END-EXEC

77 WS-SQLCODE PIC +9(9).

PROCEDURE DIVISION.

.

.

.

EXEC SQL

INSERT INTO PRODUTO

(CODPROD, DESCPROD, QTDMIN, QTDMAX, QTDEST)

VALUES

(:CODPROD, :DESCPROD, :QTDMIN, :QTDMAX, :QTDEST)

END-EXEC

EVALUATE SQLCODE

WHEN 0 ADD 1 TO WS-CT-GRAV

WHEN -803 DISPLAY "PRODUTO JA EXISTE"

WHEN -545 DISPLAY "PRODUTO COM DADOS INVALIDOS"

WHEN OTHER

MOVE "ERRO INSERT PRODUTO" TO WS-MSG

MOVE SQLCODE TO WS-SQLCODE

GO TO 9000-ERRO-DB2

END-EVALUATE

.

.

.

9000-ERRO-DB2.

DISPLAY “*-------------------------------------------------*“

DISPLAY “* ERRO AO ACESSAR O DB2 *“

DISPLAY “*-------------------------------------------------*“

DISPLAY “ MENSAGEM......: “ WS-MSG

DISPLAY “ SQLCODE.......: “ WS-SQLCODE

DISPLAY “ SQL MESSAGE...: “ SQLERRMC

DISPLAY “*-------------------------------------------------*“

DISPLAY “* TERMINO ANORMAL DO PROGRAMA *“

DISPLAY “*-------------------------------------------------*“

MOVE +12 TO RETURN-CODE

STOP RUN

.

Page 173: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 6

www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218

15

6

A cláusula WHENEVER (sempre que) do DB2 pode ser usada para substituir

os testes do SQLCODE, ela define uma ação no programa para onde a execução

continuará quando ocorrer uma condição de erro apontada no WHENEVER.

O WHENEVER no entanto somente intercepta 3 condições de erro:

SQLWARNING Intercepta SQLCODE positivo diferente de +100 ou

SQLWAR0 = “W”

SQLERROR Intercepta SQLCODE negativo

NOT FOUND Intercepta SQLCODE = +100

Também só podem ser programadas 2 ações para processar os erros

interceptados:

GO TO parágrafo a execução se desvia para o parágrafo

CONTINUE a execução continua na próxima sentença

A instrução WHENEVER é substituída por códigos “IF...ELSE...END-IF” pelo

pré-compilador. O pré-compilador insere a condição equivalente logo após cada

instrução SQL do programa fonte.

Como resultado das definições acima, a sintaxe do WHENEVER pode ser uma

das seguintes:

----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8

PROCEDURE DIVISION.

EXEC SQL

WHENEVER condicao

GO TO paragrafo

END-EXEC

ou

EXEC SQL

WHENEVER condicao

CONTINUE

END-EXEC

Teoria WHENEVER

NOT FOUND

SQLWARNING

SQLERROR

0 100

Page 174: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 6

www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218

16

Exemplos:

Page 175: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 6

www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218

17

6

É possível não criar um parágrafo principal na PROCEDURE DIVISION

porque o pré-compilador acrescenta uma SECTION (DSNSQL SECTION) com os

parágrafos SQL-SKIP, SQL-INITIAL e SQL-INITIEND. O parágrafo SQL-INITIAL varia

em função dos comandos SQL e das tabelas em uso pelo programa. Abaixo temos um

exemplo para o programa de carga (INSERT).

----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8

*-------------------------------------------------------------*

PROCEDURE DIVISION.

*-------------------------------------------------------------*

*000-ROTINA-PRINCIPAL.

DSNSQL SECTION.

SQL-SKIP.

GO TO SQL-INIT-END.

SQL-INITIAL.

MOVE 1 TO SQL-INIT-FLAG.

CALL 'DSNHADDR' USING SQL-VPARMPTR OF SQL-PLIST2 SQL-PVAR-LIS

- T2.

CALL 'DSNHADDR' USING SQL-PVAR-ADDRS OF SQL-PLIST2 CODPROD OF

DCLPRODUTO SQL-NULL DESCPROD OF DCLPRODUTO SQL-NULL UNIDPROD

OF DCLPRODUTO SQL-NULL LOCALPROD OF DCLPRODUTO SQL-NULL QTDES

- T OF DCLPRODUTO SQL-NULL QTDMAX OF DCLPRODUTO SQL-NULL QTDMIN

OF DCLPRODUTO SQL-NULL PRECOCOMPRA OF DCLPRODUTO SQL-NULL PRE

- COVENDA OF DCLPRODUTO SQL-NULL PERCOMIS OF DCLPRODUTO SQL-NUL

- L

CALL 'DSNHADDR' USING SQL-CODEPTR OF SQL-PLIST2 SQLCA.

SQL-INIT-END.

PERFORM 010-INICIALIZAR

PERFORM 030-PROCESSAR

UNTIL CADPRDD1-EOF

PERFORM 040-TERMINO

STOP RUN

.

Porém se for colocado no parágrafo principal, o compilador produzirá uma

INFORMATIONAL MESSAGE (não é erro) com os seguintes dizeres:

the paragraph or section prior to paragraph or section

“000-ROTINA-PRINCIPAL” did not contain any statements.

TeoriaProcedure division com ou sem Parágrafo principal

Page 176: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 6

www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218

18

A síntaxe do comando para incluir linhas em uma tabela é a mesma vista nos

conceitos de SQL DML, somente acrescentando que os argumentos informados em

VALUES podem ser constantes ou HOST VARIABLES.

----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8

PROCEDURE DIVISION.

.......

EXEC SQL

INSERT INTO tabela

(coluna1, coluna2, ...)

VALUES

(:variavel1,:variavel2, ...)

END-EXEC

IF SQLCODE NOT = 0

MOVE “ERRO NO INSERT” TO WS-MSG

MOVE SQLCODE TO WS-SQLCODE

GO TO 9000-ERRO-DB2

END-IF

Se alguma das colunas do comando INSERT for do tipo VARCHAR,

ahospedeira com –LEN (length) precisa ser carregado com o comprimento total do

valor da coluna e a hospedeira com –TEXT recebe o conteúdo alfanumérico. Exemplo:

----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8

PROCEDURE DIVISION.

.......

MOVE 10 TO DESCRICAO-LEN

MOVE WS-DESCRICAO-M TO DESCRICAO-TEXT

EXEC SQL

INSERT INTO PRODUTO

(CODIGO, DESCRICAO, ...)

VALUES

(:CODIGO, :DESCRICAO, ...)

END-EXEC

EVALUATE SQLCODE

WHEN 0

ADD 1 TO WS-CTINSERIDO

WHEN -803

ADD 1 TO WS-CTDUPLICADO

WHEN ANOTHER

MOVE “ERRO NO INSERT” TO WS-MSG

MOVE SQLCODE TO WS-SQLCODE

GO TO 9000-ERRO-DB2

END-EVALUATE

Teoria Incluindo linhas na tabela

Page 177: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 6

www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218

19

6

Objetivo do Programa

Carregar a tabela TBCLIENTE com base em um arquivo sequencial CADCLI.

Macro-Fluxo

Exemplo Programa de carga

TBCLIENTE

CADCLI

EXECARGA

Page 178: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 6

www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218

20

Layout do Arquivo

BOOK CADCLI

----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8

******************************************************************

* BOOK DO ARQUIVO - CADASTRO DE CLIENTE *

* NOME DA BOOK - BKEXEAC *

* NOME DO PDS - GP.GPXXNN.BOOKLIB *

* NOME DO ARQUIVO - CADCLI *

* TAMANHO DO REGISTRO - 151 BYTES *

******************************************************************

01 ::REG-CADCLI.

03 ::CODCLI-CADCLI PIC X(04).

03 ::NOMECLI-CADCLI PIC X(30).

03 ::ENDCLI-CADCLI PIC X(40).

03 ::FONECLI-CADCLI PIC X(09).

03 ::EMAILCLI-CADCLI PIC X(50).

03 ::CPFCLI-CADCLI PIC X(11).

03 ::SALDOCLI-CADCLI PIC 9(05)V99.

Nome do Arquivo CADCLI

Nome do Registro REG-CADCLI

Nome do Campo Tipo e Tamanho

Descrição

CODCLI-CADCLI PIC X(04) Código do cliente

NOMECLI-CADCLI PIC X(30) Nome do cliente

ENDCLI-CADCLI PIC X(40) Endereço do cliente

FONECLI-CADCLI PIC X(09) Telefone do cliente

EMAILCLI-CADCLI PIC X(50) E-mail do cliente

CPFCLI-CADCLI PIC X(11) CPF do cliente

SALDOCLI-CADCLI PIC 9(05)V99 Saldo do cliente

Page 179: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 6

www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218

21

6

Layout da Tabela

DECLARATION da tabela TBCLIENTE

----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8

******************************************************************

* DCLGEN TABLE(TBCLIENTE) *

* LIBRARY(GP.GPAZ99.BOOKLIB(BKEXETC)) *

* LANGUAGE(COBOL) *

* QUOTE *

* DBCSDELIM(NO) *

* ... IS THE DCLGEN COMMAND THAT MADE THE FOLLOWING STATEMENTS *

******************************************************************

EXEC SQL DECLARE TBCLIENTE TABLE

( CODCLI CHAR(4) NOT NULL,

NOMECLI VARCHAR(30) NOT NULL,

ENDCLI VARCHAR(40),

FONECLI CHAR(9),

EMAILCLI VARCHAR(50),

CPFCLI CHAR(11),

SALDOCLI DECIMAL(9,2)

) END-EXEC.

******************************************************************

* COBOL DECLARATION FOR TABLE TBCLIENTE *

******************************************************************

01 DCLTBCLIENTE.

10 CODCLI PIC X(4).

10 NOMECLI.

49 NOMECLI-LEN PIC S9(4) USAGE COMP.

49 NOMECLI-TEXT PIC X(30).

10 ENDCLI.

49 ENDCLI-LEN PIC S9(4) USAGE COMP.

49 ENDCLI-TEXT PIC X(40).

10 FONECLI PIC X(9).

10 EMAILCLI.

49 EMAILCLI-LEN PIC S9(4) USAGE COMP.

49 EMAILCLI-TEXT PIC X(50).

10 CPFCLI PIC X(11).

10 SALDOCLI PIC 9(05)V99.

******************************************************************

* THE NUMBER OF COLUMNS DESCRIBED BY THIS DECLARATION IS 6 *

******************************************************************

Nome do Tabela TBCLIENTE

Nome do Campo Tipo e Tamanho Complemento

CODCLI CHAR(04) UNIQUE NOT NULL

NOMECLI VARCHAR(30) NOT NULL

ENDCLI VARCHAR(40)

FONECLI CHAR(09)

EMAILCLI VARCHAR(50)

CPFCLI CHAR(11)

SALDOCLI DECIMAL(9,2)

Page 180: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 6

www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218

22

Layout da SYSOUT

1 2 3 4 5

12345678901234567890123456789012345678901234567890

**************************************************

* DATA GREGORIANA 1 - 99/99/2099 *

* DATA GREGORIANA 2 - 99 DE XXXXXXXXX DE 2099 *

* DATA JULIANA – 999 DE 2099 *

* DIA DA SEMANA – XXXXXXXXXXXXX *

**************************************************

==================================================

== ESTATISTICA FINAL DE PROCESSAMENTO ==

==================================================

QTDE. PRODUTOS LIDOS CADPRDD1........: ZZ.ZZ9

QTDE. PRODUTOS INSERIDOS TBPRODUTO...: ZZ.ZZ9

QTDE. PRODUTOS DUPLICADOS............: ZZ.ZZ9

QTDE. PRODUTOS INVALIDOS.............: ZZ.ZZ9

==================================================

TEMPO TOTAL DE PROCESSAMENTO.........: HH:MM:SS:CC

==================================================

== TERMINO NORMAL DO PROGRAMA EXECARGA ==

==================================================

BOOK VARDATA

----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8

* VARIAVEL DA DATA *

01 WS-DATA-SISTEMA.

05 WS-ANO PIC 9(02).

05 WS-MES PIC 9(02).

05 WS-DIA PIC 9(02).

01 WS-DATA-JUL.

05 WS-ANO-J PIC 9(02).

05 WS-DIA-J PIC 9(03).

01 WS-DATA-SISTEMA-F.

05 WS-DIA PIC 9(02).

05 FILLER PIC X(01)

VALUE "/".

05 WS-MES PIC 9(02).

05 FILLER PIC X(01)

VALUE "/".

05 FILLER PIC X(02)

VALUE "20".

05 WS-ANO PIC 9(02).

77 WS-MES-EXT PIC X(09).

77 WS-DIA-SEMANA PIC 9.

77 WS-DIA-SEMANA-F PIC X(13).

Page 181: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 6

www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218

23

6

BOOK VARTEMPO

----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8

*----------------------------------------------------------------*

* VARIAVEL DO HORARIO *

*----------------------------------------------------------------*

01 WS-HORARIO-INICIAL.

05 WS-HORA-I PIC 9(02).

05 WS-MIN-I PIC 9(02).

05 WS-SEG-I PIC 9(02).

05 WS-CENT-I PIC 9(02).

01 WS-HORARIO-FINAL.

05 WS-HORA-F PIC 9(02).

05 WS-MIN-F PIC 9(02).

05 WS-SEG-F PIC 9(02).

05 WS-CENT-F PIC 9(02).

01 WS-TEMPO-PROCESSAMENTO.

05 WS-HORA-P PIC 9(02).

05 FILLER PIC X(01)

VALUE ":".

05 WS-MIN-P PIC 9(02).

05 FILLER PIC X(01)

VALUE ":".

05 WS-SEG-P PIC 9(02).

05 FILLER PIC X(01)

VALUE ":".

05 WS-CENT-P PIC 9(02).

77 WS-DIFERENCA PIC 9(07).

BOOK ROTINA DE CÁLCULO DO TEMPO DE PROCESSAMENTO

----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8

*----------------------------------------------------------------*

* ROTINA PARA CALCULO DO TEMPO DE PROCESSAMENTO BASEADO NA *

* DIFERENCA EM CENTESIMOS DE SEGUNDO ENTRE O INICIO E O *

* TERMINO DO PROCESSAMENTO. *

*----------------------------------------------------------------*

9000-CALCULA-TEMPO-PROC.

COMPUTE WS-DIFERENCA = ( WS-HORA-F * 360000 +

WS-MIN-F * 6000 +

WS-SEG-F * 100 +

WS-CENT-F ) -

( WS-HORA-I * 360000 +

WS-MIN-I * 6000 +

WS-SEG-I * 100 +

WS-CENT-I )

COMPUTE WS-HORA-P = WS-DIFERENCA / 360000

COMPUTE WS-DIFERENCA = WS-DIFERENCA - WS-HORA-P * 360000

COMPUTE WS-MIN-P = WS-DIFERENCA / 6000

COMPUTE WS-DIFERENCA = WS-DIFERENCA - WS-MIN-P * 6000

COMPUTE WS-SEG-P = WS-DIFERENCA / 100

COMPUTE WS-DIFERENCA = WS-DIFERENCA - WS-SEG-P * 100

COMPUTE WS-CENT-P = WS-DIFERENCA

.

Page 182: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 6

www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218

24

BOOK ROTINA IMPRIME DATA

----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8

*----------------------------------------------------------------*

* ROTINA PARA DETERMINAR E IMPRIMIR *

* A) DATA GREGORIANA *

* B) DATA JULIANA *

* C) DIA DA SEMANA *

*----------------------------------------------------------------*

9000-IMPRIME-DATA.

ACCEPT WS-DATA-SISTEMA FROM DATE

ACCEPT WS-DATA-JUL FROM DAY

ACCEPT WS-DIA-SEMANA FROM DAY-OF-WEEK

EVALUATE WS-DIA-SEMANA

WHEN 1 MOVE "SEGUNDA-FEIRA" TO WS-DIA-SEMANA-F

WHEN 2 MOVE "TERCA-FEIRA" TO WS-DIA-SEMANA-F

WHEN 3 MOVE "QUARTA-FEIRA" TO WS-DIA-SEMANA-F

WHEN 4 MOVE "QUINTA-FEIRA" TO WS-DIA-SEMANA-F

WHEN 5 MOVE "SEXTA-FEIRA" TO WS-DIA-SEMANA-F

WHEN 6 MOVE "SABADO" TO WS-DIA-SEMANA-F

WHEN 7 MOVE "DOMINGO" TO WS-DIA-SEMANA-F

END-EVALUATE

MOVE CORR WS-DATA-SISTEMA TO WS-DATA-SISTEMA-F

EVALUATE WS-MES OF WS-DATA-SISTEMA

WHEN 1 MOVE "JANEIRO" TO WS-MES-EXT

WHEN 2 MOVE "FEVEREIRO" TO WS-MES-EXT

WHEN 3 MOVE "MARCO" TO WS-MES-EXT

WHEN 4 MOVE "ABRIL" TO WS-MES-EXT

WHEN 5 MOVE "MAIO" TO WS-MES-EXT

WHEN 6 MOVE "JUNHO" TO WS-MES-EXT

WHEN 7 MOVE "JULHO" TO WS-MES-EXT

WHEN 8 MOVE "AGOSTO" TO WS-MES-EXT

WHEN 9 MOVE "SETEMBRO" TO WS-MES-EXT

WHEN 10 MOVE "OUTUBRO" TO WS-MES-EXT

WHEN 11 MOVE "NOVEMBRO" TO WS-MES-EXT

WHEN 12 MOVE "DEZEMBRO" TO WS-MES-EXT

END-EVALUATE

DISPLAY "************************************************"

DISPLAY "* DATA GREGORIANA 1 - "

WS-DATA-SISTEMA-F

" *"

DISPLAY "* DATA GREGORIANA 2 - "

WS-DIA OF WS-DATA-SISTEMA

" DE "

WS-MES-EXT

" DE 20"

WS-ANO OF WS-DATA-SISTEMA

" *"

DISPLAY "* DATA JULIANA - "

WS-DIA-J OF WS-DATA-JUL

" DE 20"

WS-ANO-J OF WS-DATA-JUL

" *"

DISPLAY "* DIA DA SEMANA - "

WS-DIA-SEMANA-F

" *"

DISPLAY "************************************************"

.

Page 183: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 6

www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218

25

6

Programa COBOL

----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8

*----------------------------------------------------------------*

ID DIVISION.

*----------------------------------------------------------------*

PROGRAM-ID. EXECARGA.

*----------------------------------------------------------------*

ENVIRONMENT DIVISION.

*----------------------------------------------------------------*

CONFIGURATION SECTION.

SPECIAL-NAMES.

DECIMAL-POINT IS COMMA.

INPUT-OUTPUT SECTION.

FILE-CONTROL.

SELECT CADCLI ASSIGN TO UT-S-CADCLI

FILE STATUS IS FS-CADCLI

.

*----------------------------------------------------------------*

DATA DIVISION.

*----------------------------------------------------------------*

FILE SECTION.

FD CADCLI

RECORDING MODE IS F.

COPY BKEXEAC REPLACING ==::== BY ====.

*----------------------------------------------------------------*

WORKING-STORAGE SECTION.

*----------------------------------------------------------------*

* BOOK DA VARIAVEL ESPELHO

COPY BKEXEAC REPLACING ==::== BY ==WS-==.

* BOOK DAS VARIAVEIS PARA CALCULO DO TEMPO

COPY VARDATA.

COPY VARTEMPO.

* BOOK DAS VARIAVEIS HOSPEDEIRAS

EXEC SQL

INCLUDE BKEXETC

END-EXEC

* BOOK DAS VARIAVEIS PARA USO DO SQL

EXEC SQL

INCLUDE SQLCA

END-EXEC

01 WS-CONTADORES-COMP.

05 WS-CTLIDO PIC 9(04) COMP.

05 WS-CTINS PIC 9(04) COMP.

05 WS-CTDUP PIC 9(04) COMP.

05 WS-CTINV PIC 9(04) COMP.

Page 184: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 6

www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218

26

----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8

01 WS-CONTADORES-FORMATADOS.

05 WS-CTLIDO-F PIC ZZZ9.

05 WS-CTINS-F PIC ZZZ9.

05 WS-CTDUP-F PIC ZZZ9.

05 WS-CTINV-F PIC ZZZ9.

01 FS-CADCLI PIC X(02).

88 SUCESSO-CAD VALUE "00".

88 FIM-ARQ-CAD VALUE "10".

77 WS-SQLCODE PIC +9(9).

77 WS-MSG PIC X(60).

77 WS-FS PIC X(02).

*----------------------------------------------------------------*

PROCEDURE DIVISION.

*----------------------------------------------------------------*

0000-PRINCIPAL.

PERFORM 1000-INICIALIZAR

PERFORM 2000-PROCESSAR UNTIL FIM-ARQ-CAD

PERFORM 3000-TERMINO

STOP RUN

.

1000-INICIALIZAR.

ACCEPT WS-HORARIO-INICIAL FROM TIME

MOVE 0 TO WS-CTLIDO

WS-CTINS

WS-CTDUP

WS-CTINV

OPEN INPUT CADCLI

IF NOT SUCESSO-CAD

MOVE "ERRO ABERTURA CADCLI" TO WS-MSG

MOVE FS-CADCLI TO WS-FS

PERFORM 9000-ERRO

END-IF

PERFORM 1500-LER-CADCLI

.

1500-LER-CADCLI.

READ CADCLI INTO WS-REG-CADCLI

IF SUCESSO-CAD

ADD 1 TO WS-CTLIDO

ELSE

IF NOT FIM-ARQ-CAD

MOVE "ERRO LEITURA CADCLI"

TO WS-MSG

MOVE FS-CADCLI TO WS-FS

PERFORM 9000-ERRO

END-IF

END-IF

.

Page 185: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 6

www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218

27

6

----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8

2000-PROCESSAR.

*----------------------------------------------------------------*

* MOVER DADOS DA VARIAVEL ESPELHO PARA A HOSPEDEIRA

*----------------------------------------------------------------*

MOVE WS-CODCLI-CADCLI TO CODCLI

MOVE +30 TO NOMECLI-LEN

MOVE WS-NOMECLI-CADCLI TO NOMECLI-TEXT

MOVE +40 TO ENDCLI-LEN

MOVE WS-ENDCLI-CADCLI TO ENDCLI-TEXT

MOVE WS-FONECLI-CADCLI TO FONECLI

MOVE +50 TO EMAILCLI-LEN

MOVE WS-EMAILCLI-CADCLI TO EMAILCLI-TEXT

MOVE WS-CPFCLI-CADCLI TO CPFCLI

MOVE WS-SALDOCLI-CADCLI TO SALDOCLI

*----------------------------------------------------------------*

* INSERIR OS DADOS DA HOSPEDEIRA NA TABELA (SQL FIELDS)

*----------------------------------------------------------------*

EXEC SQL

INSERT INTO TBCLIENTE

( CODCLI

, NOMECLI

, ENDCLI

, FONECLI

, EMAILCLI

, CPFCLI

, SALDOCLI

)

VALUES

( :CODCLI

,:NOMECLI

,:ENDCLI

,:FONECLI

,:EMAILCLI

,:CPFCLI

,:SALDOCLI

)

END-EXEC

*----------------------------------------------------------------*

* TESTAR SQLCODE

*----------------------------------------------------------------*

EVALUATE SQLCODE

WHEN 0

ADD 1 TO WS-CTINS

WHEN -803

ADD 1 TO WS-CTDUP

WHEN -545

ADD 1 TO WS-CTINV

WHEN OTHER

MOVE "ERRO INSERT TBCLIENTE"

TO WS-MSG

MOVE SQLCODE TO WS-SQLCODE

PERFORM 9000-ERRO-DB2

END-EVALUATE

PERFORM 1500-LER-CADCLI

.

Page 186: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 6

www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218

28

----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8

3000-TERMINO.

CLOSE CADCLI

IF NOT SUCESSO-CAD

MOVE "ERRO FECHAMENTO CADCLI"

TO WS-MSG

MOVE FS-CADCLI TO WS-FS

PERFORM 9000-ERRO

END-IF

ACCEPT WS-HORARIO-FINAL FROM TIME

PERFORM 9000-CALCULA-TEMPO-PROC

MOVE WS-CTLIDO TO WS-CTLIDO-F

MOVE WS-CTINS TO WS-CTINS-F

MOVE WS-CTDUP TO WS-CTDUP-F

MOVE WS-CTINV TO WS-CTINV-F

PERFORM 9000-IMPRIME-DATA

DISPLAY " "

DISPLAY " "

DISPLAY "=================================================="

DISPLAY "== ESTATISTICA FINAL DE PROCESSAMENTO =="

DISPLAY "=================================================="

DISPLAY "QTDE. CLIENTES LIDOS CADCLI..........: " WS-CTLIDO-F

DISPLAY "QTDE. CLIENTES INSERIDOS TBCLIENTE...: " WS-CTINS-F

DISPLAY "QTDE. CLIENTES DUPLICADOS............: " WS-CTDUP-F

DISPLAY "QTDE. CLIENTES INVALIDOS.............: " WS-CTINV-F

DISPLAY "=================================================="

DISPLAY "TEMPO TOTAL DE PROCESSAMENTO.........: "

WS-TEMPO-PROCESSAMENTO

DISPLAY "=================================================="

DISPLAY "== TERMINO NORMAL DO PROGRAMA EXECARGA =="

DISPLAY "=================================================="

.

9000-ERRO.

DISPLAY "=================================================="

DISPLAY "MENSAGEM....: " WS-MSG

DISPLAY "FILE STATUS.: " WS-FS

DISPLAY "=================================================="

DISPLAY "== TERMINO ANORMAL DO PROGRAMA EXECARGA =="

DISPLAY "=================================================="

MOVE 12 TO RETURN-CODE

STOP RUN

.

9000-ERRO-DB2.

DISPLAY "=================================================="

DISPLAY "MESSAGE..: " WS-MSG

DISPLAY "SQLCODE..: " WS-SQLCODE

DISPLAY "SQLERRMC.: " SQLERRMC

DISPLAY "=================================================="

DISPLAY "== TERMINO ANORMAL DO PROGRAMA EXECARGA =="

DISPLAY "=================================================="

MOVE 16 TO RETURN-CODE

STOP RUN

.

* BOOK DA ROTINA 9000-IMPRIME-DATA

COPY IMPDATA.

* BOOK DA ROTINA 9000-CALCULA-TEMPO-PROC

COPY CALCTEMP.

Page 187: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 6

www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218

29

6

Criar a tabela TESTEDCL descrita abaixo e

preencher o quadro com os tipos de dados gerados para

o COBOL pelo DCLGEN. (membro CREATET no

JCLDATA).

Coluna

Tipo DB2

Tipo COBOL

CAMPO01 CHAR(5)

CAMPO02 VARCHAR(20)

CAMPO03 INTEGER

CAMPO04 SMALLINT

CAMPO05 DECIMAL(10,4)

CAMPO06 REAL

CAMPO07 DOUBLE

CAMPO08 DATE

CAMPO09 TIME

CAMPO10 TIMESTAMP

Practice

Atividade Prática de laboratório

Page 188: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 6

www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218

30

Fazer a DECLARATION para a tabela TBCLI,

baseado nos tipos dados gerados pelo DCLGEN do

exercício anterior e nas colunas abaixo.

CODCLI INTEGER UNIQUENOT NULL

NOMECLI VARCHAR(40) NOT NULL

ENDCLI VARCHAR(60)

NASCCLI DATE

ALTURACLI DECIMAL(3,2)

PESOCLI DECIMAL(4,1)

WORKING-STORAGE SECTION.

Atividade Revisão aos pares

Page 189: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 6

www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218

31

6

Objetivo do Programa

A Metal Screws Inc. está implantando o Sistema Gerenciador de banco de Dados DB2 e está migrando seus dados de arquivos sequenciais para tabelas em um banco de dados relacional.

Escrever um programa para ler os produtos do arquivo sequencial CADPRDD1 e carregar a tabela TBPRODUTO.

Macro-Fluxo

Atividade Projeto 1 - carga

Performance

TBPRODUTO

CADPRDD1

GPXXNND1

Page 190: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 6

www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218

32

Layout do Arquivo

Layout da Tabela

Nome do Arquivo CADPRDD1

Nome do Registro REG-CADPRDD1

Nome do Campo Tipo e Tamanho

Descrição

CODPROD-D1 X(04) Código

DESCPROD-D1 X(20) Descrição

UNIDPROD-D1 X(05) Unidade (caixa, litro, Kg, etc)

LOCALPROD-D1 X(05) Localização no estoque

QTDEST-D1 9(05) Quantidade em estoque

QTDMAX-D1 9(05) Quantidade máxima em estoque

QTDMIN-D1 9(05) Quantidade mínima em estoque

PRECOCOMPRA-D1 9(06)V99 Preço de Compra

PRECOVENDA-D1 9(06)V99 Preço de Venda

PERCOMIS-D1 9(02)V99 Percentual de comissão

Nome da tabela TBPRODUTO

Nome da coluna Tipo e Tamanho

Complementos

CODPROD CHAR(4) UNIQUE NOT NULL

DESCPROD VARCHAR(20) NOT NULL

UNIDPROD CHAR(5)

LOCALPROD CHAR(5)

QTDEST DECIMAL(5,0)

QTDMAX DECIMAL(5,0) > QTDMIN

QTDMIN DECIMAL(5,0) < QTDMAX

PRECOCOMPRA DECIMAL(8,2) >=0

PRECOVENDA DECIMAL(8,2) >=0

PERCOMIS DECIMAL(4,2) >=0

Page 191: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 6

www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218

33

6

Layout da SYSOUT

1 2 3 4 5

12345678901234567890123456789012345678901234567890

**************************************************

* DATA GREGORIANA 1 - 99/99/2099 *

* DATA GREGORIANA 2 - 99 DE XXXXXXXXX DE 2099 *

* DATA JULIANA – 999 DE 2099 *

* DIA DA SEMANA – XXXXXXXXXXXXX *

**************************************************

==================================================

== ESTATISTICA FINAL DE PROCESSAMENTO ==

==================================================

QTDE. PRODUTOS LIDOS CADPRDD1........: ZZ.ZZ9

QTDE. PRODUTOS INSERIDOS TBPRODUTO...: ZZ.ZZ9

QTDE. PRODUTOS DUPLICADOS............: ZZ.ZZ9

QTDE. PRODUTOS INVALIDOS.............: ZZ.ZZ9

==================================================

TEMPO TOTAL DE PROCESSAMENTO.........: HH:MM:SS:CC

==================================================

== TERMINO NORMAL DO PROGRAMA GPXXNND1 ==

==================================================

Observação

Dar carga em tabelas a partir de dados armazenados em arquivos

sequenciais é uma atividade comum na implantação de um sistema novo. Execute

os passos abaixo (Lembre-se de que XXNN é o seu prefixo de usuário):

1) Edite o membro BK001D1 em sua BOOKLIB com as variáveis espelho do

arquivo CADPRDD1. (Usar coringa vazio ::)

2) Copie o membro CREATEP da JCLDATA de seu instrutor para a sua

JCLDATA. Esse membro contém os comandos SQL DDL para a definição

da tabela TBPRODUTO, índice, chave primária e constraints.

3) Via SPUFI execute o membro CREATEP, criando a tabela TBPRODUTO e

seu índice IDXPRODUTO.

4) Via DCLGEN crie a DECLARATION para a tabela TBPRODUTO em sua

BOOKLIB no membro BK002TP

5) Edite o programa GPXXNND1 na sua COBLIB.

Page 192: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 6

www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218

34

Orientação para processamento

Como foi visto, não pode haver um parágrafo principal.

Executa o parágrafo 1000-INICIALIZAR

Executa o parágrafo 2000-PROCESSAR

até que o file status do arquivo CADPRDD1 seja “10”

Executar o parágrafo 3000-TERMINO

Encerrar o programa

Parágrafo 1000-INICIALIZAR

Receber o horário inicial de processamento

Mover zero para os contadores:

produtos lidos

produtos inseridos

produtos duplicados

produtos inválidos

Abrir para leitura o arquivo CADPRDD1

Se file status for diferente de “00”

Mover mensagem de erro para variável da rotina de erro

Mover file status para variáveis da rotina de erro

Executar rotina de erro (9000-ERRO)

Ler o primeiro registro do arquivo CADPRDD1 (1100-LER-CADPRDD1)

Parágrafo 1100-LER-CADPRDD1

Ler registro do arquivo CADPRDD1 carregando variável espelho

Se file status for igual a “00” (sucesso)

Somar 1 ao contador de produtos lidos

Senão

Se file status for diferente de “10” (fim de arquivo)

Mover mensagem de erro para variável da rotina de erro

Mover file status para variáveis da rotina de erro

Executar rotina de erro (9000-ERRO)

Page 193: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 6

www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218

35

6

Parágrafo 2000-PROCESSAR

Mover os dados da variável espelho para a hospedeira

Inserir o registro na tabela TBPRODUTO (INSERT) e testar SQLCODE:

se SQLCODE = 0

somar 1 ao contador de produto inserido

se SQLCODE = -803

somar 1 ao contador de produto duplicado

se SQLCODE = -545

somar 1 ao contador de produto inválidos

senão

mover mensagem de erro para variável da rotina de erro

mover SQLCODE para variável formatada

executar a rotina de erro para DB2 (9000-ERRO-DB2)

Ler o próximo registro do arquivo CADPRDD1(1100-LER-CADPRDD1)

Parágrafo 3000-TERMINO

Fechar o arquivo CADPRDD1

Se file status for diferente de “00”

Mover mensagem de erro para variável da rotina de erro

Mover file status para variáveis da rotina de erro

Executar rotina de erro (9000-ERRO)

Receber o horário final de processamento

Calcular o tempo de processamento

Exibir SYSOUT de acordo com LAYOUT

Exibir contador de produtos lidos

Exibir contador de produtos inseridos

Exibir contador de produtos duplicado

Exibir contador de produtos inválido

Exibir o tempo total de processamento

Parágrafo 9000-ERRO

Exibir mensagem de erro

Exibir file status

Abendar o programa com RETURN-CODE = 12

Parágrafo 9000-ERRO-DB2

Exibir mensagem de erro

Exibir SQLCODE formatado

Exibir SQLERRMC (mensagem de erro do SQLCODE)

Abendar o programa com RETURN-CODE = 16

Usar EVALUTE aqui,

entendeu ?

Page 194: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 6

www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218

36

Avaliação Então...Como foi ?!?

Estou fera!

Fiz Certo!

Muito Bom Bom regular ruim Muito ruim

Page 195: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte

Hugh Darwen é um cientista da computação quetrabalhou na IBM do Reino Unido de 1967 até 2004 eesteve envolvido com a história do modelo relacional.Entre 1978 e 1982 ele foi o arquiteto chefe do Business

System 12, um sistema de gerenciamento de dados queseguia fielmente os princípios do modelo relacional. Eletrabalhou próximo a Christopher J. Date e representou aIBM nos comites da ISO SQL até sua aposentadoria daIBM.

Hugh Darwen

1943 (69 anos)

Page 196: Grande Porte - COBOL Level 2 - Versão 2.2.3

Versão 2.2.3

Page 197: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 7

www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218

3

7

Antes de iniciarmos, vamos conversar sobre os tópicos apresentados na capa desta parte. Isso é importante para que seu instrutor e seus colegas saibam como está seu conhecimento sobre o assunto e se você precisa ou pode fornecer ajuda aos colegas e instrutor.

O que você já sabe ?

O que você não sabe ?

Porque é importante conhecer estes tópicos ?

Quais são os seus temores ?

O que você considera difícil ?

Depois de falar sobre o assunto com seus colegas e instrutor, escreva,

desenhe, rabisque, diga algo sobre o que você vai fazer para dominar esses tópicos. Comprometa-se!

Preparation

Trocando Ideias É agora que você fala !!

Reflexão É aqui que você se compromete !!

Page 198: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 7

www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218

4

Vamos agora colocar tudo junto. Escreveremos um programa que vai Inserir,

Excluir, Alterar e Consultar dados em uma tabela, tudo em um mesmo programa.

É a oportunidade de ver os quatro comandos da SQL DML funcionando junto,

testando seus SQLCODEs específicos, utilizando as variáveis hospedeiras (de

tabelas) com variáveis espelho (de arquivos) e ainda verificando pelos INDICATORs

se os dados lidos das tabelas estão corretos.

Mas antes, é importante entender como é o processo de transformar um

programa COBOL com SQL em programa executável (LOAD MODULE). Trata-se do

processo de Pré-Compilação, Compilação, Link-edição e Bind. Entenda bem esse

processo, pois sempre que você diz a alguém mais experiente que sabe programar

COBOL com SQL ele vai logo perguntando: — Você sabe o que é BIND?

Então vamos por tudo junto, ou em inglês Let´s put it all together.

Presentation

História Let´s put it all together

Page 199: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 7

www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218

5

7

Programas COBOL com comandos SQL estáticos passam por um processo de

compilação formado por quarto passos: Pré-compilação, Compilação, Link-edição e Bind. A

figura abaixo ilustra esses passos:

Teoria Compilando Cobol + sql(DB2)

Programa Fonte

COBOL

+

SQL

1º. Passo

PRE-COMPILE

Programa fonte

modificadosó COBOL

DBRM

Acessos DB2só SQL

2º. Passo

COMPILE

4º. Passo

BIND

BOOKs

LIBRARY

3º. Passo

LINK-EDIT

LOAD MODULEPACKAGE

COLLECTION

PLAN

PROGRAMA

OBJETO

GP.GPXXNN.COBLIB(GPXXNND1)

GP.GPXXNN.JOBLIB(COMPBDB2)

TIMESTAMP TIMESTAMP

TIMESTAMPGP.GERAL.LOADLIB(GPXXNND1)

p

d

s

SD.ST? JOBIDS SYSPRINT

SPOOL

A

TIMESTAMP

GP.GPXXNN.BOOKLIB(GPXXNND1)

i

k

SYS2.DB2.DBRMLIB.DATA(GPXXNND1)

SYSIBM.SYSPACKAGES

Page 200: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 7

www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218

6

1º Passo – Processo de Pré-Compilação

a) Primeiro ele verifica se há erros (análise sintática) nos comandos SQL.

b) Segundo ele faz o INCLUDE das áreas (book de variáveis), valida as variáveis

hospedeiras (host variables) e adiciona variáveis de trabalho (para uso interno)

na WORKING-STORAGE SECTION. Uma dessas variáveis contém a literal

“Timestamp” chamada Token de Consistência.

c) Terceiro ele insere código fonte compatível com o COBOL, usado para evocar

o DB2, convertendo as instruções EXEC SQL...END-EXEC em comentário,

substituindo-as por CALL.

d) Quarto ele extrai todos os comandos SQL do programa fonte, colocando-os

em um membro com o mesmo nome do programa no arquivo particionado em

SYS2.DB2.DBRMLIB.DATA. Esse membro contém o DBRM (Data Base

Request Module) com o mesmo Token de Consistência.

2º Passo – Compilação

O Programa fonte modificado pelo pré-compilador é então compilado. O

código é verificado em busca de erros e uma versão compilada (Programa Objeto) é

criada.

3º Passo – Link-edição

O programa objeto é link-editado junto com os calls estáticos do programa

fonte e os módulos run-time (em tempo de execução) do DB2 para criar o programa

executável LOAD MODULE (Módulo de Carga). Este LOAD MODULE contém o

mesmo Token de Consistência que foi gerado na Pré-Compilação.

4º Passo – BIND DB2 (Vinculo com DB2)

O processo de BIND lê o DBRM que foi criado e prepara um caminho de

acesso (access path) aos dados. Esse caminho de acesso, junto com o Token de

Consistência, é armazenado no catalogo do DB2 (SYSIBM.SYSPACKAGES) como

um PACKAGE (pacote). Cada pacote está ligado a uma lista de pacotes ou Collection

(coleção).

O nome da coleção é especificado pelo parâmetro PACKAGE.

Uma coleção é um grupo de pacotes que são inseridos em um ou mais planos.

O parâmetro qualifies (qualificador) do BIND é usado para direcionar o SQL para um

conjunto especifico de objetos DB2 (Table, View, Alias etc.) identificados por este

nome.

O plano ou pacote de aplicação é gerado pelo BIND para definir caminhos de

acesso.

O plano DB2 é uma forma executável de comandos SQL (DBRM). Podemos

definir o plano DB2 como um conjunto de ponteiros para pacotes, e pacotes contém

código de máquina dos melhores caminhos de acesso. O plano é criado

separadamente e não tem relação com a compilação.

Page 201: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 7

www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218

7

7

Abaixo temos o job de compilação COMPBDB2 seguido de instruções de uso.

1 – substitua GPXXNNPP pelo nome do programa que deseja compilar

2 – Substitua GPXXNN pelo seu usuário

3 – Esta é a instalação do DB2 que será usada para definir o plano de acesso

1

2

3

Quando eu criei o

primeiro compilador

as coisas eram mais

simples...

Essa IBM !

Grace Hopper e

a traca (BUG),

Amiga !

Page 202: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 7

www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218

8

Após a compilação, vá ao SPOOL (SD.ST) para analisar o resultado, conforme tela

abaixo:

1 – Quando aparecer somente esses três arquivos JES2, significa que há erro de

JCL e o JOB deve ser corrigido.

2 – Quando aparecer os arquivos PC (precompiler), significa que há erros nos

comandos SQL e o arquivo SYSPRINT COMPDB2B PC deve ser aberto em busca dos erros.

Atenção, a mensagem de notificação será JCL ERROR, mas não se engane, é erro de SQL.

3 – Quando aparecer o COB e der MAXCC > 0, há erros no COBOL. Esse arquivo

deve ser aberto e os erros corrigidos.

4 – Quando aparece o arquivo LKED, significa que o programa objeto (Load Module)

foi criado e pode ser executado.

5 – Quando aparece o arquivo BIND, significa que o plano de acesso foi criado com

sucesso, desde que MAXCC = 0.

1

2

34

5

Page 203: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 7

www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218

9

7

O JOB de execução também deve apontar para a instalação de DB2 correta, usada

para compilar os programas, como mostra a tela abaixo.

1 – substitua GPXXNNPP pelo número do programa que deseja executar

2 – Substitua GPXXNN pelo seu usuário

3 – Esta é a instalação do DB2 que será usada para definir o plano de acesso

Quando um programa COBOL+DB2 executa, o plano e o pacote devem ser

especificados no JOB. Quando o primeiro comando SQL do programa é executado, o

DB2 pesquisa na coleção e no Token de Consistência do plano e do pacote

informado. Se o Token de Consistência não bater, o DB2 dá um SQLCODE = -805.

13

2

Teoria EXECUTANDO COBOL + DB2

Page 204: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 7

www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218

10

Para se ler dados de uma tabela em um programa COBOL o comando básico

usado é o SELECT visto anteriormente. 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

o segundo processo quando a tabela resultado do SELECT contém mais de

uma linha.

ACESSANDO 1 LINHA DA TABELA

Quando a tabela resultado do SELECT contém somente uma linha, o

parâmetro INTO acrescentado ao SELECT é suficiente para definir as HOST

VARIABLES de leitura. A sintaxe deste SELECT é:

----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8

PROCEDURE DIVISION.

......

EXEC SQL

SELECT coluna1 , coluna2 , ...

INTO :variavel1, :variavel2, ...

FROM tabela

WHERE restricao

END-EXEC

A variável do parâmetro INTO deve ser uma HOST VARIABLE (portanto

precedida por dois pontos). Além disso, se a coluna pesquisa for do tipo VARCHAR ou

a sua definição permitir valores NULL, é necessério acrescentar um INDICATOR na

HOST VARIABLE respectiva.

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:

Teoria Acessando tabelas com cobol

Page 205: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 7

www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218

11

7

----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8

PROCEDURE DIVISION.

.......

EXEC SQL

SELECT *

INTO :DCLPRODUTO

FROM PRODUTO

WHERE CODPROD = ‘0001’

END-EXEC

IF SQLCODE = 0

ADD 1 TO WS-CTENCONTRADO

ELSE

IF SQLCODE = 100

ADD 1 TO WS-CTNAOENCONTRADO

ELSE

MOVE “ERRO NO SELECT” TO WS-MSG

MOVE SQLCODE TO WS-SQLCODE

PERFORM 9000-ERRO-DB2

END-IF

END-IF

ACESSANDO MAIS DE UMA LINHA DA TABELA

Quando o SELECT seleciona mais de uma linha, essa RESULT TABLE não

pode ser carregada na HOST VARIABLE apontada pela claúsula INTO, que comporta

apenas uma linha.

Se a lógica da aplicação estiver interessada apenas na primeira linha desta

RESULT TABLE, o parâmetro FETCH FIRST ROW ONLY (pegue apenas a primeira

linha) seleciona esta linha. A seguir a sintaxe deste SELECT

----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8

PROCEDURE DIVISION.

.......

EXEC SQL

SELECT coluna1 , coluna2, ...

INTO :variavel, :variavel2, ....

FROM tabela

WHERE restricao

FETCH FIRST ROW ONLY

END-EXEC

Exemplo:

----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8

PROCEDURE DIVISION.

.......

MOVE “000100” TO CODEMP

EXEC SQL

SELECT NOMEEMP, SALARIO

INTO :NOMEEMP, :SALARIO

FROM EMPREGADOS

WHERE CODEMP > :CODEMP

FETCH FIRST ROW ONLY

END-EXEC

Page 206: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 7

www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218

12

----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8

IF SQLCODE = 0

ADD 1 TO WS-CTENCONTRADO

ELSE

IF SQLCODE = 100

ADD 1 TO WS-CTNAOENCONTRADO

ELSE

MOVE “ERRO NO SELECT” TO WS-MSG

MOVE SQLCODE TO WS-SQLCODE

PERFORM 9000-ERRO-DB2

END-IF

END-IF

ATUALIZANDO LINHAS DA TABELA

A síntaxe do comando para atualizar linhas em uma tabela é a mesma vista no

comando UPDATE de SQL, somente acrescentando que os argumentos informados

em SET podem ser constantes ou HOST VARIABLES.

----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8

PROCEDURE DIVISION.

.......

EXEC SQL

UPDATE tabela

SET coluna1 = :VARIAVEL1,

coluna2 = :variavel2,

......

WHERE condicao

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.

Exemplo:

----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8

PROCEDURE DIVISION.

.......

MOVE 10 TO DESCRICAO-LEN

MOVE WS-DESCPROD TO DESCRICAO-TEXT

EXEC SQL

UPDATE PRODUTO

SET DESCRICAO = :DESCRICAO

WHERE CODIGO = :CODIGO

END-EXEC

IF SQLCODE = 0

ADD 1 TO WS-CTATUALIZADO

ELSE

IF SQL CODE = -545

ADD 1 TO WS-CTINVALIDO

ELSE

IF SQLCODE = +100

ADD 1 TO WS-CTNAOENCONTRADO

ELSE

MOVE “ERRO NO UPDATE” TO WS-MSG

MOVE SQLCODE TO WS-SQLCODE

PERFORM 9000-ERRO-DB2

END-IF

END-IF

END-IF

Page 207: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 7

www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218

13

7

EXCLUINDO LINHAS DA TABELA

A sintaxe do comando para excluir linhas em uma tabela é a mesma vista no

comando DELETE de SQL. A Sintaxe para o comando é:

----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8

PROCEDURE DIVISION.

.......

EXEC SQL

DELETE FROM tabela

WHERE restricao

END-EXEC

Exemplo:

----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8

PROCEDURE DIVISION.

.......

MOVE WS-CODPROD TO CODIGO

EXEC SQL

DELETE FROM PRODUTO

WHERE CODIGO = :CODIGO

END-EXEC

IF SQLCODE = 0

ADD 1 TO WS-CTEXCLUIDO

ELSE

IF SQLCODE = 100

ADD 1 TO WS-CTNAOENCONTRADO

ELSE

MOVE “ERRO NO DELETE” TO WS-MSG

MOVE SQLCODE TO WS-SQLCODE

PERFORM 9000-ERRO-DB2

END-IF

END-IF

Page 208: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 7

www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218

14

INDICATORS são variáveis do programa COBOL usadas nos comandos SQL

para:

Informar o comprimento real dos valores contidos em colunas VARCHAR.

Informar se uma coluna contém NULL.

Informar erros de conversão entre o valor das colunas e as HOST VARIABLES.

Este INDICATOR receberá um dos seguintes valores após a execução de um

SELECT:

INDICATOR = -1 Coluna contém NULL

INDICATOR = -2

Erro na conversão de valores. -2 significa nulo porque um

comando aritmético não funcionou, também causa SQLCODE =

+802

INDICATOR = 0 Coluna contém valores normais

INDICATOR > 0

Comprimento original dos dados que foram truncados no

momento da carga na HOST VARIABLE ou comprimento de um

VARCHAR

Teoria INDICATORS

INSERT DELETE UPDATE SELECT FETCH

**

* Precisam de INDICATORS

COBOL (VARIÁVEL HOSPERDEIRA)

DB2 (SQL FIELDS - COLUNAS)

Page 209: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 7

www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218

15

7

Os INDICATORS devem ser variáveis com formato PIC S9(4) COMP (lembre-

se que é o formato binário e ocupa 2 bytes na RAM), e quando necessário deve haver

um INDICATOR para cada coluna da tabela.

O DCLGEN cria automaticamente um INDICATOR para toda coluna VARCHAR.

No exemplo anterior para a coluna DESCPROD foram criadas as variáveis

hospedeiras DESCPROD–LEN (INDICATOR) e DESCPROD–TEXT.

Para solicitar ao DCLGEN a criação de INDICATOR para todas as colunas de

uma tabela, basta colocar YES no campo 12 (INDICATOR VAR), como mostra a figura

abaixo:

Page 210: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 7

www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218

16

Na declaração da tabela PRODUTO é criado um vetor IPRODUTO

(Inome_da_tabela) com seus elementos INDSTRUC(n) onde n varia de 1 até a

quantidade de colunas da tabela, em nosso exemplo 10.

----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8

******************************************************************

* DCLGEN TABLE(PRODUTO) *

* LIBRARY(GP.GPAZ99.BOOKLIB(PRODUTO)) *

* LANGUAGE(COBOL) *

* QUOTE *

* INDVAR(YES) *

* ... IS THE DCLGEN COMMAND THAT MADE THE FOLLOWING STATEMENTS *

******************************************************************

EXEC SQL DECLARE PRODUTO TABLE

( CODPROD CHAR(4) NOT NULL,

DESCPROD VARCHAR(20) NOT NULL,

UNIDPROD CHAR(5),

LOCALPROD CHAR(5),

QTDEST DECIMAL(5, 0),

QTDMAX DECIMAL(5, 0),

QTDMIN DECIMAL(5, 0),

PRECOCOMPRA DECIMAL(8, 2),

PRECOVENDA DECIMAL(8, 2),

PERCOMIS DECIMAL(4, 2)

) END-EXEC.

******************************************************************

* COBOL DECLARATION FOR TABLE PRODUTO *

******************************************************************

01 DCLPRODUTO.

10 CODPROD PIC X(4).

10 DESCPROD.

49 DESCPROD-LEN PIC S9(4) USAGE COMP.

49 DESCPROD-TEXT PIC X(20).

10 UNIDPROD PIC X(5).

10 LOCALPROD PIC X(5).

10 QTDEST PIC S9(5)V USAGE COMP-3.

10 QTDMAX PIC S9(5)V USAGE COMP-3.

10 QTDMIN PIC S9(5)V USAGE COMP-3.

10 PRECOCOMPRA PIC S9(6)V9(2) USAGE COMP-3.

10 PRECOVENDA PIC S9(6)V9(2) USAGE COMP-3.

10 PERCOMIS PIC S9(2)V9(2) USAGE COMP-3.

******************************************************************

* INDICATOR VARIABLE STRUCTURE *

******************************************************************

01 IPRODUTO.

10 INDSTRUC PIC S9(4) USAGE COMP OCCURS 10 TIMES.

******************************************************************

* THE NUMBER OF COLUMNS DESCRIBED BY THIS DECLARATION IS 10 *

******************************************************************

INDICATOR COLUNA

INDSTRUC(1) CODPROD

INDSTRUC(2) DESCPROD

INDSTRUC(3) UNIDPROD

INDSTRUC(4) LOCALPROD

INDSTRUC(5) QTDEST

INDSTRUC(6) QTDMAX

INDSTRUC(7) QTDMIN

INDSTRUC(8) PRECOCOMPRA

INDSTRUC(9) PRECOVENDA

INDSTRUC(10) PERCOMIS

Page 211: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 7

www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218

17

7

Para se codificar o INDICATOR, basta colocá-lo após a HOST VARIABLE,

precedido ou não pela palavra INDICATOR.

Sintaxes:

----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8

:variavel1 :indicator1, ...

ou

:variavel1 INDICATOR :indicator1, ...

Exemplo:

----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8

WORKING-STORAGE SECTION.

01 WS-INDICADORES.

05 INDNOMEEMP PIC 9S(4) COMP.

05 INDSALARIO PIC 9S(4) COMP.

PROCEDURE DIVISION.

MOVE “000001” TO CODEMP

EXEC SQL

SELECT CODEMP, NOMEEMP, SALARIO

INTO :CODEMP,

:NOMEEMP INDICATOR :INDNOMEEMP,

:SALARIO INDICATOR :INDSALARIO

FROM EMPREGADOS

WHERE CODEMP = :CODEMP

END-EXEC

Este exemplo lê o nome e salário do empregado 000001. Note que as variáveis

NOMEEMP, SALARIO e CODEMP 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 SECTION. Também a HOST VARIABLE

NOMEEMP esta acompanhada pelo seu INDICATOR INDNOMEEMP.

Se na definição da HOST VARIABLE, houver um sub-nível da variável para

servir como INDICATOR, o INDICATOR pode ser omitido na cláusula INTO. Exemplo:

----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8

WORKING-STORAGE SECTION.

.......

10 NOMEEMP.

49 NOMEEMP-TEXT PIC X(20).

49 NOMEEMP-LEN PIC S9(4) COMP.

PROCEDURE DIVISION.

.......

EXEC SQL

SELECT NOMEEMP, SALARIO

INTO :NOMEEMP, :SALARIO

FROM EMPREGADOS

WHERE CODDEP = :DEPTO

END-EXEC

Atenção, não pode haver vírgula entre a HOST VARIABLE e o seu INDICATOR.

Page 212: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 7

www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218

18

Qual coluna usar o indicator

Verifique no Declaration da tabela as colunas sem o NOT NULL. Elas podem

então assumir valores nulos, o que obriga o uso de INDICATOR. Aquelas com NOT

NULL têm a garantia do DB2 que jamais receberão valores nulos e, portanto, não

precisam de indicator.

Por exemplo, na declaration abaixo, apenas as colunas CODPROD e

DESCPROD não precisam de indicator:

----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8

******************************************************************

* DCLGEN TABLE(PRODUTO) *

* LIBRARY(GP.GPAZ99.BOOKLIB(PRODUTO)) *

* LANGUAGE(COBOL) *

* QUOTE *

* INDVAR(YES) *

* ... IS THE DCLGEN COMMAND THAT MADE THE FOLLOWING STATEMENTS *

******************************************************************

EXEC SQL DECLARE PRODUTO TABLE

( CODPROD CHAR(4) NOT NULL,

DESCPROD VARCHAR(20) NOT NULL,

UNIDPROD CHAR(5),

LOCALPROD CHAR(5),

QTDEST DECIMAL(5, 0),

QTDMAX DECIMAL(5, 0),

QTDMIN DECIMAL(5, 0),

PRECOCOMPRA DECIMAL(8, 2),

PRECOVENDA DECIMAL(8, 2),

PERCOMIS DECIMAL(4, 2)

) END-EXEC.

Mas, nada impede que você defina e use indicadores para essas colunas,

assim poderá tratar os valores positivos do INDICATOR. Por questão de organização,

coloque as variáveis indicadoras na WORKING-STORAGE, próximo dos DCLGENs.

No programa COBOL abaixo, temos um exemplo de uso dos INDICATORS

definidos pelo programador e pelo DCLGEN.

----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8

*----------------------------------------------------------------*

IDENTIFICATION DIVISION.

*----------------------------------------------------------------*

PROGRAM-ID. TESTEIND.

*----------------------------------------------------------------*

DATA DIVISION.

*----------------------------------------------------------------*

WORKING-STORAGE SECTION.

*----------------------------------------------------------------*

* BOOK COM A DECLARATION DA TABELA TBPRODUTO COM OS INDICATORS

* GERADOS VIA DCLGEN

EXEC SQL

INCLUDE BKTBPROD

END-EXEC

EXEC SQL

INCLUDE SQLCA

END-EXEC

Achei, são esses

em vermelho!

Page 213: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 7

www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218

19

7

----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8

* INDICATORS DEFINIDOS PELO PROGRAMADOR

01 WS-INDICADORES.

03 ICODPROD PIC S9(04) COMP.

03 IDESCPROD PIC S9(04) COMP.

03 IUNIDPROD PIC S9(04) COMP.

03 ILOCALPROD PIC S9(04) COMP.

03 IQTDEST PIC S9(04) COMP.

03 IQTDMIN PIC S9(04) COMP.

03 IQTDMAX PIC S9(04) COMP.

03 IPRECOCOMPRA PIC S9(04) COMP.

03 IPRECOVENDA PIC S9(04) COMP.

03 IPERCOMIS PIC S9(04) COMP.

77 WS-SQLCODE PIC +9(9).

77 WS-MSG PIC X(60).

PROCEDURE DIVISION.

......

* EXEMPLO DO USO DOS INDICATORS DEFINIDOS PELO PROGRAMADOR

EXEC SQL

SELECT CODPROD

,DESCPROD

,UNIDPROD

,LOCALPROD

,QTDEST

,QTDMIN

,QTDMAX

,PRECOCOMPRA

,PRECOVENDA

,PERCOMIS

INTO :CODPROD :ICODPROD

,:DESCPROD :IDESCPROD

,:UNIDPROD :IUNIDPROD

,:LOCALPROD :ILOCALPROD

,:QTDEST :IQTDEST

,:QTDMIN :IQTDMIN

,:QTDMAX :IQTDMAX

,:PRECOCOMPRA :IPRECOCOMPRA

,:PRECOVENDA :IPRECOVENDA

,:PERCOMIS :IPERCOMIS

FROM TBPRODUTO

WHERE CODPROD = '0300'

END-EXEC

MOVE SQLCODE TO WS-SQLCODE

DISPLAY "VALOR DO SQLCODE = " WS-SQLCODE

* DISPLAY DOS INDICATORS DEFINIDOS PELO PROGRAMADOR

DISPLAY "ICODPROD = " ICODPROD,

DISPLAY "IDESCPROD = " IDESCPROD,

DISPLAY "IUNIDPROD = " IUNIDPROD,

DISPLAY "ILOCALPROD = " ILOCALPROD,

DISPLAY "IQTDEST = " IQTDEST,

DISPLAY "IQTDMIN = " IQTDMIN,

DISPLAY "IQTDMAX = " IQTDMAX,

DISPLAY "IPRECOCOMPRA = " IPRECOCOMPRA,

DISPLAY "IPRECOVENDA = " IPRECOVENDA,

DISPLAY "IPERCOMIS = " IPERCOMIS,

DISPLAY "*---------------------------------------------*"

Page 214: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 7

www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218

20

----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8

* EXEMPLO DO USO DOS INDICATORS GERADOS VIA DCLGEN

EXEC SQL

SELECT *

INTO :DCLTBPRODUTO :INDSTRUC

FROM TBPRODUTO

WHERE CODPROD = '0300'

END-EXEC

MOVE SQLCODE TO WS-SQLCODE

DISPLAY "VALOR DO SQLCODE = " WS-SQLCODE

* DISPLAY DOS INDICATORS DDEFINIDOS PELO PROGRAMADOR

DISPLAY "INDSTRUC(01) = " INDSTRUC(01)

DISPLAY "INDSTRUC(02) = " INDSTRUC(02)

DISPLAY "INDSTRUC(03) = " INDSTRUC(03)

DISPLAY "INDSTRUC(04) = " INDSTRUC(04)

DISPLAY "INDSTRUC(05) = " INDSTRUC(05)

DISPLAY "INDSTRUC(06) = " INDSTRUC(06)

DISPLAY "INDSTRUC(07) = " INDSTRUC(07)

DISPLAY "INDSTRUC(08) = " INDSTRUC(08)

DISPLAY "INDSTRUC(09) = " INDSTRUC(09)

DISPLAY "INDSTRUC(10) = " INDSTRUC(10)

STOP RUN

.

Este é o resultado do código compilado e executado exibido na SYSOUT:

O valor 000J significa:

EBCDIC 000J

HEXADECIMAL FFFD

0001

Observe que o comando DISPLAY converte o conteúdo da variável binária

(USAGE COMP) para zonado. O número hexadecimal D, no primeiro byte indica que é

um número negativo. Temos então o resultado -1 para o INDICATOR, mostrando que

a respectiva coluna contém nulo.

Page 215: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 7

www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218

21

7

Objetivo do Programa

Atualizar a tabela TBCLIENTE com base na movimentação registrada no

arquivo sequencial MOVCLIDB.

Macro-Fluxo

Observação

No arquivo MOVCLIDB há o campo TIPOMOVTO-DB que indica o tipo de

movimento, conforme abaixo:

I inclusão de novo cliente

E exclusão de cliente

A alteração dos dados do cliente

C consulta clientes, exibindo na SYSOUT

outro erro de movimento, ignorar registro

Exemplo manutencão,

TBCLIENTE

MOVCLIDB

EXEMANUT

Page 216: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 7

www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218

22

Layout da SYSOUT

1 2 3 4 5 6

12345678901234567890123456789012345678901234567890123456789012

==============================================================

== CONSULTA DE CLIENTE ==

==============================================================

CODIGO....: XXXX

NOME......: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

ENDERECO .: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

TELEFONE..: XXXXXXXXX

EMAIL.....: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

CPF.......: XXX.XXX.XXX-XX

SALDO.....: R$ 99.999,99

==============================================================

1 2 3 4 5

12345678901234567890123456789012345678901234567890

**************************************************

* DATA GREGORIANA 1 - 99/99/2099 *

* DATA GREGORIANA 2 - 99 DE XXXXXXXXX DE 2099 *

* DATA JULIANA – 999 DE 2099 *

* DIA DA SEMANA – XXXXXXXXXXXXX *

**************************************************

1 2 3 4 5

12345678901234567890123456789012345678901234567890

==================================================

== ESTATISTICA FINAL DE PROCESSAMENTO ==

==================================================

QTDE. MOVIMENTOS LIDOS MOVCLIDB........: ZZ.ZZ9

QTDE. CLIENTES INSERIDOS TBCLIENTE.....: ZZ.ZZ9

QTDE. CLIENTES EXCLUIDOS TBCLIENTE.....: ZZ.ZZ9

QTDE. CLIENTES ALTERADOS TBCLIENTE.....: ZZ.ZZ9

QTDE. CLIENTES CONSULTADOS TBCLIENTE...: ZZ.ZZ9

QTDE. MOVIMENTOS INVALIDOS.............: ZZ.ZZ9

==================================================

TEMPO TOTAL DE PROCESSAMENTO.........: HH:MM:SS:CC

==================================================

== TERMINO NORMAL DO PROGRAMA EXEMANUT ==

==================================================

Page 217: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 7

www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218

23

7

Layout do Arquivo

Layout da Tabela

Nome do Arquivo MOVCLIDB

Nome do Registro REG-MOVCLIDB

Nome do Campo Tipo e Tamanho

Descrição

CODCLI-DB PIC X(04) Código do cliente

NOMECLI-DB PIC X(30) Nome do cliente

ENDCLI-DB PIC X(40) Endereço do cliente

FONECLI-DB PIC X(09) Telefone do cliente

EMAILCLI-DB PIC X(50) E-mail do cliente

CPFCLI-DB PIC X(11) CPF do cliente

SALDOCLI-DB PIC 9(05)V99 Saldo do cliente

TIPOMOVTO-DB PIC X(01) Tipo da movimentação

Nome do Tabela TBCLIENTE

Nome da Coluna Tipo e Tamanho Complemento

CODCLI CHAR(04) UNIQUE NOT NULL

NOMECLI VARCHAR(30) NOT NULL

ENDCLI VARCHAR(40)

FONECLI CHAR(09)

EMAILCLI VARCHAR(50)

CPFCLI CHAR(11)

SALDOCLI DECIMAL(7,2)

Page 218: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 7

www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218

24

BOOK BKEXEMC

----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8

******************************************************************

* BOOK DO ARQUIVO - MOVIMENTO DE CLIENTE *

* NOME DA BOOK - BKEXEMC *

* NOME DO PDS - GP.GPXXNN.BOOKLIB *

* NOME DO ARQUIVO - MOVCLIDB *

* TAMANHO DO REGISTRO - 152 BYTES *

******************************************************************

01 ::REG-MOVCLIDB.

03 ::CODCLI-DB PIC X(04).

03 ::NOMECLI-DB PIC X(30).

03 ::ENDCLI-DB PIC X(40).

03 ::FONECLI-DB PIC X(09).

03 ::EMAILCLI-DB PIC X(50).

03 ::CPFCLI-DB PIC X(11).

03 ::SALDOCLI-DB PIC 9(05)V99.

03 ::TIPOMOV-DB PIC X(01).

Programa COBOL

----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8

*----------------------------------------------------------------*

IDENTIFICATION DIVISION.

*----------------------------------------------------------------*

PROGRAM-ID. EXEMANUT.

*----------------------------------------------------------------*

ENVIRONMENT DIVISION.

*----------------------------------------------------------------*

CONFIGURATION SECTION.

SPECIAL-NAMES.

DECIMAL-POINT IS COMMA.

INPUT-OUTPUT SECTION.

FILE-CONTROL.

SELECT MOVCLIDB ASSIGN TO UT-S-MOVCLIDB

FILE STATUS IS FS-MOVCLIDB

.

*----------------------------------------------------------------*

DATA DIVISION.

*----------------------------------------------------------------*

FILE SECTION.

*----------------------------------------------------------------*

FD MOVCLIDB

RECORDING MODE IS F.

COPY BKEXEMC REPLACING ==::== BY ====.

*----------------------------------------------------------------*

WORKING-STORAGE SECTION.

*----------------------------------------------------------------*

* BOOK DA VARIAVEL ESPELHO

COPY BKEXEMC REPLACING ==::== BY ==WS-==.

Page 219: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 7

www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218

25

7

----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8

* BOOK DAS VARIAVEIS PARA CALCULO DO TEMPO

COPY VARDATA.

COPY VARTEMPO.

* BOOK DAS VARIAVEIS HOSPEDEIRAS DA TABELA TBCLIENTE

EXEC SQL

INCLUDE BKEXETC

END-EXEC

* INDICADORES DA TABELA TBCLIENTE

01 INDICADORES.

05 ICODCLI PIC S9(4) COMP.

05 INOMECLI PIC S9(4) COMP.

05 IENDCLI PIC S9(4) COMP.

05 IFONECLI PIC S9(4) COMP.

05 IEMAILCLI PIC S9(4) COMP.

05 ICPFCLI PIC S9(4) COMP.

05 ISALDOCLI PIC S9(4) COMP.

* AREA DE VARIAVEIS PARA O DB2

EXEC SQL

INCLUDE SQLCA

END-EXEC

01 WS-CONTADORES-COMP.

05 WS-CTLIDO PIC 9(05) COMP.

05 WS-CTINS PIC 9(05) COMP.

05 WS-CTEXC PIC 9(05) COMP.

05 WS-CTINV PIC 9(05) COMP.

05 WS-CTALT PIC 9(05) COMP.

05 WS-CTCON PIC 9(05) COMP.

01 WS-CONTADORES-FORMATADOS.

05 WS-CTLIDO-F PIC ZZ.ZZ9.

05 WS-CTINS-F PIC ZZ.ZZ9.

05 WS-CTEXC-F PIC ZZ.ZZ9.

05 WS-CTINV-F PIC ZZ.ZZ9.

05 WS-CTALT-F PIC ZZ.ZZ9.

05 WS-CTCON-F PIC ZZ.ZZ9.

01 FS-MOVCLIDB PIC X(02).

88 SUCESSO-MOVCLIDB VALUE "00".

88 FIM-ARQ-MOVCLIDB VALUE "10".

77 WS-SALDOCLI-F PIC ZZ.ZZ9,99.

77 WS-SQLCODE PIC +9(9).

77 WS-MSG PIC X(60).

77 WS-FS PIC X(02).

*----------------------------------------------------------------*

PROCEDURE DIVISION.

*----------------------------------------------------------------*

0000-EXEMANUT.

PERFORM 1000-INICIALIZAR

PERFORM 2000-PROCESSAR

UNTIL FS-MOVCLIDB = '10'

PERFORM 3000-TERMINO

STOP RUN

.

Page 220: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 7

www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218

26

----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8

1000-INICIALIZAR.

ACCEPT WS-HORARIO-INICIAL FROM TIME

INITIALIZE WS-CONTADORES-COMP

OPEN INPUT MOVCLIDB

IF NOT SUCESSO-MOVCLIDB

MOVE "ERRO ABERTURA MOVCLIDB"

TO WS-MSG

MOVE FS-MOVCLIDB TO WS-FS

PERFORM 9000-ERRO

END-IF

PERFORM 1500-LER-MOVCLIDB

.

1500-LER-MOVCLIDB.

READ MOVCLIDB INTO WS-REG-MOVCLIDB

IF SUCESSO-MOVCLIDB

ADD 1 TO WS-CTLIDO

ELSE

IF NOT FIM-ARQ-MOVCLIDB

MOVE "ERRO LEITURA MOVCLIDB"

TO WS-MSG

MOVE FS-MOVCLIDB TO WS-FS

PERFORM 9000-ERRO

END-IF

END-IF

.

2000-PROCESSAR.

EVALUATE WS-TIPOMOVTO-DB

WHEN "I" PERFORM 2100-INCLUSAO

WHEN "E" PERFORM 2200-EXCLUSAO

WHEN "A" PERFORM 2300-ALTERACAO

WHEN "C" PERFORM 2400-CONSULTAR

WHEN OTHER

ADD 1 TO WS-CTINV

END-EVALUATE

PERFORM 1500-LER-MOVCLIDB

.

Page 221: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 7

www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218

27

7

----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8

2100-INCLUSAO.

MOVE WS-CODCLI-DB TO CODCLI

MOVE +30 TO NOMECLI-LEN

MOVE WS-NOMECLI-DB TO NOMECLI-TEXT

MOVE +40 TO ENDCLI-LEN

MOVE WS-ENDCLI-DB TO ENDCLI-TEXT

MOVE WS-FONECLI-DB TO FONECLI

MOVE +50 TO EMAILCLI-LEN

MOVE WS-EMAILCLI-DB TO EMAILCLI-TEXT

MOVE WS-CPFCLI-DB TO CPFCLI

MOVE WS-SALDOCLI-DB TO SALDOCLI

EXEC SQL

INSERT INTO TBCLIENTE

( CODCLI

, NOMECLI

, ENDCLI

, FONECLI

, EMAILCLI

, CPFCLI

, SALDOCLI

)

VALUES

( :CODCLI

, :NOMECLI

, :ENDCLI

, :FONECLI

, :EMAILCLI

, :CPFCLI

, :SALDOCLI

)

END-EXEC

EVALUATE SQLCODE

WHEN 0 ADD 1 TO WS-CTINS

WHEN -803 ADD 1 TO WS-CTINV

WHEN -545 ADD 1 TO WS-CTINV

WHEN OTHER

MOVE "ERRO INSERT NA TABELA TBCLIENTE"

TO WS-MSG

MOVE SQLCODE TO WS-SQLCODE

PERFORM 9000-ERRO-DB2

END-EVALUATE

.

2200-EXCLUSAO.

MOVE WS-CODCLI-DB TO CODCLI

EXEC SQL

DELETE FROM TBCLIENTE

WHERE CODCLI = :CODCLI

END-EXEC

EVALUATE SQLCODE

WHEN 0 ADD 1 TO WS-CTEXC

WHEN +100 ADD 1 TO WS-CTINV

WHEN OTHER

MOVE "ERRO DELETE NA TABELA TBCLIENTE"

TO WS-MSG

MOVE SQLCODE TO WS-SQLCODE

PERFORM 9000-ERRO-DB2

END-EVALUATE

.

Page 222: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 7

www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218

28

----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8

2300-ALTERACAO.

MOVE WS-CODCLI-DB TO CODCLI

EXEC SQL

SELECT CODCLI

, NOMECLI

, ENDCLI

, FONECLI

, EMAILCLI

, CPFCLI

, SALDOCLI

INTO :CODCLI

,:NOMECLI

,:ENDCLI :IENDCLI

,:FONECLI :IFONECLI

,:EMAILCLI :IEMAILCLI

,:CPFCLI :ICPFCLI

,:SALDOCLI :ISALDOCLI

FROM TBCLIENTE

WHERE CODCLI = :CODCLI

END-EXEC

EVALUATE SQLCODE

WHEN 0

PERFORM 9000-TRATA-INDICATOR

PERFORM 2310-UPDATE

WHEN +100

ADD 1 TO WS-CTINV

WHEN OTHER

MOVE "ERRO SELECT DO UPDATE NA TABELA TBCLIENTE"

TO WS-MSG

MOVE SQLCODE TO WS-SQLCODE

PERFORM 9000-ERRO-DB2

END-EVALUATE

.

Page 223: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 7

www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218

29

7

----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8

2310-UPDATE.

* TESTE DA VARIAVEL ESPELHO

IF WS-NOMECLI-DB NOT = SPACES

MOVE +30 TO NOMECLI-LEN

MOVE WS-NOMECLI-DB TO NOMECLI-TEXT

END-IF

IF WS-ENDCLI-DB NOT = SPACES

MOVE +40 TO ENDCLI-LEN

MOVE WS-ENDCLI-DB TO ENDCLI-TEXT

END-IF

IF WS-FONECLI-DB NOT = SPACES

MOVE WS-FONECL-DB TO FONECLI

END-IF

IF WS-EMAILCLI-DB NOT = SPACES

MOVE +50 TO EMAILCLI-LEN

MOVE WS-EMAILCLI-DB TO EMAILCLI-TEXT

END-IF

IF WS-CPFCLI-DB NOT = SPACES

MOVE WS-CPFCLI-DB TO CPFCLI

END-IF

IF WS-SALDOCLI-DB IS NUMERIC

MOVE WS-SALDOCLI-DB TO SALDOCLI

END-IF

EXEC SQL

UPDATE TBCLIENTE

SET NOMECLI = :NOMECLI

,ENDCLI = :ENDCLI

,FONECLI = :FONECLI

,EMAILCLI = :EMAILCLI

,CPFCLI = :CPFCLI

,SALDOCLI = :SALDOCLI

WHERE CODCLI = :CODCLI

END-EXEC

EVALUATE SQLCODE

WHEN 0 ADD 1 TO WS-CTALT

WHEN +100 ADD 1 TO WS-CTINV

WHEN -545 ADD 1 TO WS-CTINV

WHEN OTHER

MOVE "ERRO UPDATE NA TABELA TBCLIENTE"

TO WS-MSG

MOVE SQLCODE TO WS-SQLCODE

PERFORM 9000-ERRO-DB2

END-EVALUATE

.

Page 224: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 7

www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218

30

----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8

2400-CONSULTAR.

MOVE WS-CODCLI-DB TO CODCLI

EXEC SQL

SELECT CODCLI

, NOMECLI

, ENDCLI

, FONECLI

, EMAILCLI

, CPFCLI

, SALDOCLI

INTO :CODCLI

,:NOMECLI

,:ENDCLI :IENDCLI

,:FONECLI :IFONECLI

,:EMAILCLI :IEMAILCLI

,:CPFCLI :ICPFCLI

,:SALDOCLI :ISALDOCLI

FROM TBCLIENTE

WHERE CODCLI = :CODCLI

END-EXEC

EVALUATE SQLCODE

WHEN 0 ADD 1 TO WS-CTCON

PERFORM 9000-TRATA-INDICATOR

PERFORM 9000-EXIBE-CONSULTA

WHEN +100 ADD 1 TO WS-CTINV

WHEN OTHER

MOVE "ERRO CONSULTA NA TABELA TBCLIENTE"

TO WS-MSG

MOVE SQLCODE TO WS-SQLCODE

PERFORM 9000-ERRO-DB2

END-EVALUATE

.

3000-TERMINO.

CLOSE MOVCLIDB

IF NOT SUCESSO-MOVCLIDB

MOVE "ERRO FECHAMENTO MOVCLIDB"

TO WS-MSG

MOVE FS-MOVCLIDB TO WS-FS

PERFORM 9000-ERRO

END-IF

ACCEPT WS-HORARIO-FINAL FROM TIME

PERFORM 9000-CALCULA-TEMPO-PROC

MOVE WS-CTLIDO TO WS-CTLIDO-F

MOVE WS-CTINS TO WS-CTINS-F

MOVE WS-CTEXC TO WS-CTEXC-F

MOVE WS-CTINV TO WS-CTINV-F

MOVE WS-CTCON TO WS-CTCON-F

MOVE WS-CTALT TO WS-CTALT-F

Page 225: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 7

www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218

31

7

----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8

PERFORM 9000-IMPRIME-DATA

DISPLAY "=================================================="

DISPLAY "== ESTATISTICA FINAL DE PROCESSAMENTO =="

DISPLAY "=================================================="

DISPLAY "QTDE. MOVIMENTOS LIDOS MOVCLIDB.... .: " WS-CTLIDO-F

DISPLAY "QTDE. CLIENTES INSERIDOS TBCLIENTE. .: " WS-CTINS-F

DISPLAY "QTDE. CLIENTES EXCLUIDOS TBCLIENTE. .: " WS-CTEXC-F

DISPLAY "QTDE. CLIENTES ALTERADOS TBCLIENTE. .: " WS-CTALT-F

DISPLAY "QTDE. CLIENTES CONSULTADOS TBCLIENTE.: " WS-CTCON-F

DISPLAY "QTDE. MOVIMENTOS INVALIDOS...........: " WS-CTINV-F

DISPLAY "=================================================="

DISPLAY "TEMPO TOTAL DE PROCESSAMENTO.........: "

WS-TEMPO-PROCESSAMENTO

DISPLAY "=================================================="

DISPLAY "== TERMINO NORMAL DO PROGRAMA EXEMANUT =="

DISPLAY "=================================================="

.

9000-TRATA-INDICATOR.

* TESTE DOS INDICATORS

IF IENDCLI LESS ZERO

MOVE SPACES TO ENDCLI

END-IF

IF IFONECLI LESS ZERO

MOVE SPACES TO FONECLI

END-IF

IF IEMAILCLI LESS ZERO

MOVE SPACES TO EMAILCLI

END-IF

IF ICPFCLI LESS ZERO

MOVE SPACES TO CPFCLI

END-IF

IF ISALDOCLI LESS ZERO

MOVE ZEROS TO SALDOCLI

END-IF

.

9000-EXIBE-CONSULTA.

MOVE SALDOCLI TO WS-SALDOCLI-F

DISPLAY "=================================================="

DISPLAY "== CONSULTA DE CLIENTE =="

DISPLAY "=================================================="

DISPLAY "CODIGO....: " CODCLI

DISPLAY "NOME......: " NOMECLI-TEXT

DISPLAY "ENDERECO .: " ENDCLI-TEXT

DISPLAY "TELEFONE..: " FONECLI

DISPLAY "E-MAIL....: " EMAILCLI-TEXT

DISPLAY "CPF.......: " CPFCLI

DISPLAY "SALDO.....: R$ " WS-SALDOCLI-F

DISPLAY "=================================================="

.

9000-ERRO.

DISPLAY "=================================================="

DISPLAY "MENSAGEM....: " WS-MSG

DISPLAY "FILE STATUS.: " WS-FS

DISPLAY "=================================================="

DISPLAY "== TERMINO ANORMAL DO PROGRAMA EXEMANUT =="

DISPLAY "=================================================="

MOVE 12 TO RETURN-CODE

STOP RUN

.

Page 226: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 7

www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218

32

----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8

9000-ERRO-DB2.

DISPLAY "=================================================="

DISPLAY "MESSAGE..: " WS-MSG

DISPLAY "SQLCODE..: " WS-SQLCODE

DISPLAY "SQLERRMC.: " SQLERRMC

DISPLAY "SQLCA....: " SQLCA

DISPLAY "=================================================="

DISPLAY "== TERMINO ANORMAL DO PROGRAMA EXEMANUT =="

DISPLAY "=================================================="

MOVE 16 TO RETURN-CODE

STOP RUN

.

* BOOK DA ROTINA PARA CALCULO DE PROCESSAMENTO

COPY CALCTEMP.

* ROTINA QUE EXIBE AS DATAS FORMATADAS

COPY IMPDATA.

Page 227: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 7

www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218

33

7

Associe as etapas do processo de compilação

com as ações executadas.

a) Pré-Compilação

b) Compilação

c) Link-edição

d) Bind

( ) Extrair os comandos SQL do programa fonte e colocá-lo em um membro chamado DBRM ( Data Base Request Module).

( ) Verificar o programa em busca de erros de sintaxe e semântica.

( ) Fazer include das áreas (Book das Variáveis).

( ) Cria um caminho de acesso (Access Path) as tabelas do DB2, estabelecendo uma relação entre um programa de aplicações e seus dados relacionais.

( ) Verificar se há erros nos comandos SQL.

( ) Ligar o fonte compilado com as funções de acesso a arquivos (CALL) e módulos DB2 RUN-TIME para criar um programa objeto (LOAD MODULE).

( ) Inserir código fonte compatível com o COBOL para invocar o DB2.

Practice

Atividade Revisão aos pares

Page 228: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 7

www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218

34

Marque com X os argumentos entre SQLCODE e

SQLDML onde o erro pode ocorrer.

SQL DML

SELECT INSERT UPDATE DELETE

0

+100

-803

-545

Atividade Revisão aos pares

Page 229: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 7

www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218

35

7

Coloque entre os parênteses o valor do

INDICATOR para cada uma das ocorrências abaixo.

( ) Coluna com valores normais

( ) Comprimento do dado em um VARCHAR

( ) Erro na conversão de valores

( ) Coluna com valor NULL

( ) Comprimento original do dado que foi truncado no momento da carga na HOST Variable

Atividade Trabalho em dupla

Page 230: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 7

www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218

36

Execute os passos abaixo (Lembre-se de que

XXNN é o seu prefixo de usuário):

1) Copie o membro COMPBDB2, da JOBLIB de seu instrutor, para a sua

JOBLIB.

2) Alterá-lo, substituindo XXNN pelo seu prefixo de usuário. Usá-lo para

compilar o programa GPXXNND1 até obter MAXCC = 0.

3) Copie o membro EXECOBD1, da JOBLIB de seu instrutor, para a sua

JOBLIB.

4) Alterar o JOB EXECOBD1, substituindo XXNN pelo seu prefixo de usuário.

5) Executar o JOB e comparar o resultado com os de seus colegas.

Anote abaixo os valores dos contadores que foram exibidos na SYSOUT

==================================================

== ESTATISTICA FINAL DE PROCESSAMENTO ==

==================================================

QTDE. PRODUTOS LIDOS CADPRDD1........: ___________

QTDE. PRODUTOS INSERIDOS TBPRODUTO...: ___________

QTDE. PRODUTOS DUPLICADOS............: ___________

QTDE. PRODUTOS INVALIDOS.............: ___________

==================================================

TEMPO TOTAL DE PROCESSAMENTO.........: ___________

==================================================

== TERMINO NORMAL DO PROGRAMA GPXXNND1 ==

==================================================

Atividade Prática de laboratório

Page 231: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 7

www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218

37

7

Objetivo do Programa

A Metal Screws Inc. implantou um Sistema Gerenciador de banco de Dados DB2 e já migrou seus dados de produtos que estavam em arquivo sequencial para a tabela TBPRODUTO.

Precisamos agora escrever um programa para atualizar a tabela TBPRODUTO

com base na movimentação de estoque registrada no arquivo sequencial MOVPRDD2.

Macro-Fluxo

Performance

Atividade Projeto 2 - manutenção

TBPRODUTO

MOVPRDD2

GPXXNND2

Page 232: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 7

www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218

38

Layout do Arquivo

Layout da Tabela

Nome do Arquivo MOVPRDD2

Nome do Registro REG-MOVPRDD2

Nome do Campo Tipo e Tamanho

Descrição

CODPROD-D2 X(04) Código

DESCPROD-D2 X(20) Descrição

UNIDPROD-D2 X(05) Unidade (caixa, litro, Kg, etc)

LOCALPROD-D2 X(05) Localização no estoque

QTDEST-D2 9(05) Quantidade em estoque

QTDMAX-D2 9(05) Qtde máxima em estoque

QTDMIN-D2 9(05) Qtde mínima em estoque

PRECOCOMPRA-D2 9(06)V99 Preço de Compra

PRECOVENDA-D2 9(06)V99 Preço de Venda

PERCOMIS-D2 9(02)V99 Percentual de comissão

TIPOMOVTO-D2 X(01) Tipo de movimento (I,E,A,C)

Nome da tabela TBPRODUTO

Nome da coluna Tipo e Tamanho

Complementos

CODPROD CHAR(4) UNIQUE NOT NULL

DESCPROD VARCHAR(20) NOT NULL

UNIDPROD CHAR(5)

LOCALPROD CHAR(5)

QTDEST DECIMAL(5,0)

QTDMAX DECIMAL(5,0) > QTDMIN

QTDMIN DECIMAL(5,0) < QTDMAX

PRECOCOMPRA DECIMAL(8,2) >=0

PRECOVENDA DECIMAL(8,2) >=0

PERCOMIS DECIMAL(4,2) >=0

Page 233: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 7

www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218

39

7

Layout da SYSOUT

1 2 3 4 5

12345678901234567890123456789012345678901234567890

==================================================

== CONSULTA DE PRODUTOS ==

==================================================

CODIGO...................: 9999

DESCRICAO................: XXXXXXXXXXXXXXXXXXXX

UNIDADE DE VENDA.........: XXXXX

LOCALIZACAO NO ESTOQUE...: XXXXX

QTDE. EM ESTOQUE.........: ZZ.ZZ9

QTDE. MAXIMA ARMAZENADA..: ZZ.ZZ9

QTDE. MINIMA ARMAZENADA..: ZZ.ZZ9

PRECO DE COMPRA..........: ZZZ.ZZ9,99

PRECO DE VENDA...........: ZZZ.ZZ9,99

PERCENTUAL DE COMISSAO...: Z9,99

==================================================

1 2 3 4 5

12345678901234567890123456789012345678901234567890

**************************************************

* DATA GREGORIANA 1 - 99/99/2099 *

* DATA GREGORIANA 2 - 99 DE XXXXXXXXX DE 2099 *

* DATA JULIANA – 999 DE 2099 *

* DIA DA SEMANA – XXXXXXXXXXXXX *

**************************************************

1 2 3 4 5

12345678901234567890123456789012345678901234567890

==================================================

== ESTATISTICA FINAL DE PROCESSAMENTO ==

==================================================

QTDE. PRODUTOS LIDOS MOVPRDD2..........: ZZ.ZZ9

QTDE. PRODUTOS INSERIDOS TBPRODUTO...: ZZ.ZZ9

QTDE. PRODUTOS EXCLUIDOS TBPRODUTO...: ZZ.ZZ9

QTDE. PRODUTOS ALTERADOS TBPRODUTO...: ZZ.ZZ9

QTDE. PRODUTOS CONSULTADOS TBPRODUTO...: ZZ.ZZ9

QTDE. MOVIMENTOS INVALIDOS.............: ZZ.ZZ9

==================================================

TEMPO TOTAL DE PROCESSAMENTO.........: HH:MM:SS:CC

==================================================

== TERMINO NORMAL DO PROGRAMA GPXXNND2 ==

==================================================

Page 234: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 7

www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218

40

Observação

No arquivo MOVPRDD2 há o campo TIPOMOVTO-D2 que indica o tipo de

movimento, conforme abaixo:

I inclusão de novo produto

E exclusão de produto

A alteração dos dados do produto

C consulta produtos, exibindo na SYSOUT

outro erro de movimento, ignorar registro

Fazer manutenção em tabelas com base em movimentos gravados em

arquivos sequenciais é um processamento comum nas empresas. Execute os

passos abaixo (Lembre-se de que XXNN é o seu prefixo de usuário):

1) Edite o membro BK002D2 em sua BOOKLIB com as variáveis espelho do

arquivo MOVPRDD2.

2) Edite o programa GPXXNND2 em sua COBLIB.

3) Altere o JOB COMPBDB2 para compilar o programa GPXXNND2 e

compilar até obter MAXCC = 0

4) Copiar para seu particionado JCLDATA o membro INSNULL, da JCLDATA

de seu instrutor. Execute-o via SPUFI (opção do TSO D;1). Isso fará o

INSERT de linhas com colunas NULL em sua tabela TBPRODUTO.

5) Copie o membro EXECOBD2, da JOBLIB de seu instrutor, para a sua

JOBLIB.

6) Alterar o JOB EXECOBD2, substituindo XXNN pelo seu prefixo de usuário.

7) Executar o JOB e comparar o resultado com os de seus colegas.

Page 235: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 7

www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218

41

7

Anote abaixo os valores dos contadores que foram exibidos na SYSOUT

==================================================

== ESTATISTICA FINAL DE PROCESSAMENTO ==

==================================================

QTDE. PRODUTOS LIDOS MOVPRDD2..........: _________

QTDE. PRODUTOS INSERIDOS TBPRODUTO...: _________

QTDE. PRODUTOS EXCLUIDOS TBPRODUTO...: _________

QTDE. PRODUTOS ALTERADOS TBPRODUTO...: _________

QTDE. PRODUTOS CONSULTADOS TBPRODUTO...: _________

QTDE. MOVIMENTOS INVALIDOS.............: _________

==================================================

TEMPO TOTAL DE PROCESSAMENTO.........: ___________

==================================================

== TERMINO NORMAL DO PROGRAMA GPXXNND2 ==

==================================================

Page 236: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 7

www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218

42

Orientação para processamento

Como já foi visto, não pode haver um parágrafo principal.

Executa o parágrafo 1000-INICIALIZAR

Executa o parágrafo 3000-PROCESSAR

até que o file status do arquivo MOVPRDD2 seja “10”

Executar o parágrafo 4000-TERMINO

Encerrar o programa

Parágrafo 1000-INICIALIZAR

Receber o horário inicial de processamento

Mover zero para os contadores:

movimento lido

produto inserido

produto excluído

produto alterado

produto consultado

movimento inválido

Abrir para leitura o arquivo MOVPRDD2

Se file status for diferente de “00”

Mover mensagem de erro para variável da rotina de erro

Mover file status para variáveis da rotina de erro

Executar rotina de erro (9000-ERRO)

Ler o primeiro registro do arquivo MOVPRDD2 (2000-LER-MOVPRDD2)

Parágrafo 2000-LER-MOVPRDD2

Ler registro do arquivo MOVPRDD2 carregando variável espelho

Se file status for igual a “00” (sucesso)

Somar 1 ao contador de produto lido

Senão

Se file status for diferente de “10” (fim de arquivo)

Mover mensagem de erro para variável da rotina de erro

Mover file status para variáveis da rotina de erro

Executar rotina de erro (9000-ERRO)

Page 237: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 7

www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218

43

7

Parágrafo 3000-PROCESSAR

Se WS-TIPOMOVTO-D2 = “I”

executar a rotina de inclusão (3100-INCLUSAO)

Se WS-TIPOMOVTO-D2 = “E”

executar a rotina de exclusão (3200-EXCLUSAO)

Se WS-TIPOMOVTO-D2 = “A”

executar a rotina de alteração (3300-ALTERACAO)

Se WS-TIPOMOVTO-D2 = “C”

executar a rotina de consulta (3400-CONSULTAR)

Senão

Somar 1 ao contador de movimento inválido

Ler o próximo registro do arquivo MOVPRDD2 (2000-LER-MOVPRDD2)

Parágrafo 3100-INCLUSAO

Mover os dados da variável espelho para a hospedeira

Inserir a linha na tabela TBPRODUTO (INSERT) e testar SQLCODE:

se SQLCODE = 0

somar 1 ao contador de produto inserido

se SQLCODE = -803

somar 1 ao contador de produto inválido

se SQLCODE = -545

somar 1 ao contador de produto inválido

senão

mover SQLCODE para variável formatada

Mover mensagem de erro para variável da rotina de erro DB2

executar a rotina de erro para DB2 (9000-ERRO-DB2)

Parágrafo 3200-EXCLUSAO

Mover o código do produto da variável espelho para a hospedeira

Excluir a linha na tabela TBPRODUTO (DELETE) e testar SQLCODE:

se SQLCODE = 0

somar 1 ao contador de produto excluído

se SQLCODE = +100

somar 1 ao contador de movimento inválido

senão

mover SQLCODE para variável formatada

Mover mensagem de erro para variável da rotina de erro DB2

executar a rotina de erro para DB2 (9000-ERRO-DB2)

Page 238: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 7

www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218

44

Parágrafo 3300-ALTERACAO

Mover o código do produto da variável espelho para a hospedeira

Consultar a linha da tabela TBPRODUTO (SELECT) carregando a

variável hospedeira e testar SQLCODE:

se SQLCODE = 0

executar a rotina 9000-TRATA-INDICATOR

executar a rotina 3310-UPDATE

se SQLCODE = +100

somar 1 ao contador de movimento inválido

senão

mover SQLCODE para variável formatada

Mover mensagem de erro para variável da rotina de erro DB2

executar a rotina de erro para DB2 (9000-ERRO-DB2)

Parágrafo 3310-UPDATE

Mover os dados da variável espelho WS-REG-MOVPRDD2 com

conteúdo válido para as respectivas variáveis hospedeiras. Um campo é

considerado com conteúdo válido se for alfanumérico e diferente de SPACES

ou se for numérico e tiver conteúdo numérico (IS NUMERIC).

Alterar a linha da tabela TBPRODUTO (UPDATE) e testar SQLCODE:

se SQLCODE = 0

somar 1 ao contador de produto alterado

se SQLCODE = +100

somar 1 ao contador de movimento inválido

se SQLCODE = -545

somar 1 ao contador de movimento inválido

senão

mover SQLCODE para variável formatada

Mover mensagem de erro para variável da rotina de erro DB2

executar a rotina de erro para DB2 (9000-ERRO-DB2)

Pode parecer conversa de

bêbado, mas se o produto

já foi localizado na rotina

3300-ALTERACAO, como ele

não seria mais encontrado

na 3310-UPDATE, dando

SQLCODE +100?

Page 239: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 7

www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218

45

7

Parágrafo 3400-CONSULTAR

Mover o código do produto da variável espelho para a hospedeira

Consultar a linha da tabela TBPRODUTO (SELECT) carregando a

variável hospedeira e testar SQLCODE:

se SQLCODE = 0

somar 1 ao contador de produto consultado

executar a rotina 9000-TRATA-INDICATOR

executar a rotina 9000-EXIBE-PRODUTO

se SQLCODE = +100

somar 1 ao contador de movimento inválido

senão

mover SQLCODE para variável formatada

Mover mensagem de erro para variável da rotina de erro DB2

executar a rotina de erro para DB2 (9000-ERRO-DB2)

Parágrafo 4000-TERMINO

Fechar o arquivo MOVPRDD2

Se file status for diferente de “00”

Mover mensagem de erro para variável da rotina de erro

Mover file status para variáveis da rotina de erro

Executar rotina de erro (9000-ERRO)

Receber o horário final de processamento

Calcular o tempo de processamento

Exibir SYSOUT de acordo com LAYOUT

Exibir o contador de movimento lido

Exibir o contador de produto inserido

Exibir o contador de produto excluído

Exibir o contador de produto alterado

Exibir o contador de produto consultado

Exibir o contador de movimento inválido

Exibir o tempo total de processamento

Parágrafo 9000-TRATA-INDICATOR

Se INDICATOR < 0

Mover espaços quando a variável hospedeira for alfanumérica

ou zeros quando numérica

Parágrafo 9000-EXIBE-PRODUTO

EXIBIR (DISPLAY) as variáveis hospedeiras na SYSOUT conforme

layout.

Parágrafo 9000-ERRO

Exibir mensagem de erro

Exibir file status

Abendar o programa com RETURN-CODE = 12

Page 240: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 7

www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218

46

Parágrafo 9000-ERRO-DB2

Exibir mensagem de erro

Exibir SQLCODE formatado

Exibir SQLERRMC (mensagem de erro do SQLCODE)

Abendar o programa com RETURN-CODE = 16

ENTRE AS ROTINAS

3300-ALTERACAO E

3310-UPDATE UM tempo se

passou, suficiente para

alguém ou um aplicativo ter

excluido o produto.

Espera você chegar em

casa que eu te explico

melhor!

Page 241: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 7

www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218

47

7

Page 242: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 7

www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218

48

Avaliação Então...Como foi ?!?

Estou fera!

Fiz Certo!

Muito Bom Bom regular ruim Muito ruim

Page 243: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte

Charles William Backman foi um cientistada computação particularmente conhecido porseu trabalho na área de banco de dados.Desenvolveu o IDS (Integrated Data Store), um

dos primeiros SGBD que, após aperfeiçoá-lo,permitia à múltiplos programas acesso ao SGBDsimultaneamente. O IDS evoluiu para o IDMS(Integrated Database Management Systems),suportando mainframes IBM.

Charles William Backman1924 (88 anos)

Page 244: Grande Porte - COBOL Level 2 - Versão 2.2.3

Versão 2.2.3

Page 245: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 8

www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218

3

8

Antes de iniciarmos, vamos conversar sobre os tópicos apresentados na capa desta parte. Isso é importante para que seu instrutor e seus colegas saibam como está seu conhecimento sobre o assunto e se você precisa ou pode fornecer ajuda aos colegas e instrutor.

O que você já sabe ?

O que você não sabe ?

Porque é importante conhecer estes tópicos ?

Quais são os seus temores ?

O que você considera difícil ?

Depois de falar sobre o assunto com seus colegas e instrutor, escreva,

desenhe, rabisque, diga algo sobre o que você vai fazer para dominar esses tópicos. Comprometa-se!

Preparation

Trocando Ideias É agora que você fala !!

Reflexão É aqui que você se compromete !!

Page 246: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 8

www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218

4

Sim, novamente veremos como escrever programa COBOL para a gravação de

relatório. Porém agora, os dados serão oriundos de uma tabela.

É bom poder relembrar das rotinas de impressão de cabeçalho, detalhe e

impressão de rodapé, dos contadores de linha (que já “nasce” estourado) e de página,

da WORKING-STORAGE SECTION enorme com as definições desses mesmos

cabeçalhos, detalhes e rodapés.

Os cursores permitem emular arquivos sequenciais a partir de tabelas, então

são usados principalmente em relatórios, mas também para Balance Line, Merge, etc.

Presentation

História RELATÓRIOS, DE NOVO!

80 ou 132 colunas

de 1/10 de polegada

66 li

nhas

de 1 / 6

de p

oleg

ada

serrilha oumicro serrilha

remalina

Anatomia de um

Formulário contínuo

de novo de novo

Page 247: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 8

www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218

5

8

A linguagem SQL trabalha com tabelas e linhas. É uma linguagem

desenvolvida para manipular conjuntos. Já as linguagens tradicionais trabalham com

arquivos e registros e não conseguem reconhecer tabelas e linhas.

Para simularmos um arquivo com seus registros, trabalha-se com o conceito de

cursor. Assim o programa pode acessar linhas de uma tabela para uma manipulação

qualquer.

O CURSOR é criado dentro do programa COBOL através do comando

DECLARE, contendo a definição da result table (SELECT). É usado para armazenar o

resultado de um SELECT para em seguida ler cada uma dessas linhas.

Um programa pode construir vários CURSORES, porém cada um deles deve

ter um nome diferente. O roteiro para manipular um cursor é:

Declarar o CURSOR, definindo seu nome e o comando SELECT.

(Na WORKING-STORAGE SECTION ou na PROCEDURE DIVISION)

----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8

PROCEDURE DIVISION.

.......

*----------------------------------------------------------------*

* NAO CARREGA SQLCODE *

*----------------------------------------------------------------*

EXEC SQL

DECLARE nome_do_cursor CURSOR FOR

Commando SELECT

END-EXEC

Abrir o cursor com o comando OPEN. Neste instante o SELECT é executado.

----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8

PROCEDURE DIVISION.

.......

*----------------------------------------------------------------*

* CARREGA SQLCODE *

* 0 – SUCESSO *

* OUTRO - ERRO *

*----------------------------------------------------------------*

EXEC SQL

OPEN nome_do_cursor

END-EXEC

Teoria cursor

Page 248: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 8

www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218

6

Executar uma série de comandos FETCH para ler cada uma das linhas da RESULT TABLE.

----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8

PROCEDURE DIVISION.

.......

*----------------------------------------------------------------*

* CARREGA SQLCODE *

* 0 – SUCESSO *

* +100 – FIM DO CURSOR *

* OUTRO - ERRO *

*----------------------------------------------------------------*

EXEC SQL

FETCH nome_do_cursor

INTO :variavel1,: variavel2, ...

END-EXEC

Fechar o CURSOR, para o DB2 liberar a RESULT TABLE.

----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8

PROCEDURE DIVISION.

.......

*----------------------------------------------------------------*

* CARREGA SQLCODE *

* 0 – SUCESSO *

* OUTRO - ERRO *

*----------------------------------------------------------------*

EXEC SQL

CLOSE nome_do_cursor

END-EXEC

Page 249: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 8

www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218

7

8

Exemplo de um trecho de programa usando CURSOR:

----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8

PROCEDURE DIVISION.

PERFORM 010-INICIALIZAR

PERFORM 030-PROCESSAR UNTIL SQLCODE = +100

PERFORM 040-TERMINO

STOP RUN

.

010-INICIALIZAR.

MOVE 0 TO WS-CTLIDO

* 1- DECLARACAO DO CURSOR

EXEC SQL

DECLARE LEREMP CURSOR FOR

SELECT CODEMP, NOMEMP

FROM FUNCIONARIOS

WHERE CODDEPTO = ‘P10’

END-EXEC

* 2- ABERTURA DO CURSOR E TESTE DO SQLCODE

EXEC SQL

OPEN LEREMP

END-EXEC

IF SQLCODE NOT = 0

MOVE “ERRO ABERTURA CURSOR LEREMP”

TO WS-MSG

MOVE SQLCODE TO WS-SQLCODE

GO TO 999-ERRO-SQL

END-IF

PERFORM 020-LER-CURSOR

.

020-LER-CURSOR.

* 3- LEITURA DO CURSOR COM FETCH E TESTE DO SQLCODE

EXEC SQL

FETCH LEREMP

INTO :CODEMP, :NOMEEMP INDICATOR :INDNOMEMP

END-EXEC

IF SQLCODE = 0

ADD 1 TO WS-CTLIDO

ELSE

IF SQLCODE NOT = +100

MOVE “ERRO LEITURA CURSOR LEREMP”

TO WS-MSG

MOVE SQLCODE TO WS-SQLCODE

GO TO 999-ERRO-DB2

END-IF

END-IF

.

030-PROCESSAR.

IF INDNOMEMP < 0

MOVE “NOME INVALIDO” TO NOMEMP

END-IF

DISPLAY “FUNCIONARIO......: “ CODEMP

DISPLAY “NOME.............: “ NOMEMP

PERFORM 020-LER-CURSOR

.

Page 250: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 8

www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218

8

----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8

040-TERMINO.

DISPLAY “TOTAL DE LINHAS LIDAS NO CURSOR = “ WS-CTLIDO

* 4 - FECHAR O CURSOR E TESTAR SQLCODE

EXEC SQL

CLOSE LEREMP

END-EXEC

IF SQLCODE NOT = 0

MOVE “ERRO FECHAMENTO CURSOR LEREMP”

TO WS-MSG

MOVE SQLCODE TO WS-SQLCODE

GO TO 999-ERRO-SQL

END-IF

DISPLAY “TERMINO NORMAL DO PROGRAMA”

.

999-ERRO-DB2.

DISPLAY “MENSAGEM…....: “ WS-MSG

DISPLAY “SQLCODE .....: “ WS-SQLCODE

DISPLAY “TERMINO ANORMAL DO PROGRAMA”

MOVE +16 TO RETURN-CODE

STOP RUN

.

Page 251: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 8

www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218

9

8

Objetivo do Programa

Gravar o relatório CLIRELAT com os cliente da tabela TBCLIENTE que não

tenham e-mail.

Macro-Fluxo

Exemplo RELATÓRIO com cursor

TBCLIENTE

EXERELAT

CLIRELAT

Page 252: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 8

www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218

10

Layout do Relatório

1 2 3 4 5 6 7 8 9 0 1 2 3

123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012

01 DD/MM/AAAA HH:MM:SS RELACAO DE CLIENTES SEM E-MAIL PAG. ZZ9

02 ------------------------------------------------------------------------------------------------------------------------------------

03 CODIGO NOME ENDERECO TELEFONE CPF SALDO

04 ------ ------------------------------ ---------------------------------------- --------- ----------- ---------

05 XXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 999999999 99999999999 ZZ.ZZ9,99

06 XXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 999999999 99999999999 ZZ.ZZ9,99

07 XXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 999999999 99999999999 ZZ.ZZ9,99

08 XXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 999999999 99999999999 ZZ.ZZ9,99

09 XXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 999999999 99999999999 ZZ.ZZ9,99

.. XXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 999999999 99999999999 ZZ.ZZ9,99

57 XXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 999999999 99999999999 ZZ.ZZ9,99

58 XXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 999999999 99999999999 ZZ.ZZ9,99

59 ------------------------------------------------------------------------------------------------------------------------------------

60 APOS O USO REUTILIZE ESSE RELATORIO COMO RASCUNHO - RECLICLE SUAS IDEIAS INDUSTRIAS JOAQUIM NABUCO LTDA.

Page 253: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 8

www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218

11

8

Layout do Arquivo

Nome do Arquivo CLIRELAT

Nome do Registro Tipo e Tamanho Descrição

REG-CLIRELAT X(132) Relatório de 132 colunas

Layout da Tabela

Nome do Tabela TBCLIENTE

Nome do Campo Tipo e Tamanho Complemento

CODCLI CHAR(04) UNIQUE NOT NULL

NOMECLI VARCHAR(30) NOT NULL

ENDCLI VARCHAR(40)

FONECLI CHAR(09)

EMAILCLI VARCHAR(50)

CPFCLI CHAR(11)

SALDOCLI DECIMAL(9,2)

Page 254: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 8

www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218

12

Layout da SYSOUT

1 2 3 4 5

12345678901234567890123456789012345678901234567890

**************************************************

* DATA GREGORIANA 1 - 99/99/2099 *

* DATA GREGORIANA 2 - 99 DE XXXXXXXXX DE 2099 *

* DATA JULIANA – 999 DE 2099 *

* DIA DA SEMANA – XXXXXXXXXXXXX *

**************************************************

1 2 3 4 5

12345678901234567890123456789012345678901234567890

==================================================

== ESTATISTICA FINAL DE PROCESSAMENTO ==

==================================================

TOTAL DE CLIENTES LIDOS.......: ZZZ.ZZ9

TOTAL DE CLIENTES IMPRESSOS...: ZZZ.ZZ9

TOTAL DE PAGINAS IMPRESSAS....: ZZ9

==================================================

TEMPO TOTAL DE PROCESSAMENTO.........: HH:MM:SS:CC

==================================================

== TERMINO NORMAL DO PROGRAMA EXERELAT ==

==================================================

Page 255: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 8

www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218

13

8

Programa COBOL

----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8

*----------------------------------------------------------------*

IDENTIFICATION DIVISION.

*----------------------------------------------------------------*

PROGRAM-ID. EXERELAT.

*----------------------------------------------------------------*

ENVIRONMENT DIVISION.

*----------------------------------------------------------------*

CONFIGURATION SECTION.

SPECIAL-NAMES.

DECIMAL-POINT IS COMMA.

INPUT-OUTPUT SECTION.

FILE-CONTROL.

SELECT CLIRELAT ASSIGN TO UT-S-CLIRELAT

FILE STATUS FS-CLIRELAT.

*----------------------------------------------------------------*

DATA DIVISION.

*----------------------------------------------------------------*

FILE SECTION.

*----------------------------------------------------------------*

FD CLIRELAT

LABEL RECORD OMITTED

RECORDING MODE IS F

RECORD CONTAINS 132 CHARACTERS

DATA RECORD REG-CLIRELAT

.

01 REG-CLIRELAT PIC X(132).

*----------------------------------------------------------------*

WORKING-STORAGE SECTION.

*----------------------------------------------------------------*

* BOOK DAS VARIAVEIS HOSPEDEIRAS

EXEC SQL

INCLUDE BKEXETC

END-EXEC

* BOOK DA SQLCODE

EXEC SQL

INCLUDE SQLCA

END-EXEC

* BOOK DAS VARIAVEIS PARA CALCULO DO TEMPO DE PROCESSAMENTO

COPY VARTEMPO.

COPY VARDATA.

* CONTADORES COMP

01 WS-CONTADORES-COMP.

03 WS-CTLIDO PIC 9(06) COMP.

03 WS-CTIMP PIC 9(06) COMP.

03 WS-CTPAG PIC 9(03) COMP.

03 WS-CTLINHA PIC 9(02) COMP.

03 WS-PULA PIC 9(02) COMP.

* CONTADORES FORMATADOS

01 WS-CONTADORES-FORMATADOS.

03 WS-CTLIDO-F PIC ZZZ.ZZ9.

03 WS-CTIMP-F PIC ZZZ.ZZ9.

03 WS-CTPAG-F PIC ZZ9.

Page 256: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 8

www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218

14

----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8

*----------------------------------------------------------------*

* LAY-OUT DO RELATORIO CLIRELAT

*----------------------------------------------------------------*

* CABECALHO 1

01 WS-CABEC1.

03 WS-DATA-CABEC1 PIC X(10).

03 FILLER PIC X(01)

VALUE SPACES.

03 WS-HORA-CABEC1 PIC X(08).

03 FILLER PIC X(40)

VALUE SPACES.

03 FILLER PIC X(30)

VALUE

"RELACAO DE CLIENTES SEM E-MAIL".

03 FILLER PIC X(35)

VALUE SPACES.

03 FILLER PIC X(05)

VALUE "PAG. ".

03 WS-PAG-CABEC1 PIC ZZ9.

* CABECALHO 2

01 WS-CABEC2 PIC X(132)

VALUE ALL "-".

* CABECALHO 3

01 WS-CABEC3.

03 FILLER PIC X(33)

VALUE

" CODIGO NOME ".

03 FILLER PIC X(33)

VALUE

" ENDERECO ".

03 FILLER PIC X(33)

VALUE

" ".

03 FILLER PIC X(33)

VALUE

" TELEFONE CPF ".

* CABECALHO 4

01 WS-CABEC4.

03 FILLER PIC X(33)

VALUE

" ------ -----------------".

03 FILLER PIC X(33)

VALUE

"------------- ------------".

03 FILLER PIC X(33)

VALUE

"---------------------------- ".

03 FILLER PIC X(33)

VALUE

" --------- ----------- ".

Page 257: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 8

www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218

15

8

----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8

* LINHA DE DETALHE

01 WS-LINDET.

03 FILLER PIC X(02)

VALUE SPACES.

03 LD-CODCLI PIC X(04).

03 FILLER PIC X(06)

VALUE SPACES.

03 LD-NOMECLI PIC X(30).

03 FILLER PIC X(05)

VALUE SPACES.

03 LD-ENDCLI PIC X(40).

03 FILLER PIC X(05)

VALUE SPACES.

03 LD-FONECLI PIC X(09).

03 FILLER PIC X(05)

VALUE SPACES.

03 LD-CPFCLI PIC X(11).

03 FILLER PIC X(05)

VALUE SPACES.

03 LD-SALDOCLI PIC ZZ.ZZ9,99

BLANK WHEN ZERO.

03 FILLER PIC X(01)

VALUE SPACES.

* RODAPE 1

01 WS-RODAPE1 PIC X(132)

VALUE ALL "-".

* RODAPE 2

01 WS-RODAPE2.

03 FILLER PIC X(33)

VALUE

"APOS O USO REUTILIZE ESSE RELATOR".

03 FILLER PIC X(33)

VALUE

"IO COMO RASCUNHO - RECLICLE SUAS ".

03 FILLER PIC X(33)

VALUE

"IDEIAS ".

03 FILLER PIC X(33)

VALUE

" INDUSTRIAS JOAQUIM NABUCO LTDA.".

*----------------------------------------------------------------*

* DATA E HORA PARA O RELATORIO

*----------------------------------------------------------------*

01 WS-DATA-SYS.

03 WS-ANO PIC 9(02).

03 WS-MES PIC 9(02).

03 WS-DIA PIC 9(02).

01 WS-DATA-FORMATADA.

03 WS-DIA PIC 9(02).

03 FILLER PIC X(01)

VALUE "/".

03 WS-MES PIC 9(02).

03 FILLER PIC X(03)

VALUE "/20".

03 WS-ANO PIC 9(02).

01 WS-HORA-SYS.

03 WS-HORA PIC 9(02).

03 WS-MINUTO PIC 9(02).

03 WS-SEGUNDO PIC 9(02).

Page 258: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 8

www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218

16

----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8

01 WS-HORA-FORMATADA.

03 WS-HORA PIC 9(02).

03 FILLER PIC X(01)

VALUE ":".

03 WS-MINUTO PIC 9(02).

03 FILLER PIC X(01)

VALUE ":".

03 WS-SEGUNDO PIC 9(02).

* INDICADORES PARA TBCLIENTE

01 WS-INDICADORES.

03 IENDCLI PIC S9(04) COMP.

03 IFONECLI PIC S9(04) COMP.

03 ICPFCLI PIC S9(04) COMP.

03 ISALDOCLI PIC S9(04) COMP.

01 FS-CLIRELAT PIC X(02).

88 SUCESSO-CLIRELAT VALUE "00".

77 WS-FS PIC X(02).

77 WS-MSG PIC X(60).

77 WS-SQLCODE PIC +9(09).

*----------------------------------------------------------------*

PROCEDURE DIVISION.

*----------------------------------------------------------------*

0000-EXERELAT.

PERFORM 1000-INICIALIZAR

PERFORM 2000-PROCESSAR

UNTIL SQLCODE = +100

PERFORM 3000-TERMINO

STOP RUN

.

1000-INICIALIZAR.

* CARREGAR VARIAVEIS PARA CALCULO DO TEMPO DE PROCESSAMENTO

ACCEPT WS-HORARIO-INICIAL FROM TIME

* INICIALIZACAO DOS CONTADORES

INITIALIZE WS-CONTADORES-COMP

MOVE 99 TO WS-CTLINHA

* LEITURA DA DATA E HORA PARA O CABECALHO DO RELATORIO

ACCEPT WS-DATA-SYS FROM DATE

ACCEPT WS-HORA-SYS FROM TIME

MOVE CORRESPONDING WS-DATA-SYS TO WS-DATA-FORMATADA

MOVE CORRESPONDING WS-HORA-SYS TO WS-HORA-FORMATADA

* DECLARACAO DO CURSOR PARA SELECIONAR CLIENTES SEM EMAIL

EXEC SQL

DECLARE CLISEMEMAIL CURSOR FOR

SELECT CODCLI

,NOMECLI

,ENDCLI

,FONECLI

,CPFCLI

,SALDOCLI

FROM TBCLIENTE

WHERE EMAILCLI IS NULL

END-EXEC

Page 259: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 8

www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218

17

8

----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8

* ABERTURA DO CURSOR

EXEC SQL

OPEN CLISEMEMAIL

END-EXEC

IF SQLCODE NOT EQUAL 0

MOVE "ERRO AO FECHAR CURSOR"

TO WS-MSG

MOVE SQLCODE TO WS-SQLCODE

GO TO 9000-ERRO-DB2

END-IF

* ABERTURA DO ARQUIVO DE RELATORIO

OPEN OUTPUT CLIRELAT

IF NOT SUCESSO-CLIRELAT

MOVE "ERRO ABERTURA CLIRELAT"

TO WS-MSG

MOVE FS-CLIRELAT TO WS-FS

GO TO 9000-ERRO

END-IF

* LEITURA DA PRIMEIRA LINHA DO CURSOR

PERFORM 1500-LER-CLISEMEMAIL

.

1500-LER-CLISEMEMAIL.

EXEC SQL

FETCH CLISEMEMAIL

INTO :CODCLI

,:NOMECLI

,:ENDCLI :IENDCLI

,:FONECLI :IFONECLI

,:CPFCLI :ICPFCLI

,:SALDOCLI :ISALDOCLI

END-EXEC

IF SQLCODE = 0

ADD 1 TO WS-CTLIDO

PERFORM 1600-TRATA-INDICATOR

ELSE

IF SQLCODE NOT = +100

MOVE "ERRO LEITURA CURSOR CLISEMEMAIL"

TO WS-MSG

MOVE SQLCODE TO WS-SQLCODE

GO TO 9000-ERRO-DB2

END-IF

END-IF

.

1600-TRATA-INDICATOR.

IF IENDCLI < 0

MOVE ALL "*" TO ENDCLI-TEXT

END-IF

IF IFONECLI < 0

MOVE ALL "*" TO FONECLI

END-IF

IF ICPFCLI < 0

MOVE ALL "*" TO CPFCLI

END-IF

IF ISALDOCLI < 0

MOVE ZEROS TO SALDOCLI

END-IF

.

Page 260: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 8

www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218

18

----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8

2000-PROCESSAR.

IF WS-CTLINHA > 59

PERFORM 2100-IMPRIME-CABECALHO

END-IF

PERFORM 2200-IMPRIME-DETALHE

IF WS-CTLINHA = 58

PERFORM 2300-IMPRIME-RODAPE

END-IF

PERFORM 1500-LER-CLISEMEMAIL

.

2100-IMPRIME-CABECALHO.

MOVE WS-DATA-FORMATADA TO WS-DATA-CABEC1

MOVE WS-HORA-FORMATADA TO WS-HORA-CABEC1

ADD 1 TO WS-CTPAG

MOVE WS-CTPAG TO WS-PAG-CABEC1

WRITE REG-CLIRELAT FROM WS-CABEC1 AFTER PAGE

IF NOT SUCESSO-CLIRELAT

MOVE "ERRO IMPRESSAO CABECALHO 1"

TO WS-MSG

MOVE FS-CLIRELAT TO WS-FS

GO TO 9000-ERRO

END-IF

WRITE REG-CLIRELAT FROM WS-CABEC2

IF NOT SUCESSO-CLIRELAT

MOVE "ERRO IMPRESSAO CABECALHO 2"

TO WS-MSG

MOVE FS-CLIRELAT TO WS-FS

GO TO 9000-ERRO

END-IF

WRITE REG-CLIRELAT FROM WS-CABEC3

IF NOT SUCESSO-CLIRELAT

MOVE "ERRO IMPRESSAO CABECALHO 3"

TO WS-MSG

MOVE FS-CLIRELAT TO WS-FS

GO TO 9000-ERRO

END-IF

WRITE REG-CLIRELAT FROM WS-CABEC4

IF NOT SUCESSO-CLIRELAT

MOVE "ERRO IMPRESSAO CABECALHO 4"

TO WS-MSG

MOVE FS-CLIRELAT TO WS-FS

GO TO 9000-ERRO

END-IF

MOVE 4 TO WS-CTLINHA

.

Page 261: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 8

www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218

19

8

----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8

2200-IMPRIME-DETALHE.

MOVE CODCLI TO LD-CODCLI

MOVE NOMECLI-TEXT TO LD-NOMECLI

MOVE ENDCLI-TEXT TO LD-ENDCLI

MOVE FONECLI TO LD-FONECLI

MOVE CPFCLI TO LD-CPFCLI

MOVE SALDOCLI TO LD-SALDOCLI

WRITE REG-CLIRELAT FROM WS-LINDET

IF NOT SUCESSO-CLIRELAT

MOVE "ERRO NA IMPRESSAO DO DETALHE."

TO WS-MSG

MOVE FS-CLIRELAT TO WS-FS

GO TO 9000-ERRO

END-IF

ADD 1 TO WS-CTLINHA

ADD 1 TO WS-CTIMP

.

2300-IMPRIME-RODAPE.

COMPUTE WS-PULA = 59 - WS-CTLINHA

WRITE REG-CLIRELAT FROM WS-RODAPE1 AFTER WS-PULA LINES

IF NOT SUCESSO-CLIRELAT

MOVE "ERRO NA IMPRESSAO DO RODAPE 1"

TO WS-MSG

MOVE FS-CLIRELAT TO WS-FS

GO TO 9000-ERRO

END-IF

WRITE REG-CLIRELAT FROM WS-RODAPE2

IF NOT SUCESSO-CLIRELAT

MOVE "ERRO NA IMPRESSAO DO RODAPE 2"

TO WS-MSG

MOVE FS-CLIRELAT TO WS-FS

GO TO 9000-ERRO

END-IF

MOVE 60 TO WS-CTLINHA

.

Page 262: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 8

www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218

20

----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8

3000-TERMINO.

* VERIFICANDO A NECESSIDADE DE IMPRESSAO DE

* RODAPE NA ULTIMA PAGINA

IF WS-CTLINHA < 60

PERFORM 2300-IMPRIME-RODAPE

END-IF

MOVE WS-CTLIDO TO WS-CTLIDO-F

MOVE WS-CTIMP TO WS-CTIMP-F

MOVE WS-CTPAG TO WS-CTPAG-F

EXEC SQL

CLOSE CLISEMEMAIL

END-EXEC

IF SQLCODE NOT EQUAL 0

MOVE "ERRO AO FECHAR CURSOR"

TO WS-MSG

MOVE SQLCODE TO WS-SQLCODE

GO TO 9000-ERRO-DB2

END-IF

CLOSE CLIRELAT

IF NOT SUCESSO-CLIRELAT

MOVE "ERRO AO FECHAR CLIRELAT"

TO WS-MSG

MOVE FS-CLIRELAT TO WS-FS

GO TO 9000-ERRO

END-IF

ACCEPT WS-HORARIO-FINAL FROM TIME

PERFORM 9000-CALCULA-TEMPO-PROC

PERFORM 9000-IMPRIME-DATA

DISPLAY " "

DISPLAY "================================================="

DISPLAY "== ESTATISTICA FINAL DE PROCESSAMENTO =="

DISPLAY "================================================="

DISPLAY "TOTAL DE CLIENTES LIDOS.......: " WS-CTLIDO-F

DISPLAY "TOTAL DE CLIENTES IMPRESSOS...: " WS-CTIMP-F

DISPLAY "TOTAL DE PAGINAS IMPRESSAS....: " WS-CTPAG-F

DISPLAY "================================================="

DISPLAY "TEMPO TOTAL DE PROCESSAMENTO.........: "

WS-TEMPO-PROCESSAMENTO

DISPLAY "================================================="

DISPLAY "== TERMINO NORMAL DO PROGRAMA EXERELAT =="

DISPLAY "================================================="

.

Page 263: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 8

www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218

21

8

----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8

9000-ERRO.

DISPLAY "*------------------------------------------------*"

DISPLAY " MENSAGEM......: " WS-MSG

DISPLAY " FILE STATUS...: " WS-FS

DISPLAY "*------------------------------------------------*"

DISPLAY " TERMINO ANORMAL DO PROCESSAMENTO EXERELAT "

DISPLAY "*------------------------------------------------*"

STOP RUN

.

9000-ERRO-DB2.

DISPLAY "*------------------------------------------------*"

DISPLAY " MENSAGEM......: " WS-MSG

DISPLAY " SQLCODE.......: " WS-SQLCODE

DISPLAY "*------------------------------------------------*"

DISPLAY " TERMINO ANORMAL DO PROCESSAMENTO EXERELAT "

DISPLAY "*------------------------------------------------*"

STOP RUN

.

* ROTINA QUE EXIBE AS DATAS FORMATADAS

COPY IMPDATA.

* ROTINA QUE CALCULA TEMPO DE PROCESSAMENTO

COPY CALCTEMP.

Page 264: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 8

www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218

22

Dado o M.E.R abaixo, monte os cursores

solicitados:

a) Cursor CVETERANO com o código, nome dos funcionários e o nome do

departamento que trabalham a mais de 10 anos na empresa, ordenado pelo

nome do departamento.

Atividade Trabalho em dupla

TABFUNC

codfunc(PK)nomefuncdataadminfuncdatademissaofunccoddepto(FK)

TABDEPTO

coddepto(PK)nomedeptocodgerente(FK)

Page 265: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 8

www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218

23

8

b) Cursor CGERENTE com o código e o nome do departamento, código, nome e

data de admissão do gerente do departamento.

Page 266: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 8

www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218

24

Criar as variáveis hospedeiras para receber o

conteúdo dos cursores criados na atividade anterior.

a) CVETERANO

b) CGERENTE

TABFUNC

codfunc(PK) CHAR(4) nomefunc VARCHAR(30)dataadminfunc DATEdatademissaofunc DATEcoddepto(FK) CHAR(3)

TABDEPTO

coddepto(PK) CHAR(3)nomedepto VARCHAR(20)codgerente(FK) CHAR(4)

Atividade Revisão aos pares

Page 267: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 8

www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218

25

8

Impressão de relatório via CURSOR

Objetivo do Programa

A Metal Screws Inc. precisa de um programa que imprima um relatório de

reposição de estoque, para poder fazer os pedidos aos seus fornecedores.

Escrever um programa selecionando da tabela TBPRODUTO aqueles cuja

quantidade em estoque é menor que o limite mínimo em ordem crescente de

descrição. Ler o CURSOR e imprimir o relatório RELREPO, com 60 linhas por página,

contendo cabeçalho, detalhe e rodapé, conforme layout.

Macro-Fluxo

Performance

Atividade Projeto 3 - Relatório

TBPRODUTO

GPXXNND3

RELREPO

Page 268: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 8

www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218

26

Layout do Arquivo

Nome do Arquivo RELREPO

Nome do Registro Tipo e Tamanho Descrição

REG-RELREPO X(80) Relatório de 80 colunas

Layout da Tabela

Nome da tabela TBPRODUTO

Nome da coluna Tipo e Tamanho Complementos

CODPROD CHAR(4) UNIQUE NOT NULL

DESCPROD VARCHAR(20) NOT NULL

UNIDPROD CHAR(5)

LOCALPROD CHAR(5)

QTDEST DECIMAL(5,0)

QTDMAX DECIMAL(5,0) > QTDMIN

QTDMIN DECIMAL(5,0) < QTDMAX

PRECOCOMPRA DECIMAL(8,2) >=0

PRECOVENDA DECIMAL(8,2) >=0

PERCOMIS DECIMAL(4,2) >=0

Layout do Relatório

1 12345678911234567892123456789312345678941234567895123456789612345678971234567898

2 12345678901234567890123456789012345678901234567890123456789012345678901234567890

01 DD/MM/20AAXXHH:MM:SSXXXXXXXXXXX XXREPOSICAO DE ESTOQUEXXXXXXXX PAG.XZ.ZZ9

02 --------------------------------------------------------------------------------

03 CODIGO DESCRICAO PRECO %LUCRO ESTOQUE REPOSICAO

04 --------------------------------------------------------------------------------

05 XXXX XXXXXXXXXXXXXXXXXXXX R$ ***.**9,99 ZZ9,99+ ZZ.ZZ9 ZZ.ZZ9

06 XXXX XXXXXXXXXXXXXXXXXXXX R$ ***.**9,99 ZZ9,99+ ZZ.ZZ9 ZZ.ZZ9

.. XXXX XXXXXXXXXXXXXXXXXXXX R$ ***.**9,99 ZZ9,99+ ZZ.ZZ9 ZZ.ZZ9

57 XXXX XXXXXXXXXXXXXXXXXXXX R$ ***.**9,99 ZZ9,99+ ZZ.ZZ9 ZZ.ZZ9

58 XXXX XXXXXXXXXXXXXXXXXXXX R$ ***.**9,99 ZZ9,99+ ZZ.ZZ9 ZZ.ZZ9

59 --------------------------------------------------------------------------------

60 INDUSTRIAS SEUNOME S/A. SERVIMOS BEM PARA SERVIR SEMPRE.

Page 269: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 8

www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218

27

8

Layout da SYSOUT

1 2 3 4 5

12345678901234567890123456789012345678901234567890

**************************************************

* DATA GREGORIANA 1 - 99/99/2099 *

* DATA GREGORIANA 2 - 99 DE XXXXXXXXX DE 2099 *

* DATA JULIANA – 999 DE 2099 *

* DIA DA SEMANA – XXXXXXXXXXXXX *

**************************************************

1 2 3 4 5

12345678901234567890123456789012345678901234567890

==================================================

== ESTATISTICA FINAL DE PROCESSAMENTO ==

==================================================

QTDE. PRODUTOS LIDOS ................: ZZ.ZZ9

QTDE. PRODUTOS IMPRESSOS.............: ZZ.ZZ9

QTDE. PAGINAS........................: ZZ.ZZ9

==================================================

TEMPO TOTAL DE PROCESSAMENTO.........: HH:MM:SS:CC

==================================================

== TERMINO NORMAL DO PROGRAMA GPXXNND3 ==

==================================================

Page 270: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 8

www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218

28

Observação

Detalhamento do Relatório

O RELREPO tem 4 linhas de cabeçalho, a saber:

01 WS-CABEC1, que contém as variáveis

WS-DATA-CABEC1

WS-PAG-CABEC1

WS-HORA-CABEC1

02 WS-CABEC2, que contém 80 traços “-“

03 WS-CABEC3, que contém os títulos das colunas

04 WS-CABEC4, que contém 80 traços “-“ sobre as colunas

Tem também 1 linha de detalhe, WS-LINDET, com as variáveis:

LD-CODPROD

LD-DESCPROD

LD-PRECOVENDA

LD-LUCRO

LD-QTDEST

LD-QTDREP

Finalmente tem 2 linhas de rodapé

59 WS-RODAPE1, que contém 80 traços

60 WS-RODAPE2, que contém uma frase

Ao carregar data e hora pela rotina de inicialização, garantimos que em todas

as páginas do relatório teremos a mesma data e hora. Isso é crítico quando os

relatórios são longos e impressos próximos à meia-noite.

DD/MM/20AAXXHH:MM:SSXXXXXXXXXXX XXREPOSICAO DE ESTOQUEXXXXXXXX PAG.XZ.ZZ9

05 XXXX XXXXXXXXXXXXXXXXXXXX R$ ***.**9,99 ZZ9,99+ ZZ.ZZ9 ZZ.ZZ9

06 XXXX XXXXXXXXXXXXXXXXXXXX R$ ***.**9,99 ZZ9,99+ ZZ.ZZ9 ZZ.ZZ9

.. XXXX XXXXXXXXXXXXXXXXXXXX R$ ***.**9,99 ZZ9,99+ ZZ.ZZ9 ZZ.ZZ9

57 XXXX XXXXXXXXXXXXXXXXXXXX R$ ***.**9,99 ZZ9,99+ ZZ.ZZ9 ZZ.ZZ9

58 XXXX XXXXXXXXXXXXXXXXXXXX R$ ***.**9,99 ZZ9,99+ ZZ.ZZ9 ZZ.ZZ9

Page 271: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 8

www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218

29

8

O lucro é calculado usando a seguinte fórmula:

COMPUTE WS-LUCRO = (PRECOVENDA / PRECOCOMPRA – 1) * 100

e a variável WS-LUCRO deve ser declarada como PIC S9(3)V9(6).

A quantidade de reposição é calculada usando a seguinte fórmula:

COMPUTE WS-QTDREP = QTDMAX - QTDEST

e a variável WS-QTDREP deve ser declarada como PIC 9(05).

Imprimir relatórios a partir de cursores é uma atividade muito comum e precisa

ser perfeitamente dominada. Execute os passos abaixo (lembre-se de que XXNN é o

seu prefixo de usuário):

1) Edite o programa GPXXNND3 na sua COBLIB

2) Altere o JOB COMPBDB2 para compilar o programa GPXXNND3 e compile até obter MAXCC=0.

3) Copiar o membro EXECOBD3, da JOBLIB de seu instrutor, para sua JOBLIB.

4) Alterar o JOB EXECOBD3, substituindo XXNN pelo seu prefixo de usuário

5) Executar o JOB e comparar o resultado com os de seus colegas

Page 272: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 8

www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218

30

Orientação para processamento

Como já foi visto, não pode haver um parágrafo principal. Executar o parágrafo 1000-INICIALIZAR Executar o parágrafo 2000-PROCESSAR

até que o SQLCODE do cursor seja +100 Executar o parágrafo 3000-TERMINO Encerrar o programa Parágrafo 1000-INICIALIZAR Receber o horário inicial de processamento

Mover zero para os contadores: produtos lidos linhas de detalhes impressas páginas impressas

Mover 99 para o contador de linha (ele começa estourado) Abrir para gravação o arquivo RELREPO Se file status for diferente de “00” Mover mensagem de erro para variável da rotina de erro Mover file status para variável da rotina de erro Executar a rotina de erro (9000-ERRO) Definir o cursor REPOSICAO Abrir o cursor REPOSICAO Se SQLCODE for diferente de zero Mover mensagem de erro para variável da rotina de erro DB2 Mover SQLCODE para a variável formatada Executar a rotina de erro DB2 (9000-ERRO-DB2) Executar o parágrafo 9100-FORMATA-DATA-HORA Executar o parágrafo 1500-LER-REPOSICAO

Parágrafo 1500-LER-REPOSICAO Pegar a próxima linha do cursor REPOSICAO (FETCH) Se SQLCODE for igual a zero Executar o parágrafo 9000-TRATA-INDICATOR Somar 1 ao contador de produtos lidos Senão Se SQLCODE for diferente de 100 Mover mensagem de erro para variável da rotina de erro DB2 Mover SQLCODE para variável formatada Executar a rotina de erro para DB2 (9000-ERRO-DB2) Parágrafo 2000-PROCESSAR

Se contador de linha for maior que 59

Executar a rotina 2100-IMPRIME-CABECALHO

Executar a rotina 2200-IMPRIME-DETALHE

Se contador de linha = 58

Executar a rotina 2300-IMPRIME-RODAPE

Executar o parágrafo 1500-LER-REPOSICAO

Page 273: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 8

www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218

31

8

Parágrafo 2100-IMPRIME-CABECALHO Somar 1 ao contador de páginas impressas Mover o contador de páginas impressas para variável do WS-CABEC1 Mover a data e a hora formatada para variável do WS-CABEC1 Gravar registro do RELREPO com base no WS-CABEC1

pulando uma página e testar file status Gravar registro do RELREPO com base no WS-CABEC2 e testar file status Gravar registro do RELREPO com base no WS-CABEC3 e testar file status Gravar registro do RELREPO com base no WS-CABEC4 e testar file status Mover 4 para o contador de linha Parágrafo 2200-IMPRIME-DETALHE Mover os dados da variável hospedeira para as variáveis na WS-LINDET Calcular o lucro e movê-lo para a variável na WS-LINDET Calcular a quantidade de reposição e movê-la para a variável na WS-LINDET Gravar registro do RELREPO com base na WS-LINDET e testar file status Somar 1 ao contador de linhas de detalhes impressas Somar 1 ao contador de linha Parágrafo 2300-IMPRIME-RODAPE Calcular quantas linhas precisam ser puladas para chegar na linha 59 Gravar registro do RELREPO com base no WS-RODAPE1

pulando linhas para chegar na linha 59 e testar file status Gravar registro do RELREPO com base no WS-RODAPE2 e testar file status Mover 60 para o contador de linha Parágrafo 3000-TERMINO Se contador de linha for menor que 60 Executar a rotina 2300-IMPRIME-RODAPE fim-se

Fechar o arquivo RELREPO

Se file status for diferente de “00” Mover mensagem de erro para variável da rotina de erro Mover file status para variável da rotina de erro Executar a rotina de erro (9000-ERRO) Fechar o cursor REPOSICAO

Se SQLCODE for diferente de zero Mover mensagem de erro para variável da rotina de erro DB2 Mover SQLCODE para a variável formatada Executar a rotina de erro DB2 (9000-ERRO-DB2)

Receber o horário final de processamento

Calcular o tempo de processamento

Exibir SYSOUT de acordo com LAYOUT

Exibir o contador de produtos lidos

Exibir o contador de linhas impressas

Exibir o contador de páginas impressas

Exibir o tempo de processamento

Exibir mensagem de termino normal do programa

Page 274: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 8

www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218

32

Parágrafo 9000-TRATA-INDICATOR

Se o indicator para uma variável hospedeira numérica for negativo

Mover zeros para a variável hospedeira

Se o indicator para uma variável hospedeira alfanumérica for negativo

Mover asteriscos para a variável hospedeira

Parágrafo 9000-ERRO

Exibir mensagem de erro

Exibir file status

Abendar o programa com RETURN-CODE = 12

Parágrafo 9000-ERRO-DB2

Exibir mensagem de erro

Exibir SQLCODE formatado

Exibir SQLERRMC (mensagem de erro do SQLCODE)

Abendar o programa com RETURN-CODE = 16

Parágrafo 9100-FORMATA-DATA-HORA

Receber a data do sistema

Receber a hora do sistema

Mover correspondentemente a data do sistema para variável formatada

Mover correspondentemente a hora do sistema para variável formatada

Page 275: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 8

www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218

33

8

Page 276: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 8

www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218

34

Avaliação Então...Como foi ?!?

Estou fera!

Fiz Certo!

Muito Bom Bom regular ruim Muito ruim

Page 277: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte

É um dos precursores dos conceitos dedata warehouse e sistemas de análise de dadostransacionais. Ele é conhecido por suasconvicções de que o data warehouse deve ser

desenhado para ser compreensível e rápido.

Ralph Kimball1944 (68 anos)

Page 278: Grande Porte - COBOL Level 2 - Versão 2.2.3

Versão 2.2.3

Page 279: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 9

www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218

3

9

Antes de iniciarmos, vamos conversar sobre os tópicos apresentados na capa desta parte. Isso é importante para que seu instrutor e seus colegas saibam como está seu conhecimento sobre o assunto e se você precisa ou pode fornecer ajuda aos colegas e instrutor.

O que você já sabe ?

O que você não sabe ?

Porque é importante conhecer estes tópicos ?

Quais são os seus temores ?

O que você considera difícil ?

Depois de falar sobre o assunto com seus colegas e instrutor, escreva,

desenhe, rabisque, diga algo sobre o que você vai fazer para dominar esses tópicos. Comprometa-se!

Preparation

Trocando Ideias É agora que você fala !!

Reflexão É aqui que você se compromete !!

Page 280: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 9

www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218

4

Chegamos a parte final de nosso treinamento com DB2, aqui aprenderemos os

“macetes” utilizados nos programas batch com DB2, tais como a definição de unidades

lógicas de trabalho, a utilização de cursor para atualização e exclusão posicionada e a

utilização de cursor com JOIN.

Continue praticando em sua casa, criando e dando manutenção em tabelas,

desenvolvendo programas batch, fazendo experiências, etc.

Vamos então à parte final de nosso treinamento.

Presentation

História Finalizando...

Page 281: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 9

www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218

5

9

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 cláusula 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 (CURRENT OF).

Para usar uma atualização posicionada, a declaração do CURSOR precisa

definir que ele será usado para atualizações, citando as colunas que serão atualizadas

com a seguinte sintaxe:

----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8

PROCEDURE DIVISION.

.......

EXEC SQL

DECLARE nome_do_cursor CURSOR FOR

SELECT coluna1, coluna2, ......

FROM tabela

WHERE restricao

FOR UPDATE OF coluna1, coluna2, ...

END-EXEC

Critérios para a declaração de cursor com atualização pocisionada:

a) O SELECT deve buscar dados em apenas uma tabela, não é permitido o uso

de JOINs.

b) Não pode ter a cláusula ORDER BY

c) Não pode ter a palavra chave DISTINCT

d) Não pode ter a cláusula GROUP BY ou HAVING

e) Não pode ter subqueries em que busquem seus dados na mesma tabela

Quando o cursor for declarado para atualização com a sintaxe acima, após

cada FETCH o programa pode atualizar a linha lida com a sintaxe abaixo:

----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8

PROCEDURE DIVISION.

.......

EXEC SQL

UPDATE tabela

SET coluna1 = :valor1,

coluna2 = :valor2,

.......

WHERE CURRENT OF nome_do_cursor

END-EXEC

Teoria Atualização posicionada

Page 282: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 9

www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218

6

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 cláusula 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 (CURRENT OF).

Para usar uma exclusão posicionada, a declaração do CURSOR precisa definir

que ele será usado para atualizações com a seguinte sintaxe:

----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8

PROCEDURE DIVISION.

.......

EXEC SQL

DECLARE nome_do_cursor CURSOR FOR

SELECT coluna1, coluna2, ......

FROM tabela

WHERE restricao

FOR UPDATE OF coluna1, coluna2, ...

END-EXEC

Valem os mesmos critérios para a declaração de cursor com atualização

pocisionada, visto anteriormente. Quando o cursor foi declarado para atualização com

a sintaxe acima, após cada FETCH o programa pode excluir a linha lida com a sÍntaxe

abaixo:

----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8

PROCEDURE DIVISION.

.......

EXEC SQL

DELETE FROM tabela

WHERE CURRENT OF nome_do_cursor

END-EXEC

Teoria Exclusão posicionada

Page 283: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 9

www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218

7

9

Uma Logical Unit of Work (LUW) também conhecida como UNIT OF WORK ou

UNIT OF RECOVERY, é uma sequência de comandos SQL que o DB2 entende como

uma unidade de consistência e recuperação. Este conceito é importante para que o

DB2 possa garantir a integridade do banco de dados. Ele faz isso tendo certeza de

que toda ou nenhuma das atualizações em uma Logical Unit of Work seja feita. Uma

grande responsabilidade de qualquer programa BATCH é agrupar seus comandos

SQL em LUWs.

Alguns processamentos podem ser divididos em pontos nas quais os dados

estão “consistentes”. Por exemplo:

Suponha que todo cliente alterado para inativo, deve ter seus pedidos

excluídos da base. Assim, uma LUW é formada pelo UPDATE do cliente e pelo

DELETE de seus pedidos.

Se o UPDATE ou o DELETE derem SQLCODE < 0, a LUW não está completa

e deve ser emitido um ROLLBACK. Assim, é inaceitável que um processamento seja

interrompido durante uma LUW.

Para o DB2, o final de uma LUW é chamada de COMMIT POINT. Esta situação

é estabelecida ao término normal do programa ou com execução de uma instrução

COMMIT.

Com a instrução COMMIT:

Todas as atualizações feitas até então são validadas

Atualizações são registradas no LOG do DB2

Liberação de páginas e/ou tablespaces presos (lock) podem ocorrer

Indica-se que uma LUW chegou ao seu final com sucesso

Todos os cursores abertos sem a opção WITH HOLD são fechados

Teoria Logical unit of work

COMMIT

linha do

tempo

ponto de

consistência

início da

LUW

novo ponto de

consistência

UPDATE DELETE

término da

LUW

COMMIT

novo ponto de

consistência

UPDATE DELETE

término da

LUW

Page 284: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 9

www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218

8

Uma LUW incompleta deve ser desfeita até o último COMMIT POINT. Este

processamento é conhecido com ROLLBACK. O ROLLBACK é disparado ao término

anormal do programa ou com execução de uma instrução ROLLBACK.

Com a instrução ROLLBACK:

A LUW corrente é abandonada

Todas as atualizações feitas a partir do último COMMIT são desfeitas

Liberação de páginas e/ou tablespaces presos (lock) podem ocorrer

Todos os cursores abertos sem a opção WITH HOLD são fechados

Em geral, nos sistemas Batch que atualizam tabelas do DB2, deve-se estabelecer

as LUW e executar COMMIT e ROLLBACK nos momentos apropriados.

Um programa pode ter vários cursores abertos ao mesmo tempo. Porém

procure sempre manter o menor número de cursores abertos simultaneamente, para

otimizar a performance.

Para programas que irão emitir COMMIT e necessitam reposicionar o cursor,

defina o cursor com cláusula WITH HOLD.

Exemplo:

----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8

PROCEDURE DIVISION.

.......

EXEC SQL

DECLARE nome_do_cursor CURSOR WITH HOLD FOR

SELECT coluna1, coluna2, ......

FROM tabela

WHERE restricao

FOR UPDATE OF coluna1, coluna2, ...

END-EXEC

Um CLOSE nome_do_cursor não implica no fim de uma Logical Unit of Work

(LUW) e portanto não gera um COMMIT.

Uma instrução COMMIT fecha todos os cursores sem opção WITH HOLD e

valida todas as atualizações efetuadas, encerrando a LUW.

Teoria CURSORES E COMMIT

Page 285: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 9

www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218

9

9

Manutenção no GPAZNND2. Definir no

parágrafo 3000-PROCESSAR uma Logical Unit of

Work (LUW), para executar um COMMIT ou

ROLLBACK.

No parágrafo 3000-PROCESSAR, após a verificação do tipo de movimento,

fazer:

Se WS-TIPOMOVTO-D2 for “I” ou “E” ou “A” ou “C”

Se SQLCODE for igual a zero

COMMIT

Senão

ROLLBACK

Fim-se

Fim-se

Executar os passos abaixo, (lembre-se que XXNN é o prefixo de seu usuário).

1- Fazer uma cópia de segurança do programa GPXXNND2 copiando-o para a

COBLIB com o nome BKPPGMD2.

2- Editar o programa GPXXNND2 fazendo a manutenção solicitada.

3- Altere o JOB COMPBDB2 para compilar o programa GPXXNND2 e submeter o

JOB até obter MAXCC = 0

4- Executar o JOB EXECOBD2 e comparar o resultado com os seus colegas e

com a primeira execução do programa.

Practice

Atividade Prática de laboratório

Page 286: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 9

www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218

10

Anote abaixo os valores dos contadores que foram exibidos na SYSOUT

==================================================

== ESTATISTICA FINAL DE PROCESSAMENTO ==

==================================================

QTDE. PRODUTOS LIDOS MOVPRDD2..........: _________

QTDE. PRODUTOS INSERIDOS TBPRODUTO...: _________

QTDE. PRODUTOS EXCLUIDOS TBPRODUTO...: _________

QTDE. PRODUTOS ALTERADOS TBPRODUTO...: _________

QTDE. PRODUTOS CONSULTADOS TBPRODUTO...: _________

QTDE. MOVIMENTOS INVALIDOS.............: _________

==================================================

TEMPO TOTAL DE PROCESSAMENTO.........: ___________

==================================================

== TERMINO NORMAL DO PROGRAMA GPXXNND2 ==

==================================================

Page 287: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 9

www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218

11

9

Atualização da Tabela TBPRODUTO pelo CURSOR, com base no arquivo de movimentos MOVPRDD4.

Objetivo do Programa

A Metal Screws Inc. precisa fazer outra manutenção em sua tabela de

produtos. Desta vez as alterações e exclusões estão gravadas no arquivo

MOVPRDD4.

Precisamos então escrever o programa GPXXNND4 para ler esse movimento e

atualizar a tabela produto usando a técnica da atualização e exclusão posicionada via

cursor.

Macro-Fluxo

Performance

Atividade PROJETO 4 - ATUALIZACÃO,

TBPRODUTO

MOVPRDD4

GPXXNND4

Page 288: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 9

www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218

12

Layout do Arquivo

Nome do Arquivo MOVPRDD4

Nome do Registro REG-MOVPRDD4

Nome do Campo Tipo e Tamanho

Descrição

CODPROD-D4 X(04) Código

DESCPROD-D4 X(20) Descrição

UNIDPROD-D4 X(05) Unidade (caixa, litro, Kg, etc)

LOCALPROD-D4 X(05) Localização no estoque

QTDEST-D4 9(05) Quantidade em estoque

QTDMAX-D4 9(05) Qtde máxima em estoque

QTDMIN-D4 9(05) Qtde mínima em estoque

PRECOCOMPRA-D4 9(06)V99 Preço de Compra

PRECOVENDA-D4 9(06)V99 Preço de Venda

PERCOMIS-D4 9(02)V99 Percentual de comissão

TIPOMOVTO-D4 X(01) Tipo de movimento (E,A)

Layout da Tabela

Nome da tabela TBPRODUTO

Nome da coluna Tipo e Tamanho

Complementos

CODPROD CHAR(4) UNIQUE NOT NULL

DESCPROD VARCHAR(20) NOT NULL

UNIDPROD CHAR(5)

LOCALPROD CHAR(5)

QTDEST DECIMAL(5,0)

QTDMAX DECIMAL(5,0) > QTDMIN

QTDMIN DECIMAL(5,0) < QTDMAX

PRECOCOMPRA DECIMAL(8,2) >= 0

PRECOVENDA DECIMAL(8,2) >= 0

PERCOMIS DECIMAL(4,2) >= 0

Page 289: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 9

www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218

13

9

Layout da SYSOUT

1 2 3 4 5

12345678901234567890123456789012345678901234567890

**************************************************

* DATA GREGORIANA 1 - 99/99/2099 *

* DATA GREGORIANA 2 - 99 DE XXXXXXXXX DE 2099 *

* DATA JULIANA – 999 DE 2099 *

* DIA DA SEMANA – XXXXXXXXXXXXX *

**************************************************

1 2 3 4 5

12345678901234567890123456789012345678901234567890

==================================================

== ESTATISTICA FINAL DE PROCESSAMENTO ==

==================================================

QTDE. MOVIMENTOS LIDOS MOVPRDD4......: ZZ.ZZ9

QTDE. PRODUTOS LIDOS NO CURSOR.......: ZZ.ZZ9

QTDE. PRODUTOS EXCLUIDOS.............: ZZ.ZZ9

QTDE. PRODUTOS ALTERADOS.............: ZZ.ZZ9

QTDE. MOVIMENTOS INVALIDOS...........: ZZ.ZZ9

==================================================

TEMPO TOTAL DE PROCESSAMENTO.........: HH:MM:SS:CC

==================================================

== TERMINO NORMAL DO PROGRAMA GPXXNND4 ==

==================================================

Page 290: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 9

www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218

14

Observação

Montar um cursor (MANUTENCAO) selecionando da tabela TBPRODUTO

aqueles cuja quantidade em estoque é menor que o limite mínimo. Com base no

cursor MANUTENCAO e no arquivo MOVPRDD4, fazer exclusões e atualizações

posicionadas na tabela PRODUTO via cursor.

O campo TIPOMOVTO-M indica o tipo de movimento:

E – exclusão de produto (exclusão posicionada)

A – alteração dos dados do produto (alteração posicionada)

outro – erro de movimento, ignorar registro

1) Edite o membro BK002D4 em sua BOOKLIB com as variáveis espelho do

arquivo MOVPRDD4.

2) Edite o programa GPXXNND4 em sua COBLIB.

3) Altere o JOB COMPBDB2 para compilar o programa GPXXNND4 e

compilar até obter MAXCC = 0

4) Copie o membro EXECOBD4, da JOBLIB de seu instrutor, para a sua

JOBLIB.

5) Alterar o JOB EXECOBD4, substituindo XXNN pelo seu prefixo de usuário.

6) Executar o JOB e comparar o resultado com os de seus colegas.

Anote abaixo os valores dos contadores que foram exibidos na SYSOUT

==================================================

== ESTATISTICA FINAL DE PROCESSAMENTO ==

==================================================

QTDE. MOVIMENTOS LIDOS MOVPRDD4......: _________

QTDE. PRODUTOS LIDOS NO CURSOR.......: _________

QTDE. PRODUTOS EXCLUIDOS.............: _________

QTDE. PRODUTOS ALTERADOS.............: _________

QTDE. MOVIMENTOS INVALIDOS...........: _________

==================================================

TEMPO TOTAL DE PROCESSAMENTO.........: _________

==================================================

== TERMINO NORMAL DO PROGRAMA GPXXNND4 ==

==================================================

Page 291: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 9

www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218

15

9

Orientação para processamento

Como já foi visto, não pode haver um parágrafo principal. Executar o parágrafo 1000-INICIALIZAR Executar o parágrafo 2000-PROCESSAR

até que o file status do arquivo MOVPRDD4 seja “10” Executar o parágrafo 3000-TERMINO Encerrar o programa Parágrafo 1000-INICIALIZAR Receber o horário inicial de processamento

Mover zero para os contadores: registros lidos no arquivo de movimento produtos lidos no cursor por produto produtos lidos no cursor em geral produtos excluídos da tabela produtos alterados da tabela movimento inválido no arquivo

Abrir para leitura o arquivo MOVPRDD4 Se file status for diferente de “00” Mover mensagem de erro para variável da rotina de erro Mover file status para variável da rotina de erro Executar a rotina de erro (9000-ERRO) Definir o cursor MANUTENCAO com a opção WITH HOLD para atualização e

exclusão pocisionada Executar o parágrafo 1500-LER-MOVPRDD4

Parágrafo 1500-LER-MOVPRDD4

Ler registro do arquivo MOVPRDD4 carregando a variável espelho

Se file status for igual a “00” (sucesso)

Somar 1 ao contador de registros lidos no arquivo de movimento

Senão

Se file status for diferente de “10” (fim de arquivo)

Mover mensagem de erro para variável da rotina de erro

Mover file status para variáveis da rotina de erro

Executar rotina de erro (9000-ERRO)

Page 292: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 9

www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218

16

Parágrafo 2000-PROCESSAR

Se WS-TIPOMOVTO-D4 = “A” OR “E”

Abrir o cursor MANUTENCAO Se SQLCODE for diferente de zero

Mover mensagem de erro para variável da rotina de erro DB2 Mover SQLCODE para a variável formatada Executar a rotina de erro DB2 (9000-ERRO-DB2)

Executar o parágrafo 2100-LER- MANUTENCAO (WITH TEST AFTER)

até que WS-CODPROD-D4 = CODPROD ou SQLCODE = +100

Se SQLCODE = 0 (achou o produto no cursor)

exibir mensagem:

“Para localizar produto XXXX foram necessários ler 9999 registros do cursor”

zerar o contador de registros lidos no cursor por produto

se WS-TIPOMOVTO-D4 = “E”

executar o parágrafo 2200-EXCLUSAO

se WS-TIPOMOVTO-D4 = “A”

executar o parágrafo 2300-ALTERACAO

Senão

Somar 1 ao contador de movimento inválido

Fechar o cursor MANUTENCAO Se SQLCODE for diferente de zero

Mover mensagem de erro para variável da rotina de erro DB2 Mover SQLCODE para a variável formatada Executar a rotina de erro DB2 (9000-ERRO-DB2) Senão

Somar 1 ao contador de movimento inválido

Ler o próximo registro do arquivo MOVPRDD4 (1500-LER-MOVPRDD4)

Parágrafo 2100-LER-MANUTENCAO Pegar a próxima linha do cursor MANUTENCAO (FETCH) Se SQLCODE for igual a zero

Executar a rotina 9000-TRATA-INDICATOR Somar 1 ao contador de produtos lidos pelo cursor em geral Somar 1 ao contador de produtos lidos pelo cursor por produto Senão Se SQLCODE for diferente de 100 Mover mensagem de erro para variável da rotina de erro DB2 Mover SQLCODE para variável formatada Executar a rotina de erro para DB2 (9000-ERRO-DB2)

Page 293: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 9

www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218

17

9

Parágrafo 2200-EXCLUSAO

Excluir a posição corrente do cursor (DELETE) Se SQLCODE = 0

Somar 1 ao contador produtos excluídos COMMIT

senão Se SQLCODE = +100

Somar 1 ao contador movimento inválido Senão

Mover mensagem de erro para variável da rotina de erro DB2 Mover SQLCODE para variável formatada Executar a rotina de erro para DB2 (9000-ERRO-DB2)

Parágrafo 2300-ALTERACAO

Mover os dados da variável espelho WS-REG-MOVPRDD4 com conteúdo válido para as respectivas variáveis hospedeiras. Um campo é considerado com conteúdo válido se for alfanumérico e for diferente de SPACES ou se for numérico e tiver conteúdo numérico (IS NUMERIC). Alterar a posição corrente do cursor (UPDATE) Se SQLCODE = 0

somar 1 ao contador WS-CTALT COMMIT

Senão Se SQLCODE = +100 or -545 somar 1 ao contador WS-CTINV Senão

Mover mensagem de erro para variável da rotina de erro DB2 Mover SQLCODE para variável formatada

executar a rotina 999-ERRO-DB2

Parágrafo 3000-TERMINO

Fechar o arquivo MOVPRDD4

Se file status for diferente de “00” Mover mensagem de erro para variável da rotina de erro Mover file status para variável da rotina de erro Executar a rotina de erro (9000-ERRO)

Receber o horário final de processamento

Calcular o tempo de processamento

Exibir SYSOUT de acordo com LAYOUT

Exibir registros lidos no arquivo de movimento Exibir produtos lidos no cursor em geral Exibir produtos excluídos da tabela Exibir produtos alterados da tabela Exibir movimento inválido no arquivo

Exibir o tempo de processamento

Exibir mensagem de termino normal do programa

Page 294: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 9

www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218

18

Parágrafo 9000-TRATA-INDICATOR

Se o indicator para uma variável hospedeira numérica for negativo

Mover zeros para a variável hospedeira

Se o indicator para uma variável hospedeira alfanumérica for negativo

Mover asteriscos para a variável hospedeira

Parágrafo 9000-ERRO

Exibir mensagem de erro

Exibir file status

Abendar o programa com RETURN-CODE = 12

Parágrafo 9000-ERRO-DB2

Exibir mensagem de erro

Exibir SQLCODE formatado

Exibir SQLERRMC (mensagem de erro do SQLCODE)

Abendar o programa com RETURN-CODE = 16

Page 295: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 9

www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218

19

9

Page 296: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 9

www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218

20

Avaliação Então...Como foi ?!?

Estou fera!

Fiz Certo!

Muito Bom Bom regular ruim Muito ruim

Page 297: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte

ANEXOS

Page 298: Grande Porte - COBOL Level 2 - Versão 2.2.3

Versão 2.2.3

Page 299: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 10

www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218

3

Successful Execution SQLCODE

0 SUCCESSFUL EXECUTION

Warning SQLCODE

12 THE UNQUALIFIED COLUMN NAME column-name WAS INTERPRETED AS A CORRELATED REFERENCE

98 A DYNAMIC SQL STATEMENT ENDS WITH A SEMICOLON

100

ROW NOT FOUND FOR FETCH, UPDATE OR DELETE, OR THE RESULT OF A QUERY IS AN EMPTY

TABLE

110 SQL UPDATE TO A DATA CAPTURE TABLE NOT SIGNALED TO ORIGINATING SUBSYSTEM

111 THE SUBPAGES OPTION IS NOT SUPPORTED FOR TYPE 2 INDEXES

117 THE NUMBER OF INSERT VALUES IS NOT THE SAME AS THE NUMBER OF OBJECT COLUMNS

162 TABLESPACE database-name.tablespace-name HAS BEEN PLACED IN CHECK PENDING

203

THE QUALIFIED COLUMN NAME column-name WAS RESOLVED USING A NON-UNIQUE OR UNEXPOSED

NAME

204 name IS AN UNDEFINED NAME

206

column-name IS NOT A COLUMN OF AN INSERTED TABLE, UPDATED TABLE, OR ANY TABLE

IDENTIFIED IN A FROM CLAUSE

218 THE SQL STATEMENT REFERENCING A REMOTE OBJECT CANNOT BE EXPLAINED

219 THE REQUIRED EXPLANATION TABLE table-name DOES NOT EXIST

220 THE COLUMN column-name IN EXPLANATION TABLE table-name IS NOT DEFINED PROPERLY

304

A VALUE WITH DATA TYPE data-type1 CANNOT BE ASSIGNED TO A HOST VARIABLE BECAUSE THE

VALUE IS NOT WITHIN THE RANGE OF THE HOST VARIABLE IN POSITION position-number WITH DATA

TYPE data-type2

331

THE NULL VALUE HAS BEEN ASSIGNED TO A HOST VARIABLE BECAUSE THE STRING CANNOT BE

TRANSLATED. REASON reason-code, CHARACTER code-point, HOST VARIABLE position-number

339

THE SQL STATEMENT HAS BEEN SUCCESSFULLY EXECUTED, BUT THERE MAY BE SOME

CHARACTER CONVERSION INCONSISTENCIES

402 LOCATION location IS UNKNOWN

403 THE LOCAL OBJECT REFERENCED BY THE CREATE ALIAS STATEMENT DOES NOT EXIST

535 THE RESULT OF THE POSITIONED UPDATE OR DELETE MAY DEPEND ON THE ORDER OF THE ROWS.

541 THE REFERENTIAL OR UNIQUE CONSTRAINT name HAS BEEN IGNORED BECAUSE IT IS A DUPLICATE

551 auth-id DOES NOT HAVE THE PRIVILEGE TO PERFORM OPERATION operation ON OBJECT object-name

552 auth-id DOES NOT HAVE THE PRIVILEGE TO PERFORM OPERATION operation

558 THE WITH GRANT OPTION IS IGNORED

561

THE ALTER, INDEX, AND REFERENCES PRIVILEGES CANNOT BE GRANTED TO PUBLIC AT ALL

LOCATIONS

562

A GRANT OF A PRIVILEGE WAS IGNORED BECAUSE THE GRANTEE ALREADY HAS THE PRIVILEGE

FROM THE GRANTOR

Teoria Sqlcode table

Page 300: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 10

www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218

4

610

INDEX index-name HAS BEEN PLACED IN RECOVER PENDING

625 THE DEFINITION OF TABLE table-name HAS BEEN CHANGED TO INCOMPLETE

626

DROPPING THE INDEX TERMINATES ENFORCEMENT OF THE UNIQUENESS OF A KEY THAT WAS

DEFINED WHEN THE TABLE WAS CREATED

645 WHERE NOT NULL IS IGNORED BECAUSE THE INDEX KEY CANNOT CONTAIN NULL VALUES

650 THE TABLE BEING CREATED OR ALTERED CANNOT BECOME A DEPENDENT TABLE

653

TABLE table-name IN PARTITIONED TABLESPACE tspace-name IS NOT AVAILABLE BECAUSE ITS

PARTITIONED INDEX HAS NOT BEEN CREATED

658 THE SUBPAGES VALUE IS IGNORED FOR THE CATALOG INDEX index-name

664

THE INTERNAL LENGTH OF THE LIMIT-KEY FIELDS FOR THE PARTITIONED INDEX index-name

EXCEEDS THE LENGTH IMPOSED BY THE INDEX MANAGER

738

DEFINITION CHANGE OF object object_name MAY REQUIRE SIMILAR CHANGE ON READ-ONLY

SYSTEMS

802

EXCEPTION ERROR exception-type HAS OCCURRED DURING operation-type OPERATION ON data-type

DATA, POSITION position-number

806

BIND ISOLATION LEVEL RR CONFLICTS WITH TABLESPACE LOCKSIZE PAGE OR LOCKSIZE ROW

AND LOCKMAX 0

807 THE RESULT OF DECIMAL MULTIPLICATION MAY CAUSE OVERFLOW

863 THE CONNECTION WAS SUCCESSFUL BUT ONLY SBCS WILL BE SUPPORTED

2000

TYPE 1 INDEXES WITH SUBPAGES GREATER THAN 1 CANNOT BECOME GROUP BUFFER POOL

DEPENDENT IN A DATA SHARING ENVIRONMENT

30100

OPERATION COMPLETED SUCCESSFULLY BUT A DISTRIBUTION PROTOCOL VIOLATION HAS BEEN

DETECTED. ORIGINAL SQLCODE=original-sqlcode AND ORIGINAL SQLSTATE=original-sqlstate

Error SQLCODE

-7 STATEMENT CONTAINS THE ILLEGAL CHARACTER character

-10 THE STRING CONSTANT BEGINNING string IS NOT TERMINATED

-29 INTO CLAUSE REQUIRED

-60 INVALID type SPECIFICATION : spec

-84 UNACCEPTABLE SQL STATEMENT

-101 THE STATEMENT IS TOO LONG OR TOO COMPLEX

-102 LITERAL STRING IS TOO LONG. STRING BEGINS string

-103 literal IS AN INVALID NUMERIC LITERAL

-104 ILLEGAL SYMBOL "token". SOME SYMBOLS THAT MIGHT BE LEGAL ARE: token-list

-105 INVALID STRING

-107 THE NAME name IS TOO LONG. MAXIMUM ALLOWABLE SIZE IS size

-109 clause CLAUSE IS NOT PERMITTED

-110 INVALID HEXADECIMAL LITERAL BEGINNING string

-111 A COLUMN FUNCTION DOES NOT INCLUDE A COLUMN NAME

-112 THE OPERAND OF A COLUMN FUNCTION IS ANOTHER COLUMN FUNCTION

-113 INVALID CHARACTER FOUND IN string, REASON CODE - nnn

-114 THE LOCATION NAME location DOES NOT MATCH THE CURRENT SERVER

-115

A PREDICATE IS INVALID BECAUSE THE COMPARISON OPERATOR operator IS FOLLOWED BY A

PARENTHESIZED LIST OR BY ANY OR ALL WITHOUT A SUBQUERY

-117 THE NUMBER OF INSERT VALUES IS NOT THE SAME AS THE NUMBER OF OBJECT COLUMNS

Page 301: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 10

www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218

5

-118

THE OBJECT TABLE OR VIEW OF THE INSERT, DELETE, OR UPDATE STATEMENT IS ALSO IDENTIFIED

IN A FROM CLAUSE

-119 A COLUMN IDENTIFIED IN A HAVING CLAUSE IS NOT INCLUDED IN THE GROUP BY CLAUSE

-120 A WHERE CLAUSE OR SET CLAUSE INCLUDES A COLUMN FUNCTION

-121 THE COLUMN name IS IDENTIFIED MORE THAN ONCE IN THE INSERT OR UPDATE STATEMENT

-122

A SELECT STATEMENT WITH NO GROUP BY CLAUSE CONTAINS A COLUMN NAME AND A COLUMN

FUNCTION IN THE SELECT CLAUSE OR A COLUMN NAME IS CONTAINED IN THE SELECT CLAUSE

BUT NOT IN THE GROUP BY CLAUSE

-125 AN INTEGER IN THE ORDER BY CLAUSE DOES NOT IDENTIFY A COLUMN OF THE RESULT

-126 THE SELECT STATEMENT CONTAINS BOTH AN UPDATE CLAUSE AND AN ORDER BY CLAUSE

-127 DISTINCT IS SPECIFIED MORE THAN ONCE IN A SUBSELECT

-128 INVALID USE OF NULL IN A PREDICATE

-129 THE STATEMENT CONTAINS TOO MANY TABLE NAMES

-130

THE ESCAPE CLAUSE CONSISTS OF MORE THAN ONE CHARACTER, OR THE STRING PATTERN

CONTAINS AN INVALID OCCURRENCE OF THE ESCAPE CHARACTER

-131 STATEMENT WITH LIKE PREDICATE HAS INCOMPATIBLE DATA TYPES

-132 A LIKE PREDICATE IS INVALID BECAUSE THE SECOND OPERAND IS NOT A STRING

-133

A COLUMN FUNCTION IN A SUBQUERY OF A HAVING CLAUSE IS INVALID BECAUSE ALL COLUMN

REFERENCES IN ITS ARGUMENT ARE NOT CORRELATED TO THE GROUP BY RESULT THAT THE

HAVING CLAUSE IS APPLIED TO

-134

IMPROPER USE OF LONG STRING COLUMN column-name OR A HOST VARIABLE OF MAXIMUM

LENGTH GREATER THAN 254

-136 SORT CANNOT BE EXECUTED BECAUSE THE SORT KEY LENGTH IS GREATER THAN 4000 BYTES

-137 RESULT OF CONCATENATION TOO LONG

-138 THE SECOND OR THIRD ARGUMENT OF THE SUBSTR FUNCTION IS OUT OF RANGE

-144 INVALID SECTION NUMBER number

-150

THE OBJECT OF THE INSERT, DELETE, OR UPDATE STATEMENT IS A VIEW FOR WHICH THE

REQUESTED OPERATION IS NOT PERMITTED

-151

THE UPDATE STATEMENT IS INVALID BECAUSE THE CATALOG DESCRIPTION OF COLUMN column-

name INDICATES THAT IT CANNOT BE UPDATED

-152

THE DROP clause CLAUSE IN THE ALTER STATEMENT IS INVALID BECAUSE constraint-name IS A

constraint-type

-153 THE CREATE VIEW STATEMENT DOES NOT INCLUDE A REQUIRED COLUMN LIST

-154

THE CREATE VIEW FAILED BECAUSE THE VIEW DEFINITION CONTAINS A UNION, A UNION ALL, OR

A REMOTE OBJECT

-156 THE STATEMENT DOES NOT IDENTIFY A TABLE

-157

ONLY A TABLE NAME CAN BE SPECIFIED IN A FOREIGN KEY CLAUSE. object-name IS NOT THE NAME

OF A TABLE.

-158

THE NUMBER OF COLUMNS SPECIFIED FOR THE VIEW IS NOT THE SAME AS THE NUMBER OF

COLUMNS SPECIFIED BY THE SELECT CLAUSE

-159 DROP OR COMMENT ON token IDENTIFIES A(N) token RATHER THAN A(N) token

-160 THE WITH CHECK OPTION CANNOT BE USED FOR THE SPECIFIED VIEW

-161

THE INSERT OR UPDATE IS NOT ALLOWED BECAUSE A RESULTING ROW DOES NOT SATISFY THE

VIEW DEFINITION

-164 auth-id1 DOES NOT HAVE THE PRIVILEGE TO CREATE A VIEW WITH QUALIFICATION authorization ID

-170 THE NUMBER OF ARGUMENTS SPECIFIED FOR function-name IS INVALID

-171 THE DATA TYPE, LENGTH, OR VALUE OF ARGUMENT nn OF function-name IS INVALID

-173 UR IS SPECIFIED ON THE WITH CLAUSE BUT THE CURSOR IS NOT READ-ONLY

Page 302: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 10

www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218

6

-180 THE STRING REPRESENTATION OF A DATETIME VALUE HAS INVALID SYNTAX

-181 THE STRING REPRESENTATION OF A DATETIME VALUE IS NOT A VALID DATETIME VALUE

-182 AN ARITHMETIC EXPRESSION WITH A DATETIME VALUE IS INVALID

-183

AN ARITHMETIC OPERATION ON A DATE OR TIMESTAMP HAS A RESULT THAT IS NOT WITHIN THE

VALID RANGE OF DATES

-184 AN ARITHMETIC EXPRESSION WITH A DATETIME VALUE CONTAINS A PARAMETER MARKER

-185

THE LOCAL FORMAT OPTION HAS BEEN USED WITH A DATE OR TIME AND NO LOCAL EXIT HAS

BEEN INSTALLED

-186

THE LOCAL DATE LENGTH OR LOCAL TIME LENGTH HAS BEEN INCREASED AND EXECUTING

PROGRAM RELIES ON THE OLD LENGTH

-187

A REFERENCE TO A CURRENT DATE/TIME SPECIAL REGISTER IS INVALID BECAUSE THE MVS TOD

CLOCK IS BAD OR THE MVS PARMTZ IS OUT OF RANGE

-188 THE STRING REPRESENTATION OF A NAME IS INVALID

-189 CCSID ccsid IS UNKNOWN OR INVALID FOR THE DATA TYPE OR SUBTYPE

-191 A STRING CANNOT BE USED BECAUSE IT IS INVALID MIXED DATA

-197

QUALIFIED COLUMN NAMES IN ORDER BY CLAUSE NOT PERMITTED WHEN UNION OR UNION ALL

SPECIFIED

-198 THE OPERAND OF THE PREPARE OR EXECUTE IMMEDIATE STATEMENT IS BLANK OR EMPTY

-199 ILLEGAL USE OF KEYWORD keyword. TOKEN token-list WAS EXPECTED

-203 A REFERENCE TO COLUMN column-name IS AMBIGUOUS

-204 name IS AN UNDEFINED NAME

-205 column-name IS NOT A COLUMN OF TABLE table-name

-206

column-name IS NOT A COLUMN OF AN INSERTED TABLE, UPDATED TABLE, OR ANY TABLE

IDENTIFIED IN A FROM CLAUSE

-208 THE ORDER BY CLAUSE IS INVALID BECAUSE COLUMN name IS NOT PART OF THE RESULT TABLE

-198 THE OPERAND OF THE PREPARE OR EXECUTE IMMEDIATE STATEMENT IS BLANK OR EMPTY

-199 ILLEGAL USE OF KEYWORD keyword. TOKEN token-list WAS EXPECTED

-203 A REFERENCE TO COLUMN column-name IS AMBIGUOUS

-204 name IS AN UNDEFINED NAME

-205 column-name IS NOT A COLUMN OF TABLE table-name

-206

column-name IS NOT A COLUMN OF AN INSERTED TABLE, UPDATED TABLE, OR ANY TABLE

IDENTIFIED IN A FROM CLAUSE

-208 THE ORDER BY CLAUSE IS INVALID BECAUSE COLUMN name IS NOT PART OF THE RESULT TABLE

-219 THE REQUIRED EXPLANATION TABLE table-name DOES NOT EXIST

-220 THE COLUMN column-name IN EXPLANATION TABLE table-name IS NOT DEFINED PROPERLY

-221

"SET OF OPTIONAL COLUMNS" IN EXPLANATION TABLE table-name IS INCOMPLETE. OPTIONAL

COLUMN column-name IS MISSING

-250 THE LOCAL LOCATION NAME IS NOT DEFINED WHEN PROCESSING A THREE-PART OBJECT NAME

-251 TOKEN name IS NOT VALID

-300

THE STRING CONTAINED IN HOST VARIABLE OR PARAMETER position-number IS NOT NUL-

TERMINATED

-301

THE VALUE OF INPUT HOST VARIABLE OR PARAMETER NUMBER position-number CANNOT BE USED

AS SPECIFIED BECAUSE OF ITS DATA TYPE

-302

THE VALUE OF INPUT VARIABLE OR PARAMETER NUMBER position-number IS INVALID OR TOO

LARGE FOR THE TARGET COLUMN OR THE TARGET VALUE

-303

A VALUE CANNOT BE ASSIGNED TO OUTPUT HOST VARIABLE NUMBER position-number BECAUSE

THE DATA TYPES ARE NOT COMPARABLE

Page 303: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 10

www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218

7

-304

A VALUE WITH DATA TYPE data-type1 CANNOT BE ASSIGNED TO A HOST VARIABLE BECAUSE THE

VALUE IS NOT WITHIN THE RANGE OF THE HOST VARIABLE IN POSITION position-number WITH DATA

TYPE data-type2

-305

THE NULL VALUE CANNOT BE ASSIGNED TO OUTPUT HOST VARIABLE NUMBER position-number

BECAUSE NO INDICATOR VARIABLE IS SPECIFIED

-309 A PREDICATE IS INVALID BECAUSE A REFERENCED HOST VARIABLE HAS THE NULL VALUE

-310 DECIMAL HOST VARIABLE OR PARAMETER number CONTAINS NON DECIMAL DATA.

-311

THE LENGTH OF INPUT HOST VARIABLE NUMBER position-number IS NEGATIVE OR GREATER THAN

THE MAXIMUM

-312 UNDEFINED OR UNUSABLE HOST VARIABLE variable-name

-313

THE NUMBER OF HOST VARIABLES SPECIFIED IS NOT EQUAL TO THE NUMBER OF PARAMETER

MARKERS

-314 THE STATEMENT CONTAINS AN AMBIGUOUS HOST VARIABLE REFERENCE

-330

A STRING CANNOT BE USED BECAUSE IT CANNOT BE TRANSLATED. REASON reason-code,

CHARACTER code-point, HOST VARIABLE position-number

-331

A STRING CANNOT BE ASSIGNED TO A HOST VARIABLE BECAUSE IT CANNOT BE TRANSLATED.

REASON reason-code, CHARACTER code-point, POSITION position-number

-332 SYSSTRINGS DOES NOT DEFINE A TRANSLATION FROM CCSID ccsid TO ccsid

-333

THE SUBTYPE OF A STRING VARIABLE IS NOT THE SAME AS THE SUBTYPE KNOWN AT BIND TIME

AND THE DIFFERENCE CANNOT BE RESOLVED BY TRANSLATION

-338 AN ON CLAUSE IS INVALID

-339

THE SQL STATEMENT CANNOT BE EXECUTED FROM AN ASCII BASED DRDA APPLICATION

REQUESTOR TO A V2R2 DB2 SUBSYSTEM

-351

AN UNSUPPORTED SQLTYPE WAS ENCOUNTERED IN POSITION "" ON A PREPARE or DESCRIBE

OPERATION

-400 THE CATALOG HAS THE MAXIMUM NUMBER OF USER DEFINED INDEXES

-401 THE OPERANDS OF AN ARITHMETIC OR COMPARISON OPERATION ARE NOT COMPARABLE

-402 AN ARITHMETIC FUNCTION OR OPERATOR arith-fop IS APPLIED TO CHARACTER OR DATETIME DATA

-404 THE UPDATE OR INSERT STATEMENT SPECIFIES A STRING THAT IS TOO LONG column-name

-405 THE NUMERIC LITERAL literal CANNOT BE USED AS SPECIFIED BECAUSE IT IS OUT OF RANGE

-406 A CALCULATED OR DERIVED NUMERIC VALUE IS NOT WITHIN THE RANGE OF ITS OBJECT COLUMN

-407

AN UPDATE OR INSERT VALUE IS NULL, BUT THE OBJECT COLUMN column-name CANNOT CONTAIN

NULL VALUES

-408

AN UPDATE OR INSERT VALUE IS NOT COMPARABLE WITH THE DATA TYPE OF ITS OBJECT COLUMN

column-name

-409 INVALID OPERAND OF A COUNT FUNCTION

-410 THE FLOATING POINT LITERAL literal CONTAINS MORE THAN 30 CHARACTERS

-411 CURRENT SQLID CANNOT BE USED IN A STATEMENT THAT REFERENCES REMOTE OBJECTS

-412 THE SELECT CLAUSE OF A SUBQUERY SPECIFIES MULTIPLE COLUMNS

-414 A LIKE PREDICATE IS INVALID BECAUSE THE FIRST OPERAND IS NOT A STRING

-415

THE CORRESPONDING COLUMNS, column-number, OF THE OPERANDS OF A UNION OR A UNION ALL

DO NOT HAVE COMPARABLE COLUMN DESCRIPTIONS

-416 AN OPERAND OF A UNION CONTAINS A LONG STRING COLUMN

-417

A STATEMENT STRING TO BE PREPARED INCLUDES PARAMETER MARKERS AS THE OPERANDS OF

THE SAME OPERATOR

-418 A STATEMENT STRING TO BE PREPARED CONTAINS AN INVALID USE OF PARAMETER MARKERS

-419

THE DECIMAL DIVIDE OPERATION IS INVALID BECAUSE THE RESULT WOULD HAVE A NEGATIVE

SCALE

-420

THE VALUE OF A CHARACTER STRING ARGUMENT WAS NOT ACCEPTABLE TO THE function-name

FUNCTION

Page 304: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 10

www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218

8

-421 THE OPERANDS OF A UNION OR UNION ALL DO NOT HAVE THE SAME NUMBER OF COLUMNS

-426 DYNAMIC COMMIT NOT VALID AT AN APPLICATION SERVER WHERE UPDATES ARE NOT ALLOWED

-427

DYNAMIC ROLLBACK NOT VALID AT AN APPLICATION SERVER WHERE UPDATES ARE NOT

ALLOWED

-440

THE NUMBER OF PARAMETERS IN THE PARAMETER LIST DOES NOT MATCH THE NUMBER OF

PARAMETERS EXPECTED FOR STORED PROCEDURE name, AUTHID authid, LUNAME luname. number

PARAMETERS WERE EXPECTED.

-444 USER PROGRAM name COULD NOT BE FOUND

-450

STORED PROCEDURE name, PARAMETER NUMBER number, OVERLAYED STORAGE BEYOND ITS

DECLARED LENGTH

-469 SQL CALL STATEMENT MUST SPECIFY AN OUTPUT HOST VARIABLE FOR PARAMETER number.

-470

SQL CALL STATEMENT SPECIFIED A NULL VALUE FOR INPUT PARAMETER number, BUT THE STORED

PROCEDURE DOES NOT SUPPORT NULL VALUES

-471 SQL CALL FOR STORED PROCEDURE name FAILED DUE TO REASON rc

-500 THE IDENTIFIED CURSOR WAS CLOSED WHEN THE CONNECTION WAS DESTROYED

-501 THE CURSOR IDENTIFIED IN A FETCH OR CLOSE STATEMENT IS NOT OPEN

-502 THE CURSOR IDENTIFIED IN AN OPEN STATEMENT IS ALREADY OPEN

-503

A COLUMN CANNOT BE UPDATED BECAUSE IT IS NOT IDENTIFIED IN THE UPDATE CLAUSE OF THE

SELECT STATEMENT OF THE CURSOR

-504 THE CURSOR NAME cursor-name IS NOT DEFINED

-507 THE CURSOR IDENTIFIED IN THE UPDATE OR DELETE STATEMENT IS NOT OPEN

-508 THE CURSOR IDENTIFIED IN THE UPDATE OR DELETE STATEMENT IS NOT POSITIONED ON A ROW

-509

THE TABLE IDENTIFIED IN THE UPDATE OR DELETE STATEMENT IS NOT THE SAME TABLE

DESIGNATED BY THE CURSOR

-510

THE TABLE DESIGNATED BY THE CURSOR OF THE UPDATE OR DELETE STATEMENT CANNOT BE

MODIFIED

-511

THE FOR UPDATE CLAUSE CANNOT BE SPECIFIED BECAUSE THE TABLE DESIGNATED BY THE

CURSOR CANNOT BE MODIFIED

-512 STATEMENT REFERENCE TO REMOTE OBJECT IS INVALID

-513 THE ALIAS alias-name MUST NOT BE DEFINED ON ANOTHER LOCAL OR REMOTE ALIAS

-514 THE CURSOR cursor-name IS NOT IN A PREPARED STATE

-516 THE DESCRIBE STATEMENT DOES NOT IDENTIFY A PREPARED STATEMENT

-517

CURSOR cursor-name CANNOT BE USED BECAUSE ITS STATEMENT NAME DOES NOT IDENTIFY A

PREPARED SELECT STATEMENT

-518 THE EXECUTE STATEMENT DOES NOT IDENTIFY A VALID PREPARED STATEMENT

-519

THE PREPARE STATEMENT IDENTIFIES THE SELECT STATEMENT OF THE OPENED CURSOR cursor-

name

-525

THE SQL STATEMENT CANNOT BE EXECUTED BECAUSE IT WAS IN ERROR AT BIND TIME FOR

SECTION = sectno PACKAGE = pkgname CONSISTENCY TOKEN = X'contoken'

-530 THE INSERT OR UPDATE VALUE OF FOREIGN KEY constraint-name IS INVALID

-531

THE PRIMARY KEY IN A PARENT ROW CANNOT BE UPDATED BECAUSE IT HAS ONE OR MORE

DEPENDENT ROWS IN RELATIONSHIP constraint-name

-532 THE RELATIONSHIP constraint-name RESTRICTS THE DELETION OF ROW WITH RID X'rid-number'

-533 INVALID MULTIPLE-ROW INSERT

-534 THE PRIMARY KEY CANNOT BE UPDATED BECAUSE OF MULTIPLE-ROW UPDATE

-536

THE DELETE STATEMENT IS INVALID BECAUSE TABLE table-name CAN BE AFFECTED BY THE

OPERATION

-537

THE PRIMARY KEY CLAUSE, A FOREIGN KEY CLAUSE, OR A UNIQUE CLAUSE IDENTIFIES COLUMN

column-name MORE THAN ONCE

Page 305: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 10

www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218

9

-538

FOREIGN KEY name DOES NOT CONFORM TO THE DESCRIPTION OF THE PRIMARY KEY OF TABLE

table-name

-539 TABLE table-name DOES NOT HAVE A PRIMARY KEY

-540

THE DEFINITION OF TABLE table-name IS INCOMPLETE BECAUSE IT LACKS A PRIMARY INDEX OR A

REQUIRED UNIQUE INDEX

-542

column-name CANNOT BE A COLUMN OF A PRIMARY KEY OR A UNIQUE CONSTRAINT BECAUSE IT

CAN CONTAIN NULL VALUES

-543

A ROW IN A PARENT TABLE CANNOT BE DELETED BECAUSE THE CHECK CONSTRAINT check-

constraint RESTRICTS THE DELETION

-544

THE CHECK CONSTRAINT SPECIFIED IN THE ALTER TABLE STATEMENT CANNOT BE ADDED

BECAUSE AN EXISTING ROW VIOLATES THE CHECK CONSTRAINT

-545

THE REQUESTED OPERATION IS NOT ALLOWED BECAUSE A ROW DOES NOT SATISFY THE CHECK

CONSTRAINT check-constraint

-546 THE CHECK CONSTRAINT constraint-name IS INVALID

-548 A CHECK CONSTRAINT THAT IS DEFINED WITH column-name IS INVALID

-549

THE statement STATEMENT IS NOT ALLOWED FOR object_type1 object_name BECAUSE THE BIND OPTION

DYNAMICRULES(BIND) IN THE object_type2 IS IN EFFECT

-551 auth-id DOES NOT HAVE THE PRIVILEGE TO PERFORM OPERATION operation ON OBJECT object-name

-552 auth-id DOES NOT HAVE THE PRIVILEGE TO PERFORM OPERATION operation

-553 auth-id SPECIFIED IS NOT ONE OF THE VALID AUTHORIZATION IDS

-554 AN AUTHORIZATION ID CANNOT GRANT A PRIVILEGE TO ITSELF

-555 AN AUTHORIZATION ID CANNOT REVOKE A PRIVILEGE FROM ITSELF

-556

authid2 CANNOT HAVE THE privilege PRIVILEGE on_object REVOKED BY authid1 BECAUSE THE

REVOKEE DOES NOT POSSESS THE PRIVILEGE OR THE REVOKER DID NOT MAKE THE GRANT

-557 INCONSISTENT GRANT/REVOKE KEYWORD keyword. PERMITTED KEYWORDS ARE keyword-list

-558 INVALID CLAUSE OR COMBINATION OF CLAUSES ON A GRANT OR REVOKE

-559 ALL AUTHORIZATION FUNCTIONS HAVE BEEN DISABLED

-567

bind-type AUTHORIZATION ERROR USING auth-id AUTHORITY PACKAGE = package-name PRIVILEGE =

privilege

-571 THE STATEMENT WOULD RESULT IN A MULTIPLE SITE UPDATE

-574 THE SPECIFIED DEFAULT VALUE CONFLICTS WITH THE COLUMN DEFINITION.

-601

THE NAME OF THE OBJECT TO BE CREATED IS IDENTICAL TO THE EXISTING NAME name OF THE

OBJECT TYPE obj-type

-602 TOO MANY COLUMNS SPECIFIED IN A CREATE INDEX

-603

A UNIQUE INDEX CANNOT BE CREATED BECAUSE THE TABLE CONTAINS ROWS WHICH ARE

DUPLICATES WITH RESPECT TO THE VALUES OF THE IDENTIFIED COLUMNS

-604 A COLUMN DEFINITION SPECIFIES AN INVALID LENGTH, PRECISION, OR SCALE ATTRIBUTE

-607 OPERATION OR OPTION operation IS NOT DEFINED FOR THIS OBJECT

-611

ONLY LOCKMAX 0 CAN BE SPECIFIED WHEN THE LOCK SIZE OF THE TABLESPACE IS TABLESPACE

OR TABLE

-612 column-name IS A DUPLICATE COLUMN NAME

-613 THE PRIMARY KEY OR A UNIQUE CONSTRAINT IS TOO LONG OR HAS TOO MANY COLUMNS

-614

THE INDEX CANNOT BE CREATED BECAUSE THE SUM OF THE INTERNAL LENGTHS OF THE

IDENTIFIED COLUMNS IS GREATER THAN THE ALLOWABLE MAXIMUM

-615 operation-type IS NOT ALLOWED ON A PACKAGE IN USE

-616 obj-type1 obj-name1 CANNOT BE DROPPED BECAUSE IT IS REFERENCED BY obj-type2 obj-name2

-617 A TYPE 1 INDEX CANNOT BE DEFINED ON A TABLE IN A TABLE SPACE WITH LOCKSIZE ROW

-618 OPERATION operation IS NOT ALLOWED ON SYSTEM DATABASES

Page 306: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 10

www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218

10

-619 OPERATION DISALLOWED BECAUSE THE WORK FILE DATABASE IS NOT STOPPED

-620

KEYWORD keyword IN stmt type STATEMENT IS NOT PERMITTED FOR A TABLE SPACE IN THE WORK

FILE DATABASE

-621 DUPLICATE DBID dbid WAS DETECTED AND PREVIOUSLY ASSIGNED TO database-name

-622 FOR MIXED DATA IS INVALID BECAUSE THE MIXED DATA INSTALL OPTION IS NO

-623 A CLUSTERING INDEX ALREADY EXISTS ON TABLE table-name

-624 TABLE table-name ALREADY HAS A PRIMARY KEY

-625 TABLE table-name DOES NOT HAVE AN INDEX TO ENFORCE THE UNIQUENESS OF THE PRIMARY KEY

-626 THE ALTER STATEMENT IS NOT EXECUTABLE BECAUSE THE PAGE SET IS NOT STOPPED

-627 THE ALTER STATEMENT IS INVALID BECAUSE THE PAGESET HAS USER-MANAGED DATA SETS

-628 THE CLAUSES ARE MUTUALLY EXCLUSIVE.

-629 SET NULL CANNOT BE SPECIFIED BECAUSE FOREIGN KEY name CANNOT CONTAIN NULL VALUES

-630 THE WHERE NOT NULL SPECIFICATION IS INVALID FOR TYPE 1 INDEXES

-631 FOREIGN KEY name IS TOO LONG OR HAS TOO MANY COLUMNS

-632

THE TABLE CANNOT BE DEFINED AS A DEPENDENT OF table-name BECAUSE OF DELETE RULE

RESTRICTIONS

-633 THE DELETE RULE MUST BE delete-rule

-634 THE DELETE RULE MUST NOT BE CASCADE

-635 THE DELETE RULES CANNOT BE DIFFERENT OR CANNOT BE SET NULL

-636 THE PARTITIONING KEYS ARE NOT SPECIFIED IN ASCENDING OR DESCENDING ORDER

-637 DUPLICATE keyword KEYWORD

-638 TABLE table-name CANNOT BE CREATED BECAUSE COLUMN DEFINITION IS MISSING

-639

A NULLABLE COLUMN OF A FOREIGN KEY WITH A DELETE RULE OF SET NULL CANNOT BE A

COLUMN OF THE KEY OF A PARTITIONED INDEX

-640 LOCKSIZE ROW CANNOT BE SPECIFIED BECAUSE TABLE IN THIS TABLESPACE HAS TYPE 1 INDEX

-642 TOO MANY COLUMNS IN UNIQUE CONSTRAINTS

-643 CHECK CONSTRAINT EXCEEDS MAXIMUM ALLOWABLE LENGTH

-644 INVALID VALUE SPECIFIED FOR KEYWORD keyword IN stmt-type TATEMENT

-646

TABLE table-name CANNOT BE CREATED IN PARTITIONED/DEFAULT TABLE SPACE tspace-name

BECAUSE IT ALREADY CONTAINS A TABLE

-647 BUFFERPOOL bp-name CANNOT BE SPECIFIED BECAUSE IT HAS NOT BEEN ACTIVATED

-650 THE ALTER INDEX CANNOT BE EXECUTED, REASON reason

-651 TABLE DESCRIPTION EXCEEDS MAXIMUM SIZE OF OBJECT DESCRIPTOR.

-652 VIOLATION OF INSTALLATION DEFINED EDIT OR VALIDATION PROCEDURE proc-name

-653

TABLE table-name IN PARTITIONED TABLE SPACE tspace-name IS NOT AVAILABLE BECAUSE ITS

PARTITIONED INDEX HAS NOT BEEN CREATED

-655

THE CREATE OR ALTER STOGROUP IS INVALID BECAUSE THE STORAGE GROUP WOULD HAVE BOTH

SPECIFIC AND NON-SPECIFIC VOLUME IDS

-660

INDEX index-name CANNOT BE CREATED ON PARTITIONED TABLE SPACE tspace-name BECAUSE KEY

LIMITS ARE NOT SPECIFIED

-661

INDEX index-name CANNOT BE CREATED ON PARTITIONED TABLE SPACE tspace-name BECAUSE THE

NUMBER OF PART SPECIFICATIONS IS NOT EQUAL TO THE NUMBER OF PARTITIONS OF THE TABLE

SPACE

-662 A PARTITIONED INDEX CANNOT BE CREATED ON A NON-PARTITIONED TABLE SPACE tspace-name

-663

THE NUMBER OF KEY LIMIT VALUES IS EITHER ZERO, OR GREATER THAN THE NUMBER OF

COLUMNS IN THE KEY OF INDEX index-name

Page 307: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 10

www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218

11

-665 THE PART CLAUSE OF AN ALTER STATEMENT IS OMITTED OR INVALID

-666 stmt-verb object CANNOT BE EXECUTED BECAUSE function IS IN PROGRESS

-667 THE CLUSTERING INDEX FOR A PARTITIONED TABLE SPACE CANNOT BE EXPLICITLY DROPPED

-668 THE COLUMN CANNOT BE ADDED TO THE TABLE BECAUSE THE TABLE HAS AN EDIT PROCEDURE

-669 A TABLE IN A PARTITIONED TABLE SPACE CANNOT BE EXPLICITLY DROPPED

-670 THE RECORD LENGTH OF THE TABLE EXCEEDS THE PAGE SIZE LIMIT

-671

THE BUFFERPOOL ATTRIBUTE OF THE TABLE SPACE CANNOT BE ALTERED AS SPECIFIED BECAUSE

IT WOULD CHANGE THE PAGE SIZE OF THE TABLE SPACE

-672 OPERATION DROP NOT ALLOWED ON TABLE table_name

-676 A 32K PAGE BUFFERPOOL MAY NOT BE USED FOR AN INDEX

-677 INSUFFICIENT VIRTUAL STORAGE FOR BUFFERPOOL EXPANSION

-678

THE LITERAL literal SPECIFIED FOR THE INDEX LIMIT KEY MUST CONFORM TO THE DATA TYPE data-

type OF THE CORRESPONDING COLUMN column-name

-679 THE OBJECT name CANNOT BE CREATED BECAUSE A DROP IS PENDING ON THE OBJECT

-680 TOO MANY COLUMNS SPECIFIED FOR A TABLE

-681

COLUMN column-name IN VIOLATION OF INSTALLATION DEFINED FIELD PROCEDURE. RT: return-code,

RS: reason-code, MSG: message-token

-682 FIELD PROCEDURE procedure-name COULD NOT BE LOADED

-683

INVALID COLUMN TYPE FOR FIELDPROC, BIT DATA, SBCS DATA, OR MIXED DATA OPTION, column-

name

-684 THE LENGTH OF LITERAL LIST BEGINNING string IS TOO LONG

-685 INVALID FIELD TYPE, column-name

-686

COLUMN DEFINED WITH A FIELD PROCEDURE CAN NOT COMPARE WITH ANOTHER COLUMN WITH

DIFFERENT FIELD PROCEDURE

-687 FIELD TYPES INCOMPARABLE

-688 INCORRECT DATA RETURNED FROM FIELD PROCEDURE, column-name, msgno

-689 TOO MANY COLUMNS DEFINED FOR A DEPENDENT TABLE

-690 THE STATEMENT IS REJECTED BY DATA DEFINITION CONTROL SUPPORT. REASON reason-code

-691 THE REQUIRED REGISTRATION TABLE table-name DOES NOT EXIST

-692

THE REQUIRED UNIQUE INDEX index-name FOR DDL REGISTRATION TABLE table-name DOES NOT

EXIST

-693

THE COLUMN column-name IN DDL REGISTRATION TABLE OR INDEX table-name (index-name) IS NOT

DEFINED PROPERLY

-694

THE DDL STATEMENT CANNOT BE EXECUTED BECAUSE A DROP IS PENDING ON THE DDL

REGISTRATION TABLE table-name

-713 THE REPLACEMENT VALUE FOR special-register IS INVALID

-715

PROGRAM program-name WITH MARK release-dependency-mark FAILED BECAUSE IT DEPENDS ON

FUNCTIONS OF THE RELEASE FROM WHICH FALLBACK HAS OCCURRED

-716 PROGRAM program-name PRECOMPILED WITH INCORRECT LEVEL FOR THIS RELEASE.

-717

bind-type FOR object-type object-name WITH MARK release-dependency-mark FAILED BECAUSE object-type

DEPENDS ON FUNCTIONS OF THE RELEASE FROM WHICH FALLBACK HAS OCCURRED.

-718 REBIND FOR PACKAGE package-name FAILED BECAUSE IBMREQD OF ibmreqd IS INVALID

-719 BIND ADD ERROR USING auth-id AUTHORITY PACKAGE package-name ALREADY EXISTS

-720

BIND ERROR, ATTEMPTING TO REPLACE PACKAGE = package_name WITH VERSION = version2 BUT

THIS VERSION ALREADY EXISTS

-721

BIND ERROR FOR PACKAGE = pkg-id CONTOKEN = 'contoken'X IS NOT UNIQUE SO IT CANNOT BE

CREATED

Page 308: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 10

www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218

12

-722 bind-type ERROR USING auth-id AUTHORITY PACKAGE package-name DOES NOT EXIST

-726

BIND ERROR ATTEMPTING TO REPLACE PACKAGE = . THERE ARE ENABLE OR DISABLE ENTRIES

CURRENTLY ASSOCIATED WITH THE PACKAGE

-730

THE PARENT OF A TABLE IN A READ-ONLY SHARED DATABASE MUST ALSO BE A TABLE IN A READ-

ONLY SHARED DATABASE

-731 USER-DEFINED DATASET dsname MUST BE DEFINED WITH SHAREOPTIONS(1,3)

-732

THE DATABASE IS DEFINED ON THIS SUBSYSTEM WITH THE ROSHARE READ ATTRIBUTE BUT THE

TABLE SPACE OR INDEX SPACE HAS NOT BEEN DEFINED ON THE OWNING SUBSYSTEM

-733

THE DESCRIPTION OF A TABLE SPACE, INDEX SPACE, OR TABLE IN A ROSHARE READ DATABASE

MUST BE CONSISTENT WITH ITS DESCRIPTION IN THE OWNER SYSTEM

-734 THE ROSHARE ATTRIBUTE OF A DATABASE CANNOT BE ALTERED FROM ROSHARE READ

-735 DATABASE dbid CANNOT BE ACCESSED BECAUSE IT IS NO LONGER A SHARED DATABASE

-736 INVALID OBID obid SPECIFIED

-737 IMPLICIT TABLE SPACE NOT ALLOWED

-741 A WORK FILE DATABASE IS ALREADY DEFINED FOR MEMBER member-name

-742 DSNDB07 IS THE IMPLICIT WORK FILE DATABASE

-751

A STORED PROCEDURE HAS BEEN PLACED IN MUST_ROLLBACK STATE DUE TO SQL OPERATION

name

-752

THE CONNECT STATEMENT IS INVALID BECAUSE THE PROCESS IS NOT IN THE CONNECTABLE

STATE

-802

EXCEPTION ERROR 'exception-type' HAS OCCURRED DURING 'operation-type' OPERATION ON 'data-type'

DATA, POSITION 'position-number'

-803

AN INSERTED OR UPDATED VALUE IS INVALID BECAUSE THE INDEX IN INDEX SPACE indexspace-

name CONSTRAINS COLUMNS OF THE TABLE SO NO TWO ROWS CAN CONTAIN DUPLICATE VALUES

IN THOSE COLUMNS. RID OF EXISTING ROW IS X'rid'

-804

AN ERROR WAS FOUND IN THE APPLICATION PROGRAM INPUT PARAMETERS FOR THE SQL

STATEMENT. REASON reason

-805

DBRM or PACKAGE NAME location-name.collection-id.dbrm-name.consistency -token NOT FOUND IN PLAN

plan-name. REASON reason

-807

ACCESS DENIED: PACKAGE package-name IS NOT ENABLED FOR ACCESS FROM connection-type

connection-name

-808 THE CONNECT STATEMENT IS NOT CONSISTENT WITH THE FIRST CONNECT STATEMENT

-811

THE RESULT OF AN EMBEDDED SELECT STATEMENT IS A TABLE OF MORE THAN ONE ROW, OR THE

RESULT OF THE SUBQUERY OF A BASIC PREDICATE IS MORE THAN ONE VALUE

-812

THE SQL STATEMENT CANNOT BE PROCESSED BECAUSE A BLANK COLLECTION-ID WAS FOUND IN

THE CURRENT PACKAGESET SPECIAL REGISTER WHILE TRYING TO FORM A QUALIFIED PACKAGE

NAME FOR PROGRAM program-name.consistency-token USING PLAN plan-name

-815

A GROUP BY OR HAVING CLAUSE IS IMPLICITLY OR EXPLICITLY SPECIFIED IN AN EMBEDDED

SELECT STATEMENT OR A SUBQUERY OF A BASIC PREDICATE

-817

THE SQL STATEMENT CANNOT BE EXECUTED BECAUSE THE STATEMENT WILL RESULT IN A

PROHIBITED UPDATE OPERATION

-818

THE PRECOMPILER-GENERATED TIMESTAMP x IN THE LOAD MODULE IS DIFFERENT FROM THE

BIND TIMESTAMP y BUILT FROM THE DBRM z

-819

THE VIEW CANNOT BE PROCESSED BECAUSE THE LENGTH OF ITS PARSE TREE IN THE CATALOG IS

ZERO

-820

THE SQL STATEMENT CANNOT BE PROCESSED BECAUSE catalog-table CONTAINS A VALUE THAT IS

NOT VALID IN THIS RELEASE

-822 THE SQLDA CONTAINS AN INVALID DATA ADDRESS OR INDICATOR VARIABLE ADDRESS

-840 TOO MANY ITEMS RETURNED IN A SELECT OR INSERT LIST

-842 A CONNECTION TO location-name ALREADY EXISTS

-843 THE SET CONNECTION OR RELEASE STATEMENT MUST SPECIFY AN EXISTING CONNECTION

-870

THE NUMBER OF HOST VARIABLES IN THE STATEMENT IS NOT EQUAL TO THE NUMBER OF

DESCRIPTORS

Page 309: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 10

www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218

13

-900

THE SQL STATEMENT CANNOT BE EXECUTED BECAUSE THE APPLICATION PROCESS IS NOT

CONNECTED TO AN APPLICATION SERVER

-901

UNSUCCESSFUL EXECUTION CAUSED BY A SYSTEM ERROR THAT DOES NOT PRECLUDE THE

SUCCESSFUL EXECUTION OF SUBSEQUENT SQL STATEMENTS

-902 POINTER TO THE ESSENTIAL CONTROL BLOCK (CT/RDA) HAS VALUE 0, REBIND REQUIRED

-904

UNSUCCESSFUL EXECUTION CAUSED BY AN UNAVAILABLE RESOURCE. REASON reason-code, TYPE

OF RESOURCE resource-type, AND RESOURCE NAME resource-name

-905

UNSUCCESSFUL EXECUTION DUE TO RESOURCE LIMIT BEING EXCEEDED, RESOURCE NAME =

resource-name LIMIT = limit-amount1 CPU SECONDS (limit-amount2 SERVICE UNITS) DERIVED FROM limit-

source

-906

THE SQL STATEMENT CANNOT BE EXECUTED BECAUSE THIS FUNCTION IS DISABLED DUE TO A

PRIOR ERROR

-908

bind-type ERROR USING auth-id AUTHORITY BIND, REBIND OR AUTO-REBIND OPERATION IS NOT

ALLOWED

-909 THE OBJECT HAS BEEN DELETED

-910 THE SQL STATEMENT CANNOT ACCESS AN OBJECT ON WHICH A DROP OR ALTER IS PENDING

-911

THE CURRENT UNIT OF WORK HAS BEEN ROLLED BACK DUE TO DEADLOCK OR TIMEOUT. REASON

reason-code, TYPE OF RESOURCE resource-type, AND RESOURCE NAME resource-name

-913

UNSUCCESSFUL EXECUTION CAUSED BY DEADLOCK OR TIMEOUT. REASON CODE reason-code, TYPE

OF RESOURCE resource-type, AND RESOURCE NAME resource-name

-917 BIND PACKAGE FAILED

-918 THE SQL STATEMENT CANNOT BE EXECUTED BECAUSE A CONNECTION HAS BEEN LOST

-919 A ROLLBACK OPERATION IS REQUIRED

-922 AUTHORIZATION FAILURE: error-type ERROR. REASON reason-code

-923

CONNECTION NOT ESTABLISHED: DB2 condition REASON reason-code, TYPE resource-type, NAME resource-

name

-924 DB2 CONNECTION INTERNAL ERROR, function-code, return-code, reason-code

-925 COMMIT NOT VALID IN IMS/VS OR CICS ENVIRONMENT

-926 ROLLBACK NOT VALID IN IMS/VS OR CICS ENVIRONMENT

-927

THE LANGUAGE INTERFACE (LI) WAS CALLED WHEN THE CONNECTING ENVIRONMENT WAS NOT

ESTABLISHED. THE PROGRAM SHOULD BE INVOKED UNDER THE DSN COMMAND

-929 FAILURE IN A DATA CAPTURE EXIT: token

-939 ROLLBACK REQUIRED DUE TO UNREQUESTED ROLLBACK OF A REMOTE SERVER

-947

THE SQL STATEMENT FAILED BECAUSE IT WILL CHANGE A TABLE DEFINED WITH DATA CAPTURE

CHANGES, BUT THE DATA CANNOT BE PROPAGATED

-948 DISTRIBUTED OPERATION IS INVALID

-950

THE LOCATION NAME SPECIFIED IN THE CONNECT STATEMENT IS INVALID OR NOT LISTED IN THE

COMMUNICATIONS DATABASE

-965 STORED PROCEDURE procname TERMINATED ABNORMALLY

-2001

THE NUMBER OF HOST VARIABLE PARAMETERS FOR A STORED PROCEDURE IS NOT EQUAL TO THE

NUMBER OF EXPECTED HOST VARIABLE PARAMETERS. ACTUAL NUMBER sqldanum, EXPECTED

NUMBER opnum

-30000

EXECUTION FAILED DUE TO A DISTRIBUTION PROTOCOL ERROR THAT WILL NOT AFFECT THE

SUCCESSFUL EXECUTION OF SUBSEQUENT COMMANDS OR SQL STATEMENTS: REASON reason-code

(sub-code)

-30020

EXECUTION FAILED DUE TO A DISTRIBUTION PROTOCOL ERROR THAT CAUSED DEALLOCATION OF

THE CONVERSATION: REASON <reason-code (sub-code)>

Page 310: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 10

www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218

14

-30021

EXECUTION FAILED DUE TO A DISTRIBUTION PROTOCOL ERROR THAT WILL AFFECT THE

SUCCESSFUL EXECUTION OF SUBSEQUENT COMMANDS OR SQL STATEMENTS: MANAGER manager

AT LEVEL level NOT SUPPORTED ERROR

-30030

COMMIT REQUEST WAS UNSUCCESSFUL, A DISTRIBUTION PROTOCOL VIOLATION HAS BEEN

DETECTED, THE CONVERSATION HAS BEEN DEALLOCATED. ORIGINAL SQLCODE=original-sqlcode

AND ORIGINAL SQLSTATE=original-sqlstate

-30040

EXECUTION FAILED DUE TO UNAVAILABLE RESOURCES THAT WILL NOT AFFECT THE SUCCESSFUL

EXECUTION OF SUBSEQUENT COMMANDS OR SQL STATEMENTS. REASON <reason-code> TYPE OF

RESOURCE <resource-type> RESOURCE NAME <resource-name> PRODUCT ID <pppvvrrm> RDBNAME

<rdbname>

-30041

EXECUTION FAILED DUE TO UNAVAILABLE RESOURCES THAT WILL AFFECT THE SUCCESSFUL

EXECUTION OF SUBSEQUENT COMMANDS AND SQL STATEMENTS REASON <reason-code> TYPE OF

RESOURCE <resource-type> RESOURCE NAME <resource-name> PRODUCT ID <pppvvrrm> RDBNAME

<rdbname>

-30050

<command-or-SQL-statement-type> COMMAND OR SQL STATEMENT INVALID WHILE BIND PROCESS IN

PROGRESS

-30051 BIND PROCESS WITH SPECIFIED PACKAGE NAME AND CONSISTENCY TOKEN NOT ACTIVE

-30052 PROGRAM PREPARATION ASSUMPTIONS ARE INCORRECT

-30053 OWNER AUTHORIZATION FAILURE

-30060 RDB AUTHORIZATION FAILURE

-30061 RDB NOT FOUND

-30070 <command> COMMAND NOT SUPPORTED ERROR

-30071 <object-type> OBJECT NOT SUPPORTED ERROR

-30072 <parameter>:<subcode> PARAMETER NOT SUPPORTED ERROR

-30073 <parameter>:<subcode> PARAMETER VALUE NOT SUPPORTED ERROR

-30074 REPLY MESSAGE WITH codepoint (svrcod) NOT SUPPORTED ERROR

-30080 COMMUNICATION ERROR code (subcode)

-30090 REMOTE OPERATION INVALID FOR APPLICATION EXECUTION ENVIRONMENT

Page 311: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 10

www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218

15

Os ABENDs com a letra S são do sistema e os com a letra U são de usuários.

Os mais comuns estão em destaque.

S001-4 Wrong length record; Input file record length is not equal to the length stated in the DD or the FD.

IO error, damaged tape, device malfunction; With disk, reading a dataset that was allocated but never written to.

Writing to input file; Concatenation of files with different record lengths or record formats.

S001-5 Reading after the end of the file by non-COBOL program. COBOL intercepts this and displays "QSAM error,

status 92". Out of space on output disk file.

S002 With variable format files used for output.

The record is larger than the track size.

The record length is greater than allowed maximum 32,768.

The wrong record length is being used on output.

The 4-byte record length indicator is wrong.

Record greater than 32,768 bytes

S013-10 A dummy file with no blocksize.

S013-14 A library has run out of space in its directory. You have to backup, delete, and restore the library with

IEBCOPY. A dataset is sequential, but the JCL indicates that it is a library.

S013-18 A library member was specified in the JCL but was not found.

S013-20 The block size is not a multiple of record length.

Check record length in program, compare to actual record length of file

S013-34 The block size was found to be 0. A new file is being created but block size was not in the JCL.

S013-40 Reading a file whose JCL has SYSOUT=

S106 The program on the program library was unreadable. Recompile and link.

S122 The job was canceled because it violated some restriction. A dump was requested

S137 A tape has a bad trailer label. Copy the file with IEBGENER, ignoring the error. The copy will be good.

Using LABEL=2 when there's only one dataset on the tape.

S213 A disk dataset was not actually on the volume stated in the VOL=SER=.

A disk dataset was not actually on the volume indicated in the catalog.

S222 The job was cancelled because it violated some restriction. No dump was requested.

S237 The block count on a tape trailer label is wrong. Probably caused by hardware error. Copy the file with

IEBGENER, ignoring the error. The copy will be good. A problem with the second volume of tape or disk.

S313, 314 An Input/output error in the VTOC of a disk volume. Inform support staff.

S322 The job used more CPU time than it should have. Either the estimate is wrong or the program is in an

uncontrollable loop.

S413 A volume was needed that could not be mounted.

S422 Too many job steps.

S513 Two jobs or DDNAMES wanting same tape at same time.

S522 Job was waiting too long.

S613 A bad tape label.

S637 A bad concatenation, different types of devices were used. An unreadable tape mark or label.

S706 The program on the library was not executable. See linkage editor report that put the program on library.

S713 The tape was unexpired and the operator terminated the job.

S714 Labels on the tape were bad.

S722 Too many lines of print.

Teoria MVS abend code

Page 312: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 10

www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218

16

S804 Region too small for the program.

S806 Program not on the library. May need a JOBLIB or STEPLIB.

S80A Region too small for the program.

S813 Right tape volume, wrong dataset name.

Right dataset name, wrong tape volume.

S913 Security violation.

SA13 Label=n states the wrong number.

SB14 No space in a library directory for this member's name.

SB37 Insufficient disk space.

SD37 Insufficient disk space.

SE37 Insufficient disk space. An E37 on tape datasets is most often caused when the number of requested volumes is

exceeded. The default is 5, therefore a request for the sixth volume will fail with a E37.

S0C1 (Operation Exception)

Executing a program with an unresolved external reference.

Calling a program and the program was not included during link edit.

An uncontrolled loop moved data on top of instructions.

Reading a file that is not open

Your SORTIN DCB was not correct

Mixing compile options RES and NORES in different modules

S0C2 Privileged Operation. Read/write to unopened file. An uncontrolled loop moved data on top of instructions.

S0C4 Protection. An uncontrolled loop moved data on top of instructions. referencing a field in a record of a closed file

referencing an item in Linkage-Section when there was no PARM= in the JCL.

Calling/called programs have different length for items passed in Linkage Section

with COBOL Sort, doing a STOP RUN or GOBACK while an input or output procedure is still running

S0C5 Addressing. Same reasons as for 0C4. Falling through into an ENTRY statement

Transferring control into the middle of a SORT procedure.

S0C6 Specification. Bad boundary alignment for binary data. See reasons for 0C4

S0C7 Data Exception. Program attempting to do math on illegal data. Data is not numeric, but should be.

Moving ZEROS to group item whose subordinate items are packed-decimal. Uninitialized packed-decimal

fields. Record description is wrong. Field starts or ends in the wrong place in the record.

Find record description of creating program.

S0CB Attempting to divide by 0 and not using ON SIZE ERROR

U1002 Conflicting file attributes. See S013.

U1005 Executing with modules compiled both with RES and NORES

U1006 Subscript out of range

U1017 Missing DD statement in JCL for DISPLAY or ACCEPT verb

U1020 Problem opening or processing a file.

Check the file status.

U1026 COBOL sort failed.

U1034 Same as SB37

U1035 Conflicting DCB parameters. Same as S013.

U1037 Program control falls through the last physical statement in program, which is not GOBACK/STOP RUN.

U1056 Program didn’t close a file before ending

U1066,

U1075

Conflicting DCB information for file defined as EXTERNAL

U1072,

U1073,

U1074

Illegal numbers in reference modification

U3000 COBOL LE intercepted the ABEND. Messages in SYSDBOUT.

U4038 COBOL LE intercepted the ABEND. Messages in CEEDUMP.

Page 313: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 10

www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218

17

FILE STATUS SIGNIFICADO

'00' SUCCESSFUL COMPLETION

'02' DUPLICATE KEY, NON UNIQ. ALT INDX

'04' READ, WRONG LENGTH RECORD

'05' OPEN, FILE NOT PRESENT

'07' CLOSE OPTION INCOMPAT FILE DEVICE OPEN IMPLIES TAPE; TAPE NOT 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

'24' BOUNDARY VIOLATION. WRITE PAST END OF KSDS RECORD. COBOL 370: REL: REC#

TOO BIG. OUT OF SPACE ON KSDS/RRDS FILE

'30' PERMANENT DATA ERROR. DATA CHECK, PARITY CHK, HARDW

'34' BOUNDARY VIOLATION. WRITE PAST END OF ESDS RECORD OR NO SPACE TO ADD

KSDS/RRDS RECORD. OUT OF SPACE ON SEQUENTIAL FILE

'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

'92' LOGIC ERROR/OPENING AN OPEN FILE OR READING OUTPUT FILE OR WRITE INPUT

FILE OR DEL/REW BUT NO PRIOR READ

'93' VSAM - VIRTSTOR. RESOURCE NOT AVAILABLE

'94' VSAM - SEQUENTIAL READ AFTER END OF FILE OR NO CURRENT REC POINTER FOR

SEQ

'95' VSAM - INVALID FILE INFORMATION OR OPEN OUTPUT (LOAD) WITH FILE THAT NEVER

CONTAINED DATA

'96' VSAM - MISSING DD STATEMENT IN JCL

'97' VSAM - OPEN OK, FILE INTEGRITY VERIFIED FILE SHOULD BE OK

OTHER UNKNOWN REASON

Teoria Tabela de File status

Page 314: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 10

www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218

18

ASCII e a sigla para American Standard Code for Information Interchange. Os

computadores só podem entender números, então o código ASCII é a representação

numérica de caracteres tais como @ A X $, que é usado quando se deseja colocar

dados em ordem. É utilizada nos micro computadores.

Teoria Tabela ascII

Dec Hex Dec Hex Char Dec Hex Char Dec Hex Char

0 0 NUL (null) 64 40 @ 128 80 Ç 192 C0 └

1 1 ☺ SOH (start of heading) 65 41 A 129 81 ü 193 C1 ┴

2 2 ☻ STX (start of text) 66 42 B 130 82 é 194 C2 ┬

3 3 ♥ ETX (end of text) 67 43 C 131 83 â 195 C3 ├

4 4 ♦ EOT (end of transmission) 68 44 D 132 84 ä 196 C4 ─

5 5 ♣ ENQ (enquiry) 69 45 E 133 85 à 197 C5 ┼

6 6 ♠ ACK (acknowledge) 70 46 F 134 86 å 198 C6

7 7 • BEL (bell) 71 47 G 135 87 ç 199 C7

8 8 ◘ BS (backspace) 72 48 H 136 88 ê 200 C8 ╚

9 9 ○ TAB (horizontal tab) 73 49 I 137 89 ë 201 C9 ╔

10 A ◙ LF (line feed) 74 4A J 138 8A è 202 CA ╩

11 B ♂ VT (vertical Tab) 75 4B K 139 8B ï 203 CB ╦

12 C ♀ FF (form feed) 76 4C L 140 8C î 204 CC ╠

13 D ♪ CR (carriage return) 77 4D M 141 8D ì 205 CD ═

14 E ♫ SO (shift out) 78 4E N 142 8E Ä 206 CE ╬

15 F ☼ SI (shift in) 79 4F O 143 8F Å 207 CF

16 10 ► DLE (data link escape) 80 50 P 144 90 É 208 D0

17 11 ◄ DC1 (device control 1) 81 51 Q 145 91 æ 209 D1

18 12 ↕ DC2 (device control 2) 82 52 R 146 92 Æ 210 D2

19 13 ‼ DC3 (device control 3) 83 53 S 147 93 ô 211 D3

20 14 ¶ DC4 (device control 4) 84 54 T 148 94 ö 212 D4

21 15 § NAK (negative acknowledge) 85 55 U 149 95 ò 213 D5

22 16 ▬ SYN (synchronous idle) 86 56 V 150 96 û 214 D6

23 17 ↨ ETB (end of transmission block) 87 57 W 151 97 ù 215 D7

24 18 ↑ CAN (cancel) 88 58 X 152 98 ÿ 216 D8

25 19 ↓ EM (end of medium) 89 59 Y 153 99 Ö 217 D9 ┘

26 1A → SUB (substitute) 90 5A Z 154 9A Ü 218 DA ┌

27 1B ← ESC (escape) 91 5B [ 155 9B ø 219 DB █

28 1C ∟ FS (file separator) 92 5C \ 156 9C £ 220 DC ▄

29 1D ↔ GS (group separator) 93 5D ] 157 9D ¥ 221 DD

30 1E ▲ RS (record separator) 94 5E ^ 158 9E × 222 DE

31 1F ▼ US (unit separator) 95 5F _ 159 9F ƒ 223 DF ▀

32 20 Space 96 60 ` 160 A0 á 224 E0 a

33 21 ! 97 61 a 161 A1 í 225 E1 b

34 22 " 98 62 b 162 A2 ó 226 E2 G

35 23 # 99 63 c 163 A3 ú 227 E3 p

36 24 $ 100 64 d 164 A4 ñ 228 E4 S

37 25 % 101 65 e 165 A5 Ñ 229 E5 s

38 26 & 102 66 f 166 A6 ª 230 E6 µ

39 27 ' 103 67 g 167 A7 º 231 E7 t

40 28 ( 104 68 h 168 A8 ¿ 232 E8 f

41 29 ) 105 69 i 169 A9 ® 233 E9 q

42 2A * 106 6A j 170 AA ¬ 234 EA W

43 2B + 107 6B k 171 AB ½ 235 EB d

44 2C , 108 6C l 172 AC ¼ 236 EC

45 2D - 109 6D m 173 AD ¡ 237 ED

46 2E . 110 6E n 174 AE « 238 EE

47 2F / 111 6F o 175 AF » 239 EF

48 30 0 112 70 p 176 B0 ░ 240 F0

49 31 1 113 71 q 177 B1 ▒ 241 F1 ±

50 32 2 114 72 r 178 B2 ▓ 242 F2

51 33 3 115 73 s 179 B3 │ 243 F3

52 34 4 116 74 t 180 B4 ┤ 244 F4

53 35 5 117 75 u 181 B5 245 F5

54 36 6 118 76 v 182 B6 246 F6

55 37 7 119 77 w 183 B7 247 F7

56 38 8 120 78 x 184 B8 248 F8

57 39 9 121 79 y 185 B9 ╣ 249 F9

58 3A : 122 7A z 186 BA ║ 250 FA

59 3B ; 123 7B { 187 BB ╗ 251 FB

60 3C < 124 7C | 188 BC ╝ 252 FC h

61 3D = 125 7D } 189 BD 253 FD 2

62 3E > 126 7E ~ 190 BE 254 FE þ

63 3F ? 127 7F del 191 BF ┐ 255 FF

char

Page 315: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 10

www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218

19

EBCDIC e a sigla para Extended Binary Coded Decimal Interchange Code, desenvolvida para os Mainframes

no início dos anos de 1960 e são ainda usadas hoje em dia, principalmente nos Mainframes da IBM.

Dec Hex char Dec Hex Char Dec Hex Char Dec Hex Char

0 0 NUL (null) 64 40 SP (space) 128 80 192 C0 {

1 1 SOH (start of heading) 65 41 129 81 a 193 C1 A

2 2 STX (start of text) 66 42 130 82 b 194 C2 B

3 3 ETX (end of text) 67 43 131 83 c 195 C3 C

4 4 PF (punch off) 68 44 132 84 d 196 C4 D

5 5 HT (horizontal tab) 69 45 133 85 e 197 C5 E

6 6 LC (lower case) 70 46 134 86 f 198 C6 F

7 7 DEL (delete) 71 47 135 87 g 199 C7 G

8 8 GE 72 48 136 88 h 200 C8 H

9 9 RLF 73 49 137 89 i 201 C9 I

10 A SMM (start of manual message) 74 4A ¢ 138 8A 202 CA

11 B VT (vertical tab) 75 4B . 139 8B 203 CB

12 C FF (form feed) 76 4C < 140 8C 204 CC

13 D CR (carriage return) 77 4D ( 141 8D 205 CD

14 E SO (shift out) 78 4E + 142 8E 206 CE

15 F SI (shift in) 79 4F | 143 8F 207 CF

16 10 DLE (data link escape) 80 50 & 144 90 208 D0 }

17 11 DC1 (device control 1) 81 51 145 91 j 209 D1 J

18 12 DC2 (device control 2) 82 52 146 92 k 210 D2 K

19 13 TM (tape mark) 83 53 147 93 l 211 D3 L

20 14 RES (restore) 84 54 148 94 m 212 D4 M

21 15 NL (new line) 85 55 149 95 n 213 D5 N

22 16 BS (back space) 86 56 150 96 o 214 D6 O

23 17 IL (idle) 87 57 151 97 p 215 D7 P

24 18 CAN (cancel) 88 58 152 98 q 216 D8 Q

25 19 EM (end of medium) 89 59 153 99 r 217 D9 R

26 1A CC (cursor control) 90 5A ! 154 9A 218 DA

27 1B CU1 (customer use 1) 91 5B $ 155 9B 219 DB

28 1C IFS (interchange file separator) 92 5C * 156 9C 220 DC

29 1D IGS (interchange group separator) 93 5D ) 157 9D 221 DD

30 1E IRS (interchange record separator) 94 5E ; 158 9E 222 DE

31 1F IUS (interchange unit separator) 95 5F ¬ 159 9F ¤ 223 DF

32 20 DS (digit select) 96 60 - 160 A0 224 E0 \

33 21 SOS (start of significance) 97 61 / 161 A1 ~ 225 E1

34 22 FS (field separator) 98 62 162 A2 s 226 E2 S

35 23 99 63 163 A3 t 227 E3 T

36 24 BYP (bypass) 100 64 164 A4 u 228 E4 U

37 25 LF (line feed) 101 65 165 A5 v 229 E5 V

38 26 ETB (end of transmission block) 102 66 166 A6 w 230 E6 W

39 27 ESC (escape) 103 67 167 A7 x 231 E7 X

40 28 104 68 168 A8 y 232 E8 Y

41 29 105 69 169 A9 z 233 E9 Z

42 2A SM (set mode) 106 6A ¦ 170 AA 234 EA

43 2B CU2 (customer use 2) 107 6B , 171 AB 235 EB

44 2C 108 6C % 172 AC 236 EC

45 2D ENQ (enquiry) 109 6D _ 173 AD 237 ED

46 2E ACK (acknowledge) 110 6E > 174 AE 238 EE

47 2F BEL (bell) 111 6F ? 175 AF 239 EF

48 30 112 70 176 B0 240 F0 0

49 31 113 71 177 B1 241 F1 1

50 32 SYN (synchronous idle) 114 72 178 B2 242 F2 2

51 33 115 73 179 B3 243 F3 3

52 34 PN (punch on) 116 74 180 B4 244 F4 4

53 35 RS (reader stop) 117 75 181 B5 245 F5 5

54 36 UC (upper case) 118 76 182 B6 246 F6 6

55 37 EOT (end of transmission) 119 77 183 B7 247 F7 7

56 38 120 78 184 B8 248 F8 8

57 39 121 79 ` 185 B9 249 F9 9

58 3A 122 7A : 186 BA 250 FA

59 3B CU3 (customer use 3) 123 7B # 187 BB 251 FB

60 3C DC4 (device control 4) 124 7C @ 188 BC 252 FC

61 3D NAK (negative acknowledge) 125 7D ' 189 BD 253 FD

62 3E 126 7E = 190 BE 254 FE

63 3F SUB (substitute) 127 7F " 191 BF 255 FF

Teoria Tabela EBCDIC

Usados para

representar

números

negativos.

Usados para

representar

números

positivos.

LOW-VALUES

HIGH-VALUES

Usados para

representar

números sem

sinal.

Page 316: Grande Porte - COBOL Level 2 - Versão 2.2.3

Parte 10

www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218

20

Teoria POTÊNCIA DE 2

1 Byte

2 Bytes

3 Bytes

4 Bytes