Anda di halaman 1dari 316

COBOL Level 1

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


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
nelson@grandeporte.com.br 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.”

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

Fique atento para novas versões em nosso site.


Parte

Desenvolveu o modelo de banco de dados relacional, quando


era pesquisador no laboratório da IBM em San José

Edgar Frank Codd


 1923 – 2003
Versão 2.2.3a
Parte 1 3

1
Preparation

Trocando Ideias É agora que você fala !!

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?

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

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!

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


4 Parte 1

Presentation

História Uma nova fase !!

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.

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


Parte 1 5

ç
Defini ão de 1
Teoria modelagem de dados

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.

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


6 Parte 1

Teoria Modelo conceitual de dados

É 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.

Der – diagrama
Teoria Entidade - relacionamento

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


os seguintes símbolos:

Atributo

Atributo identificador

Entidade

Relacionamento

Linha de ligação

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


Parte 1 7

Exemplo de um DER:

1
1:N
1 N
Cliente Faz Pedido
1 1

Teoria CArdinalidade

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.

1:1
1 1
Cliente Exibe Fotografia
1 1

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


8 Parte 1
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.

N:1
1 1
Cliente Classifica Classificação
N 1

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.

N:N
1 N
Cliente Compra Produto
N 1

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


Parte 1 9

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

1
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.

Teoria Grau do relacionamento

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.

1
Peça
N
N 1

Forma

N:N

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


10 Parte 1
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).

N:N
1 N
Fornecedor Comercializa Material
N 1
1 N

Utiliza N:N

N 1

Projeto

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


Parte 1 11

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

1
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 1 N:N N 1

Utiliza
N:N N:N

1 N

Projeto

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


12 Parte 1

Atividade Trabalho em dupla

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.

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


Parte 1 13

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


14 Parte 1

Teoria Modelo lógico de dados

É 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.

Lógica?

É comigo
Mesmo!

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


Parte 1 15

Teoria
Mer – modelo
entidade - relacionamento
1
É a representação do modelo lógico de dados. Neste modelo utilizamos os
seguintes símbolos:

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 um
rabo de galo!

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


16 Parte 1
Exemplo de M.E.R. (Modelo Entidade Relacionamento)

tabcliente tabvenda tabitemvenda


codcli (PK) numvenda (PK) numitem(PK)
nomecli datavenda numvenda (FK)
enderecocli codcli (FK) qtdeitem
cpfcli codprod (FK)
telefonecli
tabproduto
codprod (PK)
descprod
precovenda
qtdeestoque

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

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


Parte 1 17

TABVENDA TABVENDA 1

TABITEMVENDA

TABPRODUTO
TABPRODUTO

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.

Simples
assim ?

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


18 Parte 1

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

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.

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


Parte 1 19

3. FK+FK

Outra forma de montar uma chave primária concatenada é unir numvenda com
o codprod, como mostra a tabela abaixo. 1
tabitemvenda
(numvenda (FK) + codprod(FK)) (PK) qtdeitem
0000100004 3
0000100002 2
0000100001 3
0000200001 5
0000300001 4
0000300004 1

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


20 Parte 1

Atividade Trabalho em dupla

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.

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


Parte 1 21

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


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

ENTREGADOR
PRODUTO
CLIENTE

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


Parte 1 23

1
PRECO

PEDIDO

ITEM

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


24 Parte 1

Teoria modelo físico de dados

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

Físico?

É comigo
Mesmo!

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


Parte 1 25

1
Practice

Atividade Trabalho em dupla

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.

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


26 Parte 1

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


Parte 1 27

Atividade Trabalho em dupla


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.

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


28 Parte 1

MER aí?
Vai um

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


Parte 1 29

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

1
correta.

VEICULO

CLIENTE

SERVICO

FUNCIONARIO

OS

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


30 Parte 1
FUNCOS

SERVOS

PRECO

TÁ MEIO
APERTADO!

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


Parte 1 31

1
Performance

Atividade Trabalho em dupla

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.

N:N N:1
1 N N 1
tabforpag Paga tabvenda Gera tabcliente
N 1 1 1
1 N 1 N

vende N:N
Vende N:N

N:N N1
N1
1 N
tabfornec Fornece tabproduto
N 1 tabservico

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


32 Parte 1

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


Parte 1 33

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

1
correta.

TABCLIENTE

TABSERVICO

TABPRODUTO

TABFORNEC

TABFORPAG

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


34 Parte 1
TABVENDA

TABPAGAMENTO

TABFORNECIMENTO

TABPRODVENDIDO

TABSERVVENDIDO

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


Parte 1 35

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


36 Parte 1

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

Estou fera!

Fiz Certo!

 Muito Bom  Bom  regular  ruim  Muito ruim

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


Parte

Matemático britânico, esteve envolvido com o trabalho de


Codd no desenvolvimento do modelo relacional. Seu livro
“Introdução a Sistemas de Banco de Dados” é amplamente
reconhecido como texto fundamental para a área.
Christopher J. Date
 1941 – (72)
Versão 2.2.3a
Parte 2 3

Preparation 2

Trocando Ideias É agora que você fala !!

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?

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

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!

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


4 Parte 2

Presentation

História Normas e mais normas

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.

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


Parte 2 5

Teoria Normaliza ão ç
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.

Disco IBM 350


Apresentado em 13/09/1956
Pilha de 40 discos de 24 polegadas
Capacidade 4,4 Megabytes Edgar Frank Codd
Aluguel de US$ 35.000,00  23/08/1923  18/04/2003

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.

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


6 Parte 2
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).

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

TUPLA ?

Você não
Neste exemplo, temos uma entidade com quis dizer
18 atributos, trata-se de uma Nota Fiscal (com SUPLA !
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ê...

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


Parte 2 7

2
Primeira forma
Teoria normal (1fn)

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

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.

C. J. Date
Norma
número um!
“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”

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


8 Parte 2

segunda forma
Teoria normal (2fn)

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 AB, 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.

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

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


Parte 2 9

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

2
chave estrangeirana entidade original. As novas entidades criadas são Cliente,
Transportadora e Produto. Após a aplicação da 2FN temos:

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

C. J. Date

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


número dois!
em 2FN, se e somente se, está
em 1FN e todo atributo não
chave é irredutivelmente
dependente da chave primária”

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


10 Parte 2

terceira forma
Teoria normal (3fn)

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:

Cliente E essa
CNPJ Cliente (PK) é a Norma
Razão Social Cliente número três!
Endereço Cliente
Telefone Cliente

Nota Fiscal Transportadora


Número NF (PK) CNPJ Transportadora (PK)
Data Emissão NF Razão Social Transportadora
CNPJ Cliente (FK) Endereço Transportadora
CNPJ Transportadora (FK) Telefone Transportadora

C. J. Date

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


Item Nota Fiscal Produto em 3FN, se e somente se, está
Número Item NF (PK) Codigo Produto (PK) em 2FN e todo atributo não
Número NF (FK) Descrição Produto chave é dependente de forma não
Codigo Produto (FK) Preço Unitário Produto transitiva da chave primária”
Qtd. Item NF Qtd. Estoque

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


Parte 2 11

Teoria O impacto da normaliza ão ç


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.

Economia
do espaco
, Ganho de
em disco
Performance

Normalizar

Desnormalizar

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


12 Parte 2

Practice

Atividade Trabalho em dupla

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.

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


Parte 2 13

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

2
do Projeto, Número de horas trabalhadas no projeto). Vale a pena notar que o
gerente é um empregado.

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


14 Parte 2

Atividade Revisão aos pares

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.

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


Parte 2 15

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

2
disciplina, pertencente ao curso, quer cursar.

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


16 Parte 2

Atividade Flip chart

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

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


Parte 2 17

Performance 2

Atividade Trabalho em dupla

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

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


18 Parte 2

Lembre-se
Das três
Normas

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


Parte 2 19

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


20 Parte 2

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

Estou fera!

Fiz Certo!

 Muito Bom  Bom  regular  ruim  Muito ruim

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


Parte

O nome DB2 foi dado para o Sistema de Gerenciamento


de Banco de Dados que a IBM lançou em 1983 baseado em
SQL/DS para seu mainframe. A principio o produto foi
chamado 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 dados
Relacionais e publicou sua teoria em Junho de 1970.
Versão 2.2.3a
Parte 3 3

Preparation
3
Trocando Ideias É agora que você fala !!

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?

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

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!

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


4 Parte 3

Presentation

História Mão na massa!!

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:

Consegue ver
o hífen do início?
-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.

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


Parte 3 5

Teoria ç
Introdu ão ao db2

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.
3
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.

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


6 Parte 3

Teoria Elementos do db2

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.

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


Parte 3 7

TABELAS

As TABELAS são estruturas lógicas mantidas pelo DB2 para representar uma
ENTIDADE. É formada por um conjunto de colunas. Exemplo:

3
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
CODIGO
NOME
Colunas 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.

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


8 Parte 3
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:

DATABASE X
VOLUME 1

TABLESPACE A TABLESPACE A
INDEXSPACE 1
VIEW A
TABELA1 INDEX 1
INDEX 1
VIEW B TABELA2 INDEX 2 INDEX 2
INDEXSPACE 2

VOLUME 2
STORAGE GROUP
TABLESPACE B TABLESPACE B

ÁLIAS
INDEXSPACE 3 VOLUME 3
TABELA3 INDEX 3
INDEX 3
SINÔNIMO
INDEX 4
INDEXSPACE 4 INDEX 4

Igualzinho
Lá em casa!

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


Parte 3 9

Teoria Tipos de chaves

É 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).
3
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.

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


10 Parte 3

Teoria Regras de Integridade

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.

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


Parte 3 11

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

3
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.

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


12 Parte 3

Teoria Tipos de dados

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)

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


Parte 3 13

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.

3
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:

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

Exemplo:

PESO REAL

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


14 Parte 3
 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:

-1,79769 x 10 308 -2,225 x 10-307 0 2,225 x 10 -307 1,79769 x 10308

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.

Vou criar meu


próprio
formato de
dado numérico.

Ops...

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


Parte 3 15

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
3
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

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


16 Parte 3

Teoria constantes

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

Teoria Special registers

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)

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


Parte 3 17

Practice
3
Atividade Revisão aos pares

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

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


18 Parte 3

Atividade Revisão aos pares

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.

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


Parte 3 19

Atividade ç
Ca a-palavras

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

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

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


20 Parte 3

Atividade Correndo contra o tempo

Nomeie as chaves como UNIQUE KEY, PRIMARY KEY,


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

5 minutos

funcionario departamento
codfunc coddepto
nomefunc nomedepto
cpffunc
coddepto

chamado
numchamado
datahorachamado
codfunc
textofunc

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


Parte 3 21

Performance
3
Atividade Todos juntos

Dado o MER abaixo, atribua o melhor formato e


tamanho aos diversos atributos.

cliente
cnpjcliente (PK)
razaosocialcliente
enderecocliente
telefonecliente

notafiscal transportadora
numeronf(PK) cnpjtransportadora(PK)
dataemissaonf razaosocialtransportadora
cnpjcliente(FK) enderecotransportadora
cnpjtransportadora(FK) telefonetransportadora

itemnotafiscal produto
numeroitemnf(PK) codigoproduto(PK)
numeronf(FK) descricaoproduto
codigoproduto(FK) precounitarioproduto
qtdeitemnf qtdeestoque

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


22 Parte 3

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

Estou fera!

Fiz Certo!

 Muito Bom  Bom  regular  ruim  Muito ruim

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


Parte

Don Chamberlin é melhor conhecido como o co-inventor da


linguagem SQL (Structured Query Language), a linguagem de
banco de dados mais utilizada no mundo. Desenvolvida em
meados de 1970 por Chamberlin e Raymond Boyce, a SQL foi a
primeira linguagem comercial de sucesso para banco de dados
relacionais.
Donald Don Chamberlim
 1944 - (68)
Versão 2.2.3
Parte 4 3

Preparation

Trocando Ideias É agora que você fala !! 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?

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

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!

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


4 Parte 4

Presentation

História Construindo a casa

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.

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


Parte 4 5

A Linguagem sql
Teoria (Structured query language)

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


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

4
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.

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


6 Parte 4

Teoria Ambientes para o uso do sql

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.

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


Parte 4 7

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.

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


8 Parte 4
Programas

Os comandos SQL podem ser codificados dentro de programas escritos em


várias linguagens, incluindo o COBOL. Exemplo:

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


Parte 4 9

Teoria Comandos sql

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

Sou DBA,
devo conhecer Sou programador,
SQL DDL e DCL devo conhecer
a fundo. SQL DML e DTL
a fundo.

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


10 Parte 4

Teoria SQL DDL

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

Owner/Creator/Schema Nome Simples da Tabela

GPXXNN TBPROD

Nome Qualificado da Tabela


(Completo)
GPXXNN.TBPROD

Nome da Tabela Nome da Coluna

TBPROD DESCPROD

Nome Qualificado da Coluna


(Completo)
TBPROD.DESCPROD

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


Parte 4 11

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
NOME
CHAR(6)
VARCHAR(20)
UNIQUE NOT NULL,
,
4
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
Espaço em Branco
VARCHAR
INTEGER
SMALLINT
DECIMAL Zero
REAL
DOUBLE
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.’

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


12 Parte 4
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!

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


Parte 4 13

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:

4
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.

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


14 Parte 4
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.

Índice Tabela

CODDEPTO CODDEPTO NOMEDEPTO

001 003 PRODUCAO


002 001 PINTURA
003 004 FUNILARIA
004 002 TAPECARIA

IDXDEPTO DEPTO

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.

Tabela Índice

NOMEEMP
CODDEPTO NOMEEMP
AMBROSIO TEIXEIRA
002 BARNABE ATANASIO BARNABE ATANASIO
001 CARLOS MOURA BARNABE ATANASIO
004 AMBROSIO TEIXEIRA CARLOS MOURA
003 BARNABE ATANASIO

EMPREGADO IDXNOME

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


Parte 4 15

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.

4
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.

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


16 Parte 4
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
cod_depto cod_gerente nome_depto centro_custo telefone

015 0141 Produção 127125 4455-1021


038 0525 Marketing 130220 4455-1025
052 0084 Vendas 130250 4455-1017
067 0092 SAC 130300 4455-1035

vdeptosel
cod_depto_sel nome_depto_sel
015 Produção
038 Marketing

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


Parte 4 17

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:

Database Tablespace Tabela


View
4
Índice
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 tab


co cli
no dcli ( ente
m
en ec PK)
cp dere li
tel fcli cocl
efo i
ne
cli
tab
nu ve
da mve nd
a
co tave nda
dc nd (P
li ( a K)
FK
)
tab ta
co pro nu bitem
de dpro du
to nu mite ve
nd
m
qtd ve m(P
pre scpr d (P n K
a
c
qtd ov d o K ) e
co ite a ) d
ee end dp m (FK
sto a rod )
qu (FK
e )

Olá Tabelas,

procuro a tabcliente

Alguém a viu?

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


18 Parte 4

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’

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


Parte 4 19

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 *

4
FROM SYSIBM.SYSKEYS
WHERE IXCREATOR = ‘GPXXNN’ AND
IXNAME = ‘INDICE’

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


20 Parte 4

Teoria Como usar o spufi

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.

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


Parte 4 21

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,

4
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.

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


22 Parte 4
Veja como o SPUFI interage com o DB2

TSO SPUFI DB2


1 2
GP.GPXXNN.JCLDATA (CREATE1) 
PDS 4  3

GP.GPXXNN.DB2 SAI
PS/VB

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

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


Parte 4 23

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.

4
Para comentar os comandos, utilize dois hífens em qualquer coluna. Tudo que
vier na sequência será ignorado pelo DB2.

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


24 Parte 4

Practice

Atividade Revisão aos pares

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

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


Parte 4 25

Atividade Trabalho em dupla

Escreva os comandos SQL DDL para atender os


seguintes requisitos.

4
1) Inserir a coluna PRECOVENDA DECIMAL(9,2) NOT NULL na tabela TBPROD.

2) Tirar a coluna OBSCLIENTE da tabela CADCLI.

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


26 Parte 4
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.

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


Parte 4 27

Performance

Atividade Prática de laboratório


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.

1 2
IDXTIPOCLI IDXTIPOPROD
TBTIPOCLI TBTIPOPROD
CODTIPOCLI (PK) CODTIPOPROD (PK)
DESCTIPOCLI DESCTIPOPROD SET NULL
SET NULL

3 4
IDXCLI IDXPROD
TBCLI TBPROD
CODCLI (PK) CODPROD (PK)
NOMECLI DESCPROD
ENDCLI PRECOPROD
DATANASCCLI UNIDPROD
ALTURACLI CODTIPOPROD (FK)
CODTIPOCLI (FK)
RESTRICT

5
CASCADE

IDXVENDA
TBVENDA
NUMVENDA (PK)
DATAHORAVENDA
QTDEVENDA
CODCLI (FK)
CODPROD (FK)

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


28 Parte 4
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

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


Parte 4 29

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

4
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

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


30 Parte 4

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

Estou fera!

Fiz Certo!

 Muito Bom  Bom  regular  ruim  Muito ruim

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


Parte

Matemático inglês, desenvolveu a lógica


matemática de Boole, estabeleceu uma
representação das intersecções e uniões de
conjuntos através de diagramas que levam o seu
nome.
John Venn
1834- 1923
Versão 2.2.3
Parte 5 3

Preparation

Trocando Ideias É agora que você fala !!

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
5
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?

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

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!

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


4 Parte 5

Presentation

História MANIPULANDO OS DADOS

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.

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


Parte 5 5

Teoria Sql dml

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

5
SELECT Para consultar dados

UPDATE Para atualizar colunas

DELETE Para excluir linhas

A seguir veremos em detalhes cada um desses comandos:

Teoria insert

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.

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


6 Parte 5
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)

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


Parte 5 7
-- 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:

5
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

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


8 Parte 5

Teoria Select

O objetivo do comando SELECT é pesquisar dados dentro do DB2. Ele


especifica o formato de uma tabela para conter o resultado da pesquisa e outros
parâmetros para definir o processo de pesquisa. O formato básico do SELECT é:

SELECT colunas
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: Proibido em
muitas empresas!
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.

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


Parte 5 9

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,

5
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

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


10 Parte 5
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

O valor deve estar entre os dois limites, inclusive. Exemplos:

BETWEEN IDADE BETWEEN 1 AND 9

NOME BETWEEN ‘B%’ AND ‘F%’

O valor deve ser um dos fornecidos na lista. Exemplo:


IN
IDADE IN (1, 3, 5, 7, 9)

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:

LIKE 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’

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


Parte 5 11

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.

5
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.

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


12 Parte 5
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

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


Parte 5 13

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


5
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 Tamanho Formato Tamanho


Time Date
ISO hh.mm.ss 8 Bytes aaaa-mm-dd 10 Bytes
USA hh.mm AM 8 Bytes mm/dd/aaaa 10 Bytes
hh.mm PM
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

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


14 Parte 5
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.

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


Parte 5 15

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.

5
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

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


16 Parte 5
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
Devolve um valor DATE contido na expressão
DATE(coluna)
ou coluna do tipo DATE ou TIMESTAMP
Devolve o dia do mês se a expressão for do tipo
DAY(expressão) DATE, ou a quantidade de dias se a expressão
representar uma diferença de datas.
Devolve um numero inteiro representando o
DAYS(expressão) numero de dias transcorridos entre o valor DATE
da expressão e o dia 01/01/0001.
Retorna o valor da HORA contido na expressão.
HOUR(expressão) Expressão deve ter formato TIME ou
TIMESTAMP.
Devolve o valor dos MICROSSEGUNDOS
MICROSECOND(expressão) contidos na expressão. Expressão precisa ter
formato TIME ou TIMESTAMP.
Devolve o valor dos MINUTOS contidos na
MINUTE(expressão) expressão. Expressão deve ter formato TIME ou
TIMESTAMP
Devolve o valor do MES contido na expressão.
MONTH(expressão) Expressão deve ter formato DATE ou
TIMESTAMP
Devolve o valor dos SEGUNDOS contidos na
SECOND(expressão) expressão. Expressão deve ter formato TIME ou
TIMESTAMP
Devolve o valor do ANO contido na expressão.
YEAR(expressão) Expressão deve ter formato DATE ou
TIMESTAMP

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


Parte 5 17

Funções Agregativas
Obtém a média aritmética dos valores das
AVG(DISTINCT coluna) colunas ou expressões. Se DISTINCT for usado,
os valores repetidos serão desprezados.
* obtém a quantidade de linhas selecionadas. Se
COUNT(* ou DISTINCT coluna) DISTINCT for usado, as linhas repetidas não
serão contadas.
Obtém o maior valor contido nas colunas ou
MAX(coluna)
expressões selecionadas.
Obtém o menor valor contido nas colunas ou
MIN(coluna)
expressões selecionadas.
Obtém a soma dos valores das colunas ou

5
SUM(DISTINCT coluna) expressões selecionadas. Se DISTINCT for
usado, os valores repetidos não serão somados.

Funções de Conversão
Converte o resultado de expressão para
STRING. O resultado de expressão pode estar
CHAR(expressão) nos formatos:INTEGER ou SMALLINT
DECIMAL
REAL ou DOUBLE
Transforma o valor de expressão em valor no
DECIMAL(expressão,n1,n2) formato DECIMAL, contendo um total de n1
algarismos e n2 decimais.
Retorna o valor da expressão com os algarismos
no formato de um STRING de caracteres,
DIGITS(expressão) preenchendo com zeros a esquerda. A
expressão deve estar no formato INTEGER,
SMALLINT ou DECIMAL.
Retorna o valor da expressão ou coluna no
FLOAT(expressão)
formato FLOAT.
Retorna um STRING de dígitos hexadecimais
HEX(expressão)
com o valor da expressão.
Retorna o valor da expressão no formato
INTEGER(expressão)
INTEGER
Retorna o numero de caracteres do valor da
LENGTH(expressão)
expressão (ou coluna)
VALUE(expressão,expressão) Retorna o valor da primeira expressão cujo valor
COALESCE (expressão,expressão) não for NULL. São duas funções equivalentes.
Devolve um STRING extraído de STRING1 a
partir de INICIO. O argumento TAMANHO é
SUBSTR(string1,inicio,tamanho) opcional, e indica o comprimento do resultado.
Se TAMANHO for omitido, a extração se inicia
em INICIO até o fim de STRING1.

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


18 Parte 5
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.

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


Parte 5 19

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

5
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.

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


20 Parte 5
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:

FUNCIONARIOS

CODFUNC (PK) DEPARTAMENTO


NOMEFUNC
DEPTOFUNC(FK) CODDEPTO (PK)
SALARIOFUNC NOMEDEPTO

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.

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


Parte 5 21

OS 7 TIPOS DE JOIN

Dada as tabelas TABCLISP e TABCLIRJ, definidas abaixo:

CREATE TABLE TBCLISP CREATE TABLE TBCLIRJ

(CODCLISP CHAR(3) NOT NULL, (CODCLIRJ CHAR(3) NOT NULL,


NOMECLISP VARCHAR(10), NOMECLIRJ VARCHAR(10),
SALDOCLISP DECIMAL(8,2), SALDOCLIRJ DECIMAL(8,2),
PRIMARY KEY (CODCLISP) PRIMARY KEY (CODCLIRJ)
) )

Com o seguinte conteúdo:

SELECT * FROM TBCLISP SELECT * FROM TBCLIRJ; 5


CODCLISP NOMECLISP SALDOCLISP CODCLIRJ NOMECLIRJ SALDOCLIRJ
---------+---------+---------+-- ---------+---------+---------+--
001 ANA 100.00 002 DANIEL 200.00
003 BEATRIZ 300.00 004 ELIZABETE 400.00
005 CARLA 500.00 006 FABIO 600.00
008 PEDRO 2800.00 008 PEDRO 800.00
009 JOAO 2900.00 009 JOAO 900.00
010 JOSE 3000.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:

TBCLISP TBCLIRJ

008
LEFT 001 002 RIGHT
009
003 010 004
005 006

Desejamos fazer uma consulta (SELECT) exibindo CODCLISP, NOMECLIRJ e


SALDOCLIRJ, como mostrado abaixo:

SELECT CODCLISP, NOMECLIRJ, SALDOCLIRJ

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


22 Parte 5

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.

SELECT CODCLISP, NOMECLIRJ, SALDOCLIRJ


FROM TBCLISP INNER JOIN TBCLIRJ
ON CODCLISP = CODCLIRJ

A B CODCLISP NOMECLIRJ SALDOCLIRJ


---------+---------+---------+-----
008 PEDRO 800.00
009 JOAO 900.00
010 JOSE 1000.00

2. A  B União (FULL OUTER JOIN)


Queremos o cadastro completo.

SELECT CODCLISP, NOMECLIRJ, SALDOCLIRJ


FROM TBCLISP FULL OUTER JOIN TBCLIRJ
ON CODCLISP = CODCLIRJ

A B
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

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

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


Parte 5 23

3. Somente A (LEFT JOIN)


Queremos somente os clientes da TBCLISP e que também existam em
TBCLIRJ.

SELECT CODCLISP, NOMECLIRJ, SALDOCLIRJ


FROM TBCLISP LEFT JOIN TBCLIRJ
ON CODCLISP = CODCLIRJ

A B
CODCLISP NOMECLIRJ SALDOCLIRJ
-------+---------+---------+----

5
001 ---------- ----------
003 ---------- ----------
005 ---------- ----------
008 PEDRO 800.00
009 JOAO 900.00
010 JOSE 1000.00

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.

SELECT CODCLISP, NOMECLIRJ, SALDOCLIRJ


FROM TBCLISP RIGHT JOIN TBCLIRJ
ON CODCLISP = CODCLIRJ
A B
CODCLISP NOMECLIRJ SALDOCLIRJ
-------+---------+---------+----
-------- DANIEL 200.00
-------- ELIZABETE 400.00
-------- FABIO 600.00
008 PEDRO 800.00
009 JOAO 900.00
010 JOSE 1000.00

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.

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


24 Parte 5

5. (A  B) – B A menos B
Queremos exclusivamente os clientes de São Paulo. Eles não podem estar
cadastrados na TBCLIRJ.

SELECT CODCLISP, NOMECLIRJ, SALDOCLIRJ


FROM TBCLISP LEFT JOIN TBCLIRJ
ON CODCLISP = CODCLIRJ
A B WHERE CODCLIRJ IS NULL

CODCLISP NOMECLIRJ SALDOCLIRJ


-------+---------+---------+----
001 ---------- ----------
003 ---------- ----------
005 ---------- ----------

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.

SELECT CODCLISP, NOMECLIRJ, SALDOCLIRJ


FROM TBCLISP RIGHT JOIN TBCLIRJ
ON CODCLISP = CODCLIRJ
WHERE CODCLISP IS NULL
A B
CODCLISP NOMECLIRJ SALDOCLIRJ
-------+---------+---------+----
-------- DANIEL 200.00
-------- ELIZABETE 400.00
-------- FABIO 600.00

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.

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


Parte 5 25

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.

SELECT CODCLISP, NOMECLIRJ, SALDOCLIRJ


FROM TBCLISP FULL OUTER JOIN TBCLIRJ
ON CODCLISP = CODCLIRJ
WHERE CODCLISP IS NULL OR
CODCLIRJ IS NULL

CODCLISP NOMECLIRJ SALDOCLIRJ

5
-------+---------+---------+---
001 ---------- ----------
-------- DANIEL 200.00
003 ---------- ----------
-------- ELIZABETE 400.00
005 ---------- ----------
-------- FABIO 600.00

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.

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


26 Parte 5
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:

A condição do WHERE deve ser satisfeita para TODAS as linhas da


ALL
SUBQUERY.

IN
A condição do WHERE deve ser satisfeita pelo menos por UMA linha da
ANY
SUBQUERY
SOME

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.

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


Parte 5 27

Teoria update

O comando UPDATE é usado para alterar valores em uma ou mais linhas de


uma tabela. O comando enumera as colunas e seus novos valores.

UPDATE Tabela
SET coluna1=valor1,
Coluna2=valor2,

5
.......
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.

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


28 Parte 5

Teoria delete

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.

Esta bem, onde


estão as linhas
para delecão
, ?

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


Parte 5 29

Practice

Atividade TRABALHO EM DUPLA

Descreva o resultado dos SELECTs abaixo: 5

SELECT CODIGO,NOME
1
FROM FUNCIONARIOS

SELECT *
2
FROM FUNCIONARIOS

SELECT CODIGO,NOME
3 FROM FUNCIONARIOS
WHERE CARGO = ‘VENDAS’

SELECT NOME,SALARIO
FROM FUNCIONARIOS
4
WHERE CARGO = ‘VENDAS’
AND SALARIO > 1000

SELECT NOME,SALARIO
FROM FUNCIONARIOS
5
WHERE SALARIO BETWEEN
500 AND 2000

SELECT CODIGO,NOME
FROM FUNCIONARIOS
6
WHERE CARGO IN
(‘VENDAS’,’COBRANCA’)

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


30 Parte 5

SELECT NOME
FROM FUNCIONARIOS
7
WHERE NOME LIKE
‘MARIA%’

SELECT NOME,SALARIO
FROM FUNCIONARIOS
8
WHERE SALARIO * 12 >
50000

SELECT NOME,
CURRENT DATE –
DATADEMISSAO
9
FROM FUNCIONARIOS
WHERE DATADEMISSAO
IS NOT NULL

SELECT NOME || ‘-‘


|| CODDEPTO
10
FROM FUNCIONARIOS
WHERE SALFUNC ¬> 10000

SELECT NOME, CARGO


FROM FUNCIONARIOS
11 WHERE DATAADMISSAO +
10 YEARS >
CURRENT DATE

SELECT NOMEFUNC, CARGO


FROM TABFUNCSP
12 UNION
SELECT NOMEFUNC, CARGO
FROM TABFUNCRJ

SELECT NOMEFUNC, CARGO


FROM TABFUNCSP
13 UNION ALL
SELECT NOMEFUNC, CARGO
FROM TABFUNCRJ

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


Parte 5 31

Atividade TRABALHO EM DUPLA

Descreva o resultado dos SELECTs abaixo:

SELECT SUM(SALARIO),
5
AVG(COMISSAO)
1
FROM FUNCIONARIOS
WHERE DEPTO = ‘P1’

SELECT MAX(SALARIO),
2 MIN(SALARIO)
FROM FUNCIONARIOS

SELECT CARGO,
SUM(SALARIO)
3 FROM FUNCIONARIOS
GROUP BY CARGO
HAVING SUM(SALARIO) > 10000

SELECT SALARIO,
DECIMAL(SALARIO,6,1),
INTEGER(SALARIO),
4
HEX(SALARIO),
DIGITS(SALARIO)
FROM FUNCIONARIOS

SELECT NOME,
5 LENGTH(NOME)
FROM FUNCIONARIOS

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


32 Parte 5

SELECT SUBSTR(NOME,1,3)
6
FROM FUNCIONARIOS

SELECT COUNT(*)
7
FROM FUNCIONARIOS

SELECT NOME,
VALUE(COMISSAO,0)
8
FROM FUNCIONARIOS
WHERE COMISSAO IS NULL

SELECT NOME,
YEAR(DATANASC)
9
FROM FUNCIONARIOS
WHERE CODFUNC = ‘0010’

SELECT NOME,
YEAR(DATANASC)
10 FROM FUNCIONARIOS
WHERE YEAR(CURRENT DATE
– DATANASC) >= 18

SELECT NOME, SALARIO * 12


FROM FUNCIONARIOS
11 WHERE YEAR(DATAADMISSAO
+ 10 YEARS) >
YEAR(CURRENT DATE)

SELECT NOME, TELEFONE,


COMISSAO + SALARIO
AS BONUS
12
FROM FUNCIONARIOS
WHERE MONTH(DATAADMISSAO)
= MONTH(CURRENT DATE)

SELECT NOME, TELEFONE


FROM FUNCIONARIO
13
WHERE SUBSTR(NOME,1,3) =
‘SIL’

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


Parte 5 33

Atividade Revisão aos pares

Descreva o resultado das Subqueries abaixo:

SELECT NOME,SALARIO
5
FROM FUNCIONARIOS
WHERE DEPTO = ‘P1’ AND SALARIO > ALL
1
( SELECT SALARIO
FROM FUNCIONARIOS
WHERE DEPTO = ‘P2’)

SELECT NOME,SALARIO
FROM FUNCIONARIOS
WHERE DEPTO = ‘P1’ AND SALARIO >ANY
2
( SELECT SALARIO
FROM FUNCIONARIOS
WHERE DEPTO = ‘P2’)

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


34 Parte 5

SELECT NOME,SALARIO
FROM FUNCIONARIOS
WHERE DEPTO = ‘P1’ AND SALARIO EXISTS
3
( SELECT SALARIO
FROM FUNCIONARIOS
WHERE DEPTO = ‘P2’)

SELECT DEPTO, AVG(SALARIO)


FROM FUNCIONARIOS
WHERE CARGO <> ‘GERENTE’
GROUP BY DEPTO
4
HAVING AVG(SALARIO) < ( SELECT AVG(SALARIO)
FROM FUNCIONARIOS
WHERE CARGO <> ‘GERENTE’)
ORDER BY 2 DESC

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


Parte 5 35

Atividade Revisão aos pares

Dado o MER monte os SELECTs para responder


as questões abaixo:

5
CLIENTE PEDIDO MOTOBOY
NUMPED(PK)
CODCLI(PK) CODBOY(PK)
DATAPED
NOMECLI NOMEBOY
CODCLI(FK)
FONECLI ALCUNHABOY
CODBOY(FK)

COMPAGTO

(FK)NUMPED
PK
(FK)CODFORMA ITEM PRODUTO
VALORPAGTO
(FK)NUMPED CODPROD(PK)
PK
NUMITEM DESCPROD
CODPROD(FK) PRECOPROD
QTDPROD

FORMAPGTO

CODFORMA(PK)
DESCFORMA

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


36 Parte 5
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?

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


Parte 5 37

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?

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


38 Parte 5
9) Quantos pedidos foram feitos antes de ontem?

10) A relação de pedidos por motoboy.

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


Parte 5 39

Performance

Atividade Prática de laboratório

Utilize as tabelas abaixo para executar os


5
comandos INSERT, SELECT, DELETE e UPDATE.

1 2
IDXTIPOCLI IDXTIPOPROD
TBTIPOCLI TBTIPOPROD
CODTIPOCLI (PK) CODTIPOPROD (PK)
DESCTIPOCLI DESCTIPOPROD

SET NULL
SET NULL

3 4
IDXCLI IDXPROD
TBCLI TBPROD
CODCLI (PK) CODPROD (PK)
NOMECLI DESCPROD
ENDCLI PRECOPROD
DATANASCCLI UNIDPROD
ALTURACLI CODTIPOPROD (FK)
CODTIPOCLI (FK)
RESTRICT

5
CASCADE

IDXVENDA
TBVENDA
NUMVENDA (PK)
DATAHORAVENDA
QTDEVENDA
CODCLI (FK)
CODPROD (FK)

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


40 Parte 5

Atividade INSERT

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.

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


Parte 5 41

Atividade select

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


Exibir o nome dos clientes com menos de 1.7m de altura

SELECT01 5
Exibir o nome e o endereço dos clientes do tipo ‘01’

SELECT02

Exibir a descrição dos produtos do tipo ‘03’

SELECT03

Exibir todos os dados (*) de vendas feitos para o cliente ‘0001’

SELECT04

Exibir o preço do produto mais caro (MAX)

SELECT05

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


42 Parte 5
Exibir o nome dos clientes que moram em rua (LIKE)

SELECT06

Exibir a média de preço dos produtos do tipo ‘02’

SELECT07

Exibir todos os dados dos produtos (*) em ordem crescente de


descrição (ORDER BY)

SELECT08

Exibir todos os dados dos clientes do tipo ‘03’e (AND) que tenham
mais de 1.7m de altura em ordem decrescente de nome

SELECT09

Exibir quantas vendas foram feitas (COUNT) feitas para o cliente


‘0001’

SELECT10

Exibir a descrição dos produtos do tipo ‘01’, ’03’ e ‘05’ (IN)

SELECT11

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


Parte 5 43

Exibir o preço dos produtos mais caros por tipo de produto (MAX e
GROUP BY)

SELECT12

Exibir a média da altura dos clientes por tipo de cliente (AVG e


GROUP BY)

5
SELECT13

Exibir o nome e a data de nascimento dos clientes maiores ou iguais


a 18 anos. (YEAR e CURRENT DATE)

SELECT14

Exibir o nome e a descrição do tipo de cliente (JOIN)

SELECT15

Exibir a descrição dos produtos comprados por clientes do tipo ‘04’


(SUB-QUERIE)

SELECT16

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


44 Parte 5
Exibir sem repetição, o nome dos clientes que compraram produtos
do tipo ‘03’em ordem crescente de nome. (JOIN ou SUB-QUERIE)

SELECT17

Exibir o valor de cada compra feita pelo cliente ‘0002’(JOIN)

SELECT18

Exibir o valor do total de compras feitas pelo cliente ‘0001’ no mês e


ano correntes. (JOIN)

SELECT19

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


Parte 5 45

Exibir o nome dos clientes que compraram mais de R$ 1.000,00 em


produtos do tipo ‘01’. (JOIN / SUB-QUERIE)

SELECT20

Exibir a descrição do tipo de produto que os clientes do tipo ‘03`


compraram mais de 10 unidades por compra. (JOIN / SUB-QUERIE)

SELECT21

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


46 Parte 5

Atividade UPDATE

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


Aumentar o preço dos produtos do tipo ‘01’ em 15%

UPDATE1

Alterar os clientes do tipo ‘01’para tipo ‘03’

UPDATE2

Alterar para tipo ‘05’ os clientes nascidos depois de 1980 com mais
de 1.6m de altura

UPDATE3

Abaixar os preços dos produtos nunca que foram vendidos em 10%

UPDATE4

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


Parte 5 47

Lembrem-se das
Regras de integridade
Na exclusão
Atividade DELETE Cascade / delete / set null

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

5
Excluir as vendas feitas para os clientes ‘0005’ e ‘0010’

DELETE1

Excluir os clientes que compraram os produtos ‘0001’ e ‘0003’

DELETE2

Excluir os produtos com preço entre R$ 500,00 e R$ 1500,00 e tipo de


produto ‘01’

DELETE3

Excluir os produtos que nunca foram vendidos

DELETE4

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


48 Parte 5

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

Estou fera!

Fiz Certo!

 Muito Bom  Bom  regular  ruim  Muito ruim

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


Parte

Ray Boyce foi um cientista da computação


americano, mais conhecido por suas pesquisas
em banco de dados relacionais. Trabalhou na
IBM onde foi co-desenvolvedor da Forma Normal
Boyce-Codd (em parceria com Edgar Frank
Codd) e da linguagem SQL (com Donald Don
Chamberlim)

Raymond Francis Boyce


1947- 1974
Versão 2.2.3
Parte 6 3

Preparation

Trocando Ideias É agora que você fala !!

Antes de iniciarmos, vamos conversar sobre os tópicos apresentados na


capa desta parte. Isso é importante para que seu instrutor e seus colegas

6
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?

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

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!

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


4 Parte 6

Presentation

História O PRIMEIRO PROGRAMA

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.

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


Parte 6 5

Teoria Programando em cobol

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
6
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:

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
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

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


6 Parte 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:

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


Parte 6 7

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:

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


8 Parte 6
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.

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


Parte 6 9

Existe uma equivalência na declaração de arquivos e tabelas. A figura abaixo


mostra essa equivalencia.

Declaration da Tabela

6
Definição do Arquivo

Variável Hospedeira

Variável Espelho

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.

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


10 Parte 6
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

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


Parte 6 11

Teoria Include x copy

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.
6
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
EXEC SQL
INCLUDE BK002TP
END-EXEC

E
CO n t ã o
PY
de de eu di
va bo ss
tab r o e
ela iáveis k de a ele
s, m h ar pa
as ospe quivo ra fa
ele de e z
nã iras INCL er
om par UD
eo a E
u vi a s
ue
...

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


12 Parte 6

TESTE DE ERRO NOS


Teoria COMANDOS SQL(SQLCODE)

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

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


Parte 6 13

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.

6
Os valores a serem testados no SQLCODEsão:

SQLCODE = 0 Execução com sucesso.

Comando não foi executado. O codigo do erro é o valor do


SQLCODE < 0
SQLCODE.

O comando foi executado, com um WARNING dado pelo valor


SQLCODE > 0
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

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


14 Parte 6
É 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
.

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


Parte 6 15

Teoria WHENEVER

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”

6
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
SQLWARNING
SQLERROR
ou

EXEC SQL 0 100


WHENEVER condicao
CONTINUE
END-EXEC
NOT FOUND

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


16 Parte 6
Exemplos:

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


Parte 6 17

Procedure division com


Teoria ou sem Parágrafo principal

É 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

6
*-------------------------------------------------------------*
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.

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


18 Parte 6

Teoria Incluindo linhas na tabela

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

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


Parte 6 19

Exemplo Programa de carga

Objetivo do Programa

Carregar a tabela TBCLIENTE com base em um arquivo sequencial CADCLI.

6
Macro-Fluxo

CADCLI

EXECARGA

TBCLIENTE

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


20 Parte 6
Layout do Arquivo

Nome do Arquivo CADCLI


Nome do Registro REG-CADCLI
Tipo e
Nome do Campo Descrição
Tamanho
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

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.

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


Parte 6 21

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)

DECLARATION da tabela TBCLIENTE


6
----+-*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 *
******************************************************************

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


22 Parte 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 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).

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


Parte 6 23

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

6
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
.

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


24 Parte 6

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 "************************************************"
.

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


Parte 6 25

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

6
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.

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


26 Parte 6
----+-*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
.

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


Parte 6 27
----+-*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

6
, 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
.

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


28 Parte 6
----+-*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.

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


Parte 6 29

Practice

Atividade Prática de laboratório

Criar a tabela TESTEDCL descrita abaixo e

6
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

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


30 Parte 6

Atividade Revisão aos pares

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.

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


Parte 6 31

Performance

Atividade Projeto 1 - carga

Objetivo do Programa

6
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

CADPRDD1

GPXXNND1

TBPRODUTO

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


32 Parte 6

Layout do Arquivo

Nome do Arquivo CADPRDD1


Nome do Registro REG-CADPRDD1
Tipo e
Nome do Campo Descrição
Tamanho
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

Layout da Tabela

Nome da tabela TBPRODUTO


Tipo e
Nome da coluna Complementos
Tamanho
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

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


Parte 6 33

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

6
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.

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


34 Parte 6

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)

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


Parte 6 35

Parágrafo 2000-PROCESSAR
Usar EVALUTE aqui, Mover os dados da variável espelho para a hospedeira
entendeu ? 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)

6
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

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


36 Parte 6

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

Estou fera!

Fiz Certo!

 Muito Bom  Bom  regular  ruim  Muito ruim

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


Parte

Hugh Darwen é um cientista da computação que


trabalhou na IBM do Reino Unido de 1967 até 2004 e
esteve 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 que
seguia fielmente os princípios do modelo relacional. Ele
trabalhou próximo a Christopher J. Date e representou a
IBM nos comites da ISO SQL até sua aposentadoria da
IBM.

Hugh Darwen

1943 (69 anos)


Versão 2.2.3
Parte 7 3

Preparation

Trocando Ideias É agora que você fala !!

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 ?

7
 O que você não sabe ?
 Porque é importante conhecer estes tópicos ?
 Quais são os seus temores ?
 O que você considera difícil ?

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

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!

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


4 Parte 7

Presentation

História Let´s put it all together

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.

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


Parte 7 5

Teoria Compilando Cobol + sql(DB2)

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:

Programa Fonte

COBOL
+ GP.GPXXNN.COBLIB
SQL (GPXXNND1)

7
GP.GPXXNN.JOBLIB
1º. Passo (COMPBDB2)
BOOKs PRE-COMPILE

GP.GPXXNN.BOOKLIB
(GPXXNND1)
 TIMESTAMP  TIMESTAMP
Programa fonte DBRM
modificado Acessos DB2
só COBOL só SQL

d
SYS2.DB2.DBRMLIB.DATA SPOOL
(GPXXNND1)
2º. Passo
COMPILE
SD.ST
? JOBID
4º. Passo S SYSPRINT
PROGRAMA BIND
OBJETO
s

3º. Passo
LIBRARY LINK-EDIT k

PLAN

COLLECTION
i
GP.GERAL.LOADLIB  TIMESTAMP

(GPXXNND1)  TIMESTAMP
LOAD MODULE PACKAGE

A SYSIBM.SYSPACKAGES

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


6 Parte 7
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.

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


Parte 7 7
Abaixo temos o job de compilação COMPBDB2 seguido de instruções de uso.

3
1
2

1 – substitua GPXXNNPP pelo nome do programa que deseja compilar

2 – Substitua GPXXNN pelo seu usuário


7
3 – Esta é a instalação do DB2 que será usada para definir o plano de acesso

Quando eu criei o
primeiro compilador
as coisas eram mais
simples...

Essa IBM !

Amiga !

Grace Hopper e
a traca
, (BUG)

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


8 Parte 7
Após a compilação, vá ao SPOOL (SD.ST) para analisar o resultado, conforme tela
abaixo:

2
3
4
5

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.

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


Parte 7 9

Teoria EXECUTANDO COBOL + DB2

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.

3 1
7

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.

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


10 Parte 7

Teoria Acessando tabelas com cobol

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:

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


Parte 7 11
----+-*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

7
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

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


12 Parte 7
----+-*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

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


Parte 7 13

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

7
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

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


14 Parte 7

Teoria INDICATORS

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.

COBOL (VARIÁVEL HOSPERDEIRA)

* *
INSERT DELETE UPDATE SELECT FETCH

DB2 (SQL FIELDS - COLUNAS)

* Precisam de INDICATORS
Este INDICATOR receberá um dos seguintes valores após a execução de um
SELECT:

INDICATOR = -1 Coluna contém NULL


Erro na conversão de valores. -2 significa nulo porque um
INDICATOR = -2 comando aritmético não funcionou, também causa SQLCODE =
+802
INDICATOR = 0 Coluna contém valores normais
Comprimento original dos dados que foram truncados no
INDICATOR > 0 momento da carga na HOST VARIABLE ou comprimento de um
VARCHAR

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


Parte 7 15

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:

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


16 Parte 7
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

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


Parte 7 17

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.

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

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


18 Parte 7
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 *
Achei, são esses * INDVAR(YES) *
em vermelho!
* ... 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

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


Parte 7 19
----+-*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

7
,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 "*---------------------------------------------*"

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


20 Parte 7
----+-*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.

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


Parte 7 21

Exemplo manutencão
,

Objetivo do Programa

Atualizar a tabela TBCLIENTE com base na movimentação registrada no


arquivo sequencial MOVCLIDB.

Macro-Fluxo

MOVCLIDB

7
EXEMANUT

TBCLIENTE

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

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


22 Parte 7

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 ==
==================================================

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


Parte 7 23

Layout do Arquivo

Nome do Arquivo MOVCLIDB


Nome do Registro REG-MOVCLIDB
Tipo e
Nome do Campo Descrição
Tamanho
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

7
SALDOCLI-DB PIC 9(05)V99 Saldo do cliente
TIPOMOVTO-DB PIC X(01) Tipo da movimentação

Layout da Tabela

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)

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


24 Parte 7

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-==.

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


Parte 7 25
----+-*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.

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

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


26 Parte 7
----+-*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
.

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


Parte 7 27
----+-*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

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

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


28 Parte 7
----+-*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
.

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


Parte 7 29
----+-*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

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

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


30 Parte 7
----+-*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

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


Parte 7 31
----+-*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

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

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


32 Parte 7
----+-*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.

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


Parte 7 33

Practice

Atividade Revisão aos pares

Associe as etapas do processo de compilação


com as ações executadas.

a)
b)
Pré-Compilação
Compilação
7
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.

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


34 Parte 7

Atividade Revisão aos pares

Marque com X os argumentos entre SQLCODE e


SQLDML onde o erro pode ocorrer.

SQL DML
SELECT INSERT UPDATE DELETE
0

+100

-803

-545

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


Parte 7 35

Atividade Trabalho em dupla

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


7
( ) Comprimento original do dado que foi truncado no momento da carga na
HOST Variable

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


36 Parte 7

Atividade Prática de laboratório

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 ==
==================================================

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


Parte 7 37

Performance

Atividade Projeto 2 - manuten ão ç

Objetivo do Programa

A Metal Screws Inc. implantou um Sistema Gerenciador de banco de Dados

7
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

MOVPRDD2

GPXXNND2

TBPRODUTO

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


38 Parte 7

Layout do Arquivo

Nome do Arquivo MOVPRDD2


Nome do Registro REG-MOVPRDD2
Tipo e
Nome do Campo Descrição
Tamanho
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)

Layout da Tabela

Nome da tabela TBPRODUTO


Tipo e
Nome da coluna Complementos
Tamanho
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

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


Parte 7 39

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

7
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 ==
==================================================

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


40 Parte 7

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.

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


Parte 7 41

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.........: ___________
==================================================

7
== TERMINO NORMAL DO PROGRAMA GPXXNND2 ==
==================================================

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


42 Parte 7

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)

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


Parte 7 43

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

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

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


44 Parte 7
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?

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


Parte 7 45

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

7
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

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


46 Parte 7
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!

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


Parte 7 47

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


48 Parte 7

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

Estou fera!

Fiz Certo!

 Muito Bom  Bom  regular  ruim  Muito ruim

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


Parte

Charles William Backman foi um cientista


da computação particularmente conhecido por
seu 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 SGBD
simultaneamente. O IDS evoluiu para o IDMS
(Integrated Database Management Systems),
suportando mainframes IBM.

Charles William Backman


1924 (88 anos)
Versão 2.2.3
Parte 8 3

Preparation

Trocando Ideias É agora que você fala !!

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 ?

8
 O que você considera difícil ?

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

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!

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


4 Parte 8

Presentation

História RELATÓRIOS, DE NOVO!

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.
An
For atomi
mu
lári a de um
o co
n tí n
uo

de novo de novo
ser
mic rilha o
ro s u
erri
lha

rem
a lina
a d
lega
e po a s
de 1 66 linh
/6 d

80 o
de 1 u 132
/10 d co
e po lunas
lega
da

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


Parte 8 5

Teoria cursor

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 é:

8
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

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


6 Parte 8

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

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


Parte 8 7

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

8
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
.

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


8 Parte 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
.

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


Parte 8 9

Exemplo RELATÓRIO com cursor

Objetivo do Programa

Gravar o relatório CLIRELAT com os cliente da tabela TBCLIENTE que não


tenham e-mail.

Macro-Fluxo

TBCLIENTE

EXERELAT
8

CLIRELAT

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


10

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

www.grandeporte.com.br
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
Parte 8

58 XXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 999999999 99999999999 ZZ.ZZ9,99


Layout do Relatório

59 ------------------------------------------------------------------------------------------------------------------------------------
60 APOS O USO REUTILIZE ESSE RELATORIO COMO RASCUNHO - RECLICLE SUAS IDEIAS INDUSTRIAS JOAQUIM NABUCO LTDA.

 (11) 4427-4579 (11) 9 9903-3218


Parte 8 11

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
CPFCLI
VARCHAR(50)
CHAR(11) 8
SALDOCLI DECIMAL(9,2)

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


12 Parte 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 ==
==================================================
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 ==
==================================================

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


Parte 8 13

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

8
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.

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


14 Parte 8
----+-*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
" --------- ----------- ".

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


Parte 8 15
----+-*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

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

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


16 Parte 8
----+-*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

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


Parte 8 17
----+-*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

8
,: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
.

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


18 Parte 8
----+-*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
.

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


Parte 8 19
----+-*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

8
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
.

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


20 Parte 8
----+-*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 "================================================="
.

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


Parte 8 21
----+-*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.

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


22 Parte 8

Atividade Trabalho em dupla

Dado o M.E.R abaixo, monte os cursores


solicitados:

TABFUNC TABDEPTO
codfunc(PK) coddepto(PK)
nomefunc nomedepto
dataadminfunc codgerente(FK)
datademissaofunc
coddepto(FK)

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.

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


Parte 8 23

b) Cursor CGERENTE com o código e o nome do departamento, código, nome e


data de admissão do gerente do departamento.

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


24 Parte 8

Atividade Revisão aos pares

Criar as variáveis hospedeiras para receber o


conteúdo dos cursores criados na atividade anterior.

TABFUNC TABDEPTO
codfunc(PK) CHAR(4) coddepto(PK) CHAR(3)
nomefunc VARCHAR(30) nomedepto VARCHAR(20)
dataadminfunc DATE codgerente(FK) CHAR(4)
a) CVETERANO datademissaofunc DATE
coddepto(FK) CHAR(3)

b) CGERENTE

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


Parte 8 25

Performance

Atividade Projeto 3 - Relatório

Impressão de relatório via CURSOR

Objetivo do Programa

A Metal Screws Inc. precisa de um programa que imprima um relatório de

8
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

TBPRODUTO

GPXXNND3

RELREPO

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


26 Parte 8

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.

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


Parte 8 27

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
==================================================

8
TEMPO TOTAL DE PROCESSAMENTO.........: HH:MM:SS:CC
==================================================
== TERMINO NORMAL DO PROGRAMA GPXXNND3 ==
==================================================

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


28 Parte 8

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

DD/MM/20AAXXHH:MM:SSXXXXXXXXXXX XXREPOSICAO DE ESTOQUEXXXXXXXX PAG.XZ.ZZ9

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

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

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.

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


Parte 8 29

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


8

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


30 Parte 8
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

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


Parte 8 31

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
8
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

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


32 Parte 8
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

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


Parte 8 33

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


34 Parte 8

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

Estou fera!

Fiz Certo!

 Muito Bom  Bom  regular  ruim  Muito ruim

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


Parte

É um dos precursores dos conceitos de


data warehouse e sistemas de análise de dados
transacionais. Ele é conhecido por suas
convicções de que o data warehouse deve ser
desenhado para ser compreensível e rápido.
Ralph Kimball
1944 (68 anos)
Versão 2.2.3
Parte 9 3

Preparation

Trocando Ideias É agora que você fala !!

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 ?

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

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
9
tópicos. Comprometa-se!

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


4 Parte 9

Presentation

História Finalizando...

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.

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


Parte 9 5

Teoria ç
Atualiza ão posicionada

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.

9
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

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


6 Parte 9

Teoria Exclusão posicionada

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

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


Parte 9 7

Teoria Logical unit of work

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.

ponto de novo ponto de novo ponto de


consistência consistência consistência

linha do
UPDATE DELETE UPDATE DELETE
tempo

9
início da término da término da
LUW LUW LUW
COMMIT COMMIT

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

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


8 Parte 9
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.

Teoria CURSORES E COMMIT

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.

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


Parte 9 9

Practice

Atividade Prática de laboratório

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

9
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.

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


10 Parte 9
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 ==
==================================================

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


Parte 9 11

Performance

Atividade PROJETO 4 - ATUALIZACÃO


,

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
9
MOVPRDD4

GPXXNND4

TBPRODUTO

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


12 Parte 9

Layout do Arquivo

Nome do Arquivo MOVPRDD4


Nome do Registro REG-MOVPRDD4
Tipo e
Nome do Campo Descrição
Tamanho
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


Tipo e
Nome da coluna Complementos
Tamanho
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

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


Parte 9 13

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 ==
==================================================

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


14 Parte 9
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 ==
==================================================

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


Parte 9 15

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)

9
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)

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


16 Parte 9
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)

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


Parte 9 17

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

9
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

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


18 Parte 9
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

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


Parte 9 19

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


20 Parte 9

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

Estou fera!

Fiz Certo!

 Muito Bom  Bom  regular  ruim  Muito ruim

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


Parte

ANEXOS
Versão 2.2.3
Parte 10 3

Teoria Sqlcode table

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
ROW NOT FOUND FOR FETCH, UPDATE OR DELETE, OR THE RESULT OF A QUERY IS AN EMPTY
100 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
THE QUALIFIED COLUMN NAME column-name WAS RESOLVED USING A NON-UNIQUE OR UNEXPOSED
203 NAME
204 name IS AN UNDEFINED NAME
column-name IS NOT A COLUMN OF AN INSERTED TABLE, UPDATED TABLE, OR ANY TABLE
206 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
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
304 TYPE data-type2
THE NULL VALUE HAS BEEN ASSIGNED TO A HOST VARIABLE BECAUSE THE STRING CANNOT BE
331 TRANSLATED. REASON reason-code, CHARACTER code-point, HOST VARIABLE position-number
THE SQL STATEMENT HAS BEEN SUCCESSFULLY EXECUTED, BUT THERE MAY BE SOME
339 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
THE ALTER, INDEX, AND REFERENCES PRIVILEGES CANNOT BE GRANTED TO PUBLIC AT ALL
561 LOCATIONS
A GRANT OF A PRIVILEGE WAS IGNORED BECAUSE THE GRANTEE ALREADY HAS THE PRIVILEGE
562 FROM THE GRANTOR

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


4 Parte 10
610
INDEX index-name HAS BEEN PLACED IN RECOVER PENDING
625 THE DEFINITION OF TABLE table-name HAS BEEN CHANGED TO INCOMPLETE
DROPPING THE INDEX TERMINATES ENFORCEMENT OF THE UNIQUENESS OF A KEY THAT WAS
626 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
TABLE table-name IN PARTITIONED TABLESPACE tspace-name IS NOT AVAILABLE BECAUSE ITS
653 PARTITIONED INDEX HAS NOT BEEN CREATED
658 THE SUBPAGES VALUE IS IGNORED FOR THE CATALOG INDEX index-name
THE INTERNAL LENGTH OF THE LIMIT-KEY FIELDS FOR THE PARTITIONED INDEX index-name
664 EXCEEDS THE LENGTH IMPOSED BY THE INDEX MANAGER
DEFINITION CHANGE OF object object_name MAY REQUIRE SIMILAR CHANGE ON READ-ONLY
738 SYSTEMS
EXCEPTION ERROR exception-type HAS OCCURRED DURING operation-type OPERATION ON data-type
802 DATA, POSITION position-number
BIND ISOLATION LEVEL RR CONFLICTS WITH TABLESPACE LOCKSIZE PAGE OR LOCKSIZE ROW
806 AND LOCKMAX 0
807 THE RESULT OF DECIMAL MULTIPLICATION MAY CAUSE OVERFLOW
863 THE CONNECTION WAS SUCCESSFUL BUT ONLY SBCS WILL BE SUPPORTED
TYPE 1 INDEXES WITH SUBPAGES GREATER THAN 1 CANNOT BECOME GROUP BUFFER POOL
2000 DEPENDENT IN A DATA SHARING ENVIRONMENT
OPERATION COMPLETED SUCCESSFULLY BUT A DISTRIBUTION PROTOCOL VIOLATION HAS BEEN
30100 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
A PREDICATE IS INVALID BECAUSE THE COMPARISON OPERATOR operator IS FOLLOWED BY A
-115 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

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


Parte 10 5
THE OBJECT TABLE OR VIEW OF THE INSERT, DELETE, OR UPDATE STATEMENT IS ALSO IDENTIFIED
-118 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
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
-122 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
THE ESCAPE CLAUSE CONSISTS OF MORE THAN ONE CHARACTER, OR THE STRING PATTERN
-130 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
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
-133 HAVING CLAUSE IS APPLIED TO
IMPROPER USE OF LONG STRING COLUMN column-name OR A HOST VARIABLE OF MAXIMUM
-134 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
THE OBJECT OF THE INSERT, DELETE, OR UPDATE STATEMENT IS A VIEW FOR WHICH THE
-150 REQUESTED OPERATION IS NOT PERMITTED
THE UPDATE STATEMENT IS INVALID BECAUSE THE CATALOG DESCRIPTION OF COLUMN column-
-151 name INDICATES THAT IT CANNOT BE UPDATED
THE DROP clause CLAUSE IN THE ALTER STATEMENT IS INVALID BECAUSE constraint-name IS A
-152 constraint-type
-153 THE CREATE VIEW STATEMENT DOES NOT INCLUDE A REQUIRED COLUMN LIST
THE CREATE VIEW FAILED BECAUSE THE VIEW DEFINITION CONTAINS A UNION, A UNION ALL, OR
-154 A REMOTE OBJECT
-156 THE STATEMENT DOES NOT IDENTIFY A TABLE
ONLY A TABLE NAME CAN BE SPECIFIED IN A FOREIGN KEY CLAUSE. object-name IS NOT THE NAME
-157 OF A TABLE.
THE NUMBER OF COLUMNS SPECIFIED FOR THE VIEW IS NOT THE SAME AS THE NUMBER OF
-158 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
THE INSERT OR UPDATE IS NOT ALLOWED BECAUSE A RESULTING ROW DOES NOT SATISFY THE
-161 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

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


6 Parte 10

-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
AN ARITHMETIC OPERATION ON A DATE OR TIMESTAMP HAS A RESULT THAT IS NOT WITHIN THE
-183 VALID RANGE OF DATES
-184 AN ARITHMETIC EXPRESSION WITH A DATETIME VALUE CONTAINS A PARAMETER MARKER
THE LOCAL FORMAT OPTION HAS BEEN USED WITH A DATE OR TIME AND NO LOCAL EXIT HAS
-185 BEEN INSTALLED
THE LOCAL DATE LENGTH OR LOCAL TIME LENGTH HAS BEEN INCREASED AND EXECUTING
-186 PROGRAM RELIES ON THE OLD LENGTH
A REFERENCE TO A CURRENT DATE/TIME SPECIAL REGISTER IS INVALID BECAUSE THE MVS TOD
-187 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
QUALIFIED COLUMN NAMES IN ORDER BY CLAUSE NOT PERMITTED WHEN UNION OR UNION ALL
-197 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
column-name IS NOT A COLUMN OF AN INSERTED TABLE, UPDATED TABLE, OR ANY TABLE
-206 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
column-name IS NOT A COLUMN OF AN INSERTED TABLE, UPDATED TABLE, OR ANY TABLE
-206 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
"SET OF OPTIONAL COLUMNS" IN EXPLANATION TABLE table-name IS INCOMPLETE. OPTIONAL
-221 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
THE STRING CONTAINED IN HOST VARIABLE OR PARAMETER position-number IS NOT NUL-
-300 TERMINATED
THE VALUE OF INPUT HOST VARIABLE OR PARAMETER NUMBER position-number CANNOT BE USED
-301 AS SPECIFIED BECAUSE OF ITS DATA TYPE
THE VALUE OF INPUT VARIABLE OR PARAMETER NUMBER position-number IS INVALID OR TOO
-302 LARGE FOR THE TARGET COLUMN OR THE TARGET VALUE
A VALUE CANNOT BE ASSIGNED TO OUTPUT HOST VARIABLE NUMBER position-number BECAUSE
-303 THE DATA TYPES ARE NOT COMPARABLE

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


Parte 10 7
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
-304 TYPE data-type2
THE NULL VALUE CANNOT BE ASSIGNED TO OUTPUT HOST VARIABLE NUMBER position-number
-305 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.
THE LENGTH OF INPUT HOST VARIABLE NUMBER position-number IS NEGATIVE OR GREATER THAN
-311 THE MAXIMUM
-312 UNDEFINED OR UNUSABLE HOST VARIABLE variable-name
THE NUMBER OF HOST VARIABLES SPECIFIED IS NOT EQUAL TO THE NUMBER OF PARAMETER
-313 MARKERS
-314 THE STATEMENT CONTAINS AN AMBIGUOUS HOST VARIABLE REFERENCE
A STRING CANNOT BE USED BECAUSE IT CANNOT BE TRANSLATED. REASON reason-code,
-330 CHARACTER code-point, HOST VARIABLE position-number
A STRING CANNOT BE ASSIGNED TO A HOST VARIABLE BECAUSE IT CANNOT BE TRANSLATED.
-331 REASON reason-code, CHARACTER code-point, POSITION position-number
-332 SYSSTRINGS DOES NOT DEFINE A TRANSLATION FROM CCSID ccsid TO ccsid
THE SUBTYPE OF A STRING VARIABLE IS NOT THE SAME AS THE SUBTYPE KNOWN AT BIND TIME
-333 AND THE DIFFERENCE CANNOT BE RESOLVED BY TRANSLATION
-338 AN ON CLAUSE IS INVALID
THE SQL STATEMENT CANNOT BE EXECUTED FROM AN ASCII BASED DRDA APPLICATION
-339 REQUESTOR TO A V2R2 DB2 SUBSYSTEM
AN UNSUPPORTED SQLTYPE WAS ENCOUNTERED IN POSITION "" ON A PREPARE or DESCRIBE
-351 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
AN UPDATE OR INSERT VALUE IS NULL, BUT THE OBJECT COLUMN column-name CANNOT CONTAIN
-407 NULL VALUES
AN UPDATE OR INSERT VALUE IS NOT COMPARABLE WITH THE DATA TYPE OF ITS OBJECT COLUMN
-408 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
THE CORRESPONDING COLUMNS, column-number, OF THE OPERANDS OF A UNION OR A UNION ALL
-415 DO NOT HAVE COMPARABLE COLUMN DESCRIPTIONS
-416 AN OPERAND OF A UNION CONTAINS A LONG STRING COLUMN
A STATEMENT STRING TO BE PREPARED INCLUDES PARAMETER MARKERS AS THE OPERANDS OF
-417 THE SAME OPERATOR
-418 A STATEMENT STRING TO BE PREPARED CONTAINS AN INVALID USE OF PARAMETER MARKERS
THE DECIMAL DIVIDE OPERATION IS INVALID BECAUSE THE RESULT WOULD HAVE A NEGATIVE
-419 SCALE
THE VALUE OF A CHARACTER STRING ARGUMENT WAS NOT ACCEPTABLE TO THE function-name
-420 FUNCTION

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


8 Parte 10

-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
DYNAMIC ROLLBACK NOT VALID AT AN APPLICATION SERVER WHERE UPDATES ARE NOT
-427 ALLOWED
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
-440 PARAMETERS WERE EXPECTED.
-444 USER PROGRAM name COULD NOT BE FOUND
STORED PROCEDURE name, PARAMETER NUMBER number, OVERLAYED STORAGE BEYOND ITS
-450 DECLARED LENGTH
-469 SQL CALL STATEMENT MUST SPECIFY AN OUTPUT HOST VARIABLE FOR PARAMETER number.
SQL CALL STATEMENT SPECIFIED A NULL VALUE FOR INPUT PARAMETER number, BUT THE STORED
-470 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
A COLUMN CANNOT BE UPDATED BECAUSE IT IS NOT IDENTIFIED IN THE UPDATE CLAUSE OF THE
-503 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
THE TABLE IDENTIFIED IN THE UPDATE OR DELETE STATEMENT IS NOT THE SAME TABLE
-509 DESIGNATED BY THE CURSOR
THE TABLE DESIGNATED BY THE CURSOR OF THE UPDATE OR DELETE STATEMENT CANNOT BE
-510 MODIFIED
THE FOR UPDATE CLAUSE CANNOT BE SPECIFIED BECAUSE THE TABLE DESIGNATED BY THE
-511 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
CURSOR cursor-name CANNOT BE USED BECAUSE ITS STATEMENT NAME DOES NOT IDENTIFY A
-517 PREPARED SELECT STATEMENT
-518 THE EXECUTE STATEMENT DOES NOT IDENTIFY A VALID PREPARED STATEMENT
THE PREPARE STATEMENT IDENTIFIES THE SELECT STATEMENT OF THE OPENED CURSOR cursor-
-519 name
THE SQL STATEMENT CANNOT BE EXECUTED BECAUSE IT WAS IN ERROR AT BIND TIME FOR
-525 SECTION = sectno PACKAGE = pkgname CONSISTENCY TOKEN = X'contoken'
-530 THE INSERT OR UPDATE VALUE OF FOREIGN KEY constraint-name IS INVALID
THE PRIMARY KEY IN A PARENT ROW CANNOT BE UPDATED BECAUSE IT HAS ONE OR MORE
-531 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
THE DELETE STATEMENT IS INVALID BECAUSE TABLE table-name CAN BE AFFECTED BY THE
-536 OPERATION
THE PRIMARY KEY CLAUSE, A FOREIGN KEY CLAUSE, OR A UNIQUE CLAUSE IDENTIFIES COLUMN
-537 column-name MORE THAN ONCE

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


Parte 10 9
FOREIGN KEY name DOES NOT CONFORM TO THE DESCRIPTION OF THE PRIMARY KEY OF TABLE
-538 table-name
-539 TABLE table-name DOES NOT HAVE A PRIMARY KEY
THE DEFINITION OF TABLE table-name IS INCOMPLETE BECAUSE IT LACKS A PRIMARY INDEX OR A
-540 REQUIRED UNIQUE INDEX
column-name CANNOT BE A COLUMN OF A PRIMARY KEY OR A UNIQUE CONSTRAINT BECAUSE IT
-542 CAN CONTAIN NULL VALUES
A ROW IN A PARENT TABLE CANNOT BE DELETED BECAUSE THE CHECK CONSTRAINT check-
-543 constraint RESTRICTS THE DELETION
THE CHECK CONSTRAINT SPECIFIED IN THE ALTER TABLE STATEMENT CANNOT BE ADDED
-544 BECAUSE AN EXISTING ROW VIOLATES THE CHECK CONSTRAINT
THE REQUESTED OPERATION IS NOT ALLOWED BECAUSE A ROW DOES NOT SATISFY THE CHECK
-545 CONSTRAINT check-constraint
-546 THE CHECK CONSTRAINT constraint-name IS INVALID
-548 A CHECK CONSTRAINT THAT IS DEFINED WITH column-name IS INVALID
THE statement STATEMENT IS NOT ALLOWED FOR object_type1 object_name BECAUSE THE BIND OPTION
-549 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
authid2 CANNOT HAVE THE privilege PRIVILEGE on_object REVOKED BY authid1 BECAUSE THE
-556 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
bind-type AUTHORIZATION ERROR USING auth-id AUTHORITY PACKAGE = package-name PRIVILEGE =
-567 privilege
-571 THE STATEMENT WOULD RESULT IN A MULTIPLE SITE UPDATE
-574 THE SPECIFIED DEFAULT VALUE CONFLICTS WITH THE COLUMN DEFINITION.
THE NAME OF THE OBJECT TO BE CREATED IS IDENTICAL TO THE EXISTING NAME name OF THE
-601 OBJECT TYPE obj-type
-602 TOO MANY COLUMNS SPECIFIED IN A CREATE INDEX
A UNIQUE INDEX CANNOT BE CREATED BECAUSE THE TABLE CONTAINS ROWS WHICH ARE
-603 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
ONLY LOCKMAX 0 CAN BE SPECIFIED WHEN THE LOCK SIZE OF THE TABLESPACE IS TABLESPACE
-611 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
THE INDEX CANNOT BE CREATED BECAUSE THE SUM OF THE INTERNAL LENGTHS OF THE
-614 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

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


10 Parte 10

-619 OPERATION DISALLOWED BECAUSE THE WORK FILE DATABASE IS NOT STOPPED
KEYWORD keyword IN stmt type STATEMENT IS NOT PERMITTED FOR A TABLE SPACE IN THE WORK
-620 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
THE TABLE CANNOT BE DEFINED AS A DEPENDENT OF table-name BECAUSE OF DELETE RULE
-632 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
A NULLABLE COLUMN OF A FOREIGN KEY WITH A DELETE RULE OF SET NULL CANNOT BE A
-639 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
TABLE table-name CANNOT BE CREATED IN PARTITIONED/DEFAULT TABLE SPACE tspace-name
-646 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
TABLE table-name IN PARTITIONED TABLE SPACE tspace-name IS NOT AVAILABLE BECAUSE ITS
-653 PARTITIONED INDEX HAS NOT BEEN CREATED
THE CREATE OR ALTER STOGROUP IS INVALID BECAUSE THE STORAGE GROUP WOULD HAVE BOTH
-655 SPECIFIC AND NON-SPECIFIC VOLUME IDS
INDEX index-name CANNOT BE CREATED ON PARTITIONED TABLE SPACE tspace-name BECAUSE KEY
-660 LIMITS ARE NOT SPECIFIED
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
-661 SPACE
-662 A PARTITIONED INDEX CANNOT BE CREATED ON A NON-PARTITIONED TABLE SPACE tspace-name
THE NUMBER OF KEY LIMIT VALUES IS EITHER ZERO, OR GREATER THAN THE NUMBER OF
-663 COLUMNS IN THE KEY OF INDEX index-name

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


Parte 10 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
THE BUFFERPOOL ATTRIBUTE OF THE TABLE SPACE CANNOT BE ALTERED AS SPECIFIED BECAUSE
-671 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
THE LITERAL literal SPECIFIED FOR THE INDEX LIMIT KEY MUST CONFORM TO THE DATA TYPE data-
-678 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
COLUMN column-name IN VIOLATION OF INSTALLATION DEFINED FIELD PROCEDURE. RT: return-code,
-681 RS: reason-code, MSG: message-token
-682 FIELD PROCEDURE procedure-name COULD NOT BE LOADED
INVALID COLUMN TYPE FOR FIELDPROC, BIT DATA, SBCS DATA, OR MIXED DATA OPTION, column-
-683 name
-684 THE LENGTH OF LITERAL LIST BEGINNING string IS TOO LONG
-685 INVALID FIELD TYPE, column-name
COLUMN DEFINED WITH A FIELD PROCEDURE CAN NOT COMPARE WITH ANOTHER COLUMN WITH
-686 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
THE REQUIRED UNIQUE INDEX index-name FOR DDL REGISTRATION TABLE table-name DOES NOT
-692 EXIST
THE COLUMN column-name IN DDL REGISTRATION TABLE OR INDEX table-name (index-name) IS NOT
-693 DEFINED PROPERLY
THE DDL STATEMENT CANNOT BE EXECUTED BECAUSE A DROP IS PENDING ON THE DDL
-694 REGISTRATION TABLE table-name
-713 THE REPLACEMENT VALUE FOR special-register IS INVALID
PROGRAM program-name WITH MARK release-dependency-mark FAILED BECAUSE IT DEPENDS ON
-715 FUNCTIONS OF THE RELEASE FROM WHICH FALLBACK HAS OCCURRED
-716 PROGRAM program-name PRECOMPILED WITH INCORRECT LEVEL FOR THIS RELEASE.
bind-type FOR object-type object-name WITH MARK release-dependency-mark FAILED BECAUSE object-type
-717 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
BIND ERROR, ATTEMPTING TO REPLACE PACKAGE = package_name WITH VERSION = version2 BUT
-720 THIS VERSION ALREADY EXISTS
BIND ERROR FOR PACKAGE = pkg-id CONTOKEN = 'contoken'X IS NOT UNIQUE SO IT CANNOT BE
-721 CREATED

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


12 Parte 10

-722 bind-type ERROR USING auth-id AUTHORITY PACKAGE package-name DOES NOT EXIST
BIND ERROR ATTEMPTING TO REPLACE PACKAGE = . THERE ARE ENABLE OR DISABLE ENTRIES
-726 CURRENTLY ASSOCIATED WITH THE PACKAGE
THE PARENT OF A TABLE IN A READ-ONLY SHARED DATABASE MUST ALSO BE A TABLE IN A READ-
-730 ONLY SHARED DATABASE
-731 USER-DEFINED DATASET dsname MUST BE DEFINED WITH SHAREOPTIONS(1,3)
THE DATABASE IS DEFINED ON THIS SUBSYSTEM WITH THE ROSHARE READ ATTRIBUTE BUT THE
-732 TABLE SPACE OR INDEX SPACE HAS NOT BEEN DEFINED ON THE OWNING SUBSYSTEM
THE DESCRIPTION OF A TABLE SPACE, INDEX SPACE, OR TABLE IN A ROSHARE READ DATABASE
-733 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
A STORED PROCEDURE HAS BEEN PLACED IN MUST_ROLLBACK STATE DUE TO SQL OPERATION
-751 name
THE CONNECT STATEMENT IS INVALID BECAUSE THE PROCESS IS NOT IN THE CONNECTABLE
-752 STATE
EXCEPTION ERROR 'exception-type' HAS OCCURRED DURING 'operation-type' OPERATION ON 'data-type'
-802 DATA, POSITION 'position-number'
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
-803 IN THOSE COLUMNS. RID OF EXISTING ROW IS X'rid'
AN ERROR WAS FOUND IN THE APPLICATION PROGRAM INPUT PARAMETERS FOR THE SQL
-804 STATEMENT. REASON reason
DBRM or PACKAGE NAME location-name.collection-id.dbrm-name.consistency -token NOT FOUND IN PLAN
-805 plan-name. REASON reason
ACCESS DENIED: PACKAGE package-name IS NOT ENABLED FOR ACCESS FROM connection-type
-807 connection-name
-808 THE CONNECT STATEMENT IS NOT CONSISTENT WITH THE FIRST CONNECT STATEMENT
THE RESULT OF AN EMBEDDED SELECT STATEMENT IS A TABLE OF MORE THAN ONE ROW, OR THE
-811 RESULT OF THE SUBQUERY OF A BASIC PREDICATE IS MORE THAN ONE VALUE
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
-812 NAME FOR PROGRAM program-name.consistency-token USING PLAN plan-name
A GROUP BY OR HAVING CLAUSE IS IMPLICITLY OR EXPLICITLY SPECIFIED IN AN EMBEDDED
-815 SELECT STATEMENT OR A SUBQUERY OF A BASIC PREDICATE
THE SQL STATEMENT CANNOT BE EXECUTED BECAUSE THE STATEMENT WILL RESULT IN A
-817 PROHIBITED UPDATE OPERATION
THE PRECOMPILER-GENERATED TIMESTAMP x IN THE LOAD MODULE IS DIFFERENT FROM THE
-818 BIND TIMESTAMP y BUILT FROM THE DBRM z
THE VIEW CANNOT BE PROCESSED BECAUSE THE LENGTH OF ITS PARSE TREE IN THE CATALOG IS
-819 ZERO
THE SQL STATEMENT CANNOT BE PROCESSED BECAUSE catalog-table CONTAINS A VALUE THAT IS
-820 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
THE NUMBER OF HOST VARIABLES IN THE STATEMENT IS NOT EQUAL TO THE NUMBER OF
-870 DESCRIPTORS

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


Parte 10 13
THE SQL STATEMENT CANNOT BE EXECUTED BECAUSE THE APPLICATION PROCESS IS NOT
-900 CONNECTED TO AN APPLICATION SERVER
UNSUCCESSFUL EXECUTION CAUSED BY A SYSTEM ERROR THAT DOES NOT PRECLUDE THE
-901 SUCCESSFUL EXECUTION OF SUBSEQUENT SQL STATEMENTS
-902 POINTER TO THE ESSENTIAL CONTROL BLOCK (CT/RDA) HAS VALUE 0, REBIND REQUIRED
UNSUCCESSFUL EXECUTION CAUSED BY AN UNAVAILABLE RESOURCE. REASON reason-code, TYPE
-904 OF RESOURCE resource-type, AND RESOURCE NAME resource-name
UNSUCCESSFUL EXECUTION DUE TO RESOURCE LIMIT BEING EXCEEDED, RESOURCE NAME =
resource-name LIMIT = limit-amount1 CPU SECONDS (limit-amount2 SERVICE UNITS) DERIVED FROM limit-
-905 source
THE SQL STATEMENT CANNOT BE EXECUTED BECAUSE THIS FUNCTION IS DISABLED DUE TO A
-906 PRIOR ERROR
bind-type ERROR USING auth-id AUTHORITY BIND, REBIND OR AUTO-REBIND OPERATION IS NOT
-908 ALLOWED
-909 THE OBJECT HAS BEEN DELETED
-910 THE SQL STATEMENT CANNOT ACCESS AN OBJECT ON WHICH A DROP OR ALTER IS PENDING
THE CURRENT UNIT OF WORK HAS BEEN ROLLED BACK DUE TO DEADLOCK OR TIMEOUT. REASON
-911 reason-code, TYPE OF RESOURCE resource-type, AND RESOURCE NAME resource-name
UNSUCCESSFUL EXECUTION CAUSED BY DEADLOCK OR TIMEOUT. REASON CODE reason-code, TYPE
-913 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
CONNECTION NOT ESTABLISHED: DB2 condition REASON reason-code, TYPE resource-type, NAME resource-
-923 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
THE LANGUAGE INTERFACE (LI) WAS CALLED WHEN THE CONNECTING ENVIRONMENT WAS NOT
-927 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
THE SQL STATEMENT FAILED BECAUSE IT WILL CHANGE A TABLE DEFINED WITH DATA CAPTURE
-947 CHANGES, BUT THE DATA CANNOT BE PROPAGATED
-948 DISTRIBUTED OPERATION IS INVALID
THE LOCATION NAME SPECIFIED IN THE CONNECT STATEMENT IS INVALID OR NOT LISTED IN THE
-950 COMMUNICATIONS DATABASE
-965 STORED PROCEDURE procname TERMINATED ABNORMALLY
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
-2001 NUMBER opnum
EXECUTION FAILED DUE TO A DISTRIBUTION PROTOCOL ERROR THAT WILL NOT AFFECT THE
SUCCESSFUL EXECUTION OF SUBSEQUENT COMMANDS OR SQL STATEMENTS: REASON reason-code
-30000 (sub-code)
EXECUTION FAILED DUE TO A DISTRIBUTION PROTOCOL ERROR THAT CAUSED DEALLOCATION OF
-30020 THE CONVERSATION: REASON <reason-code (sub-code)>

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


14 Parte 10
EXECUTION FAILED DUE TO A DISTRIBUTION PROTOCOL ERROR THAT WILL AFFECT THE
SUCCESSFUL EXECUTION OF SUBSEQUENT COMMANDS OR SQL STATEMENTS: MANAGER manager
-30021 AT LEVEL level NOT SUPPORTED ERROR
COMMIT REQUEST WAS UNSUCCESSFUL, A DISTRIBUTION PROTOCOL VIOLATION HAS BEEN
DETECTED, THE CONVERSATION HAS BEEN DEALLOCATED. ORIGINAL SQLCODE=original-sqlcode
-30030 AND ORIGINAL SQLSTATE=original-sqlstate
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
-30040 <rdbname>
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
-30041 <rdbname>
<command-or-SQL-statement-type> COMMAND OR SQL STATEMENT INVALID WHILE BIND PROCESS IN
-30050 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

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


Parte 10 15

Teoria MVS abend code

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.

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


16 Parte 10
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, Conflicting DCB information for file defined as EXTERNAL
U1075
U1072, Illegal numbers in reference modification
U1073,
U1074
U3000 COBOL LE intercepted the ABEND. Messages in SYSDBOUT.
U4038 COBOL LE intercepted the ABEND. Messages in CEEDUMP.

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


Parte 10 17

Teoria Tabela de File status

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

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


18 Parte 10

Teoria Tabela ascII

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.
Dec Hex char 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
2
61 3D = 125 7D } 189 BD 253 FD
62 3E > 126 7E ~ 190 BE 254 FE þ
63 3F ? 127 7F del 191 BF ┐ 255 FF

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


Parte 10 19

Teoria Tabela EBCDIC

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
LOW-VALUES 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 Usados para
4 4 PF (punch off) 68 44 132 84 d 196 C4 D representar
5 5 HT (horizontal tab) 69 45 133 85 e 197 C5 E
números
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 positivos.
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 Usados para
19 13 TM (tape mark) 83 53 147 93 l 211 D3 L representar
20 14 RES (restore) 84 54 148 94 m 212 D4 M
números
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 negativos.
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 Usados para
52 34 PN (punch on) 116 74 180 B4 244 F4 4
53 35 RS (reader stop) 117 75 181 B5 245 F5 5
representar
54 36 UC (upper case) 118 76 182 B6 246 F6 6 números sem
55 37 EOT (end of transmission) 119 77 183 B7 247 F7 7 sinal.
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 HIGH-VALUES

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


20 Parte 10

Teoria POTÊNCIA DE 2

1 Byte

2 Bytes

3 Bytes

4 Bytes

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

Anda mungkin juga menyukai