grande porte - cobol level 2 - versão 2.2.3
DESCRIPTION
GRANDE PORTE LEVEL 2 - VERSAO 2TRANSCRIPT
www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218
COBOL Level 1
Versão 2.3.5 – PDF liberado em 26/04/2015
Fique atento para novas versões em nosso site.
Sobre o autor
Prof. Nelson Goncalves de Oliveira
Cientista da Computacão pelo IMES-SCS,
Especialista em Telecomunicacões pela
FAAP-SP, mestrando em ciência da
computacão pela UFAbc-sp.
Iniciou a carreira como desenvolvedor de
software em 1987, especializando-se em
COBOL para Mainframes IBM.
Professor universitário Desde 2000,
leciona diversas disciplinas nos cursos de
Ciência da Computacão e Informática.
fundou a Grande Porte em 2008 com o
objetivo de difundir essa experiência para
o mercado.
“O COBOL tem aberto as portas de
diversas empresas para os nossos
alunos e, mesmo após 55 anos de
existência, continua firme e forte
suportando globalmente o comércio
mundial.”
,
, ,
,
,
Parte
Desenvolveu o modelo de banco de dados relacional, quandoera pesquisador no laboratório da IBM em San José
Edgar Frank Codd 1923 – 2003
Versão 2.2.3a
Parte 1
www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218
3
1
Antes de iniciarmos, vamos conversar sobre os tópicos apresentados na capa desta parte. Isso é importante para que seu instrutor e seus colegas saibam como está seu conhecimento sobre o assunto e se você precisa ou pode fornecer ajuda aos colegas e instrutor.
O que você já sabe?
O que você não sabe?
Porque é importante conhecer estes tópicos?
Quais são os seus temores?
O que você considera difícil?
Depois de falar sobre o assunto com seus colegas e instrutor, escreva,
desenhe, rabisque, diga algo sobre o que você vai fazer para dominar esses tópicos.Comprometa-se!
Preparation
Trocando Ideias É agora que você fala !!
Reflexão É aqui que você se compromete !!
Parte 1
www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218
4
Parabéns você concluiu o curso COBOL Level 1, onde seus programas
manipulavam arquivos sequenciais (QSAM) e indexados (VSAM KSDS).
No curso COBOL Level 2 você deverá escrever programas que irão manipular
dados armazenados em tabelas no DB2.
Há todo um jargão novo para aprender: modelagem, D.E.R, M.E.R, chave
primária, chave estrangeira, normalização, SQL, e etc.
Então vamos começar pelo principio e aprender a ler e a fazer modelos de
dados usando o paradigma relacional.
Presentation
História Uma nova fase !!
Parte 1
www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218
5
1
A Modelagem de Dados é a atividade de determinar os dados necessários para
suportar um negócio, organizando-os em uma estrutura que evite a sua redundância e
facilite sua manutenção pelos sistemas de informação.
É uma atividade realizada por Analistas de Sistemas, com o suporte de um
DBA (Data Base Administrator – Administrador de Banco de Dados) que conhece as
peculiaridades do SGBD (Sistema Gerenciador de Banco de Dados) e pode sugerir
mudanças no modelo de acordo com o software utilizado (Oracle, DB2, Sybase, SQL
Server, etc), visando utilizar de forma otimizada os recursos desses softwares.
Os produtos da Modelagem de Dados são os modelos: Conceitual, Lógico e
Físico dos dados. O Modelo Conceitual é uma visão de alto nível cuja finalidade é
comunicar a essência dos dados que se deseja manipular. O Modelo Lógico leva em
conta os limites impostos pelo paradigma de banco de dados escolhido, em nosso
caso esse paradigma é o Relacional, agrupando os dados em Entidades e seus
relacionamentos. O Modelo Físico já traz detalhes da implementação física desses
dados no SGBD escolhido.
Esses modelos documentam a camada de dados do sistema de informação
que está sendo desenvolvido e serve para comunicar a todos os profissionais
envolvidos quais são os dados e como eles devem ser implementados.
A vantagem em se desenvolver esses três modelos é evitar uma solução física
prematura da definição da camada de dados em um sistema de informação, o que
pode consumir muito tempo se for necessário fazer grandes modificações neste
modelo de dados. É mais fácil reprojetar uma casa enquanto ela está ainda no papel.
TeoriaDefinição de
modelagem de dados
Parte 1
www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218
6
É uma visão macro dos dados do sistema que se deseja desenvolver. Os
dados que dão suporte ao negócio são agrupados em Entidades, que podem estar
relacionadas entre si. Vamos fazer algumas definições:
Atributos – são os dados que dão suporte ao negócio que desejamos modelar,
por exemplo: nome do cliente, endereço do fornecedor, data da venda, etc.
Instância de atributo – são exemplos de dados que o atributo pode conter.
Exemplo: o atributo nome do cliente pode ter as seguintes instâncias José da Silva,
Joaquim José da Silva Xavier, Maria Antonieta, etc.
Entidade – são agrupamentos de dados (atributos) sobre algum objeto de
interesse que desejamos modelar. Por exemplo: cliente, fornecedor, empresa,
funcionário, etc.
Relacionamento – são associações entre as entidades de um modelo. O
relacionamento entre as entidades se dá através de atributos comuns entre as
entidades. Por exemplo: na entidade Cliente temos o atributo código do cliente e na
entidade Venda, também temos o atributo código do cliente, para o qual a venda foi
realizada.
É a representação do modelo conceitual de dados. Neste diagrama utilizamos
os seguintes símbolos:
Entidade
Relacionamento
Linha de ligação
Atributo
Atributo identificador
TeoriaDer – diagrama
Entidade - relacionamento
Teoria Modelo conceitual de dados
Parte 1
www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218
7
1Exemplo de um DER:
Indicam quantas ocorrências de uma entidade participam, no mínimo e no
máximo, do relacionamento. Ela é colocada sobre o relacionamento. No exemplo
acima temos uma cardinalidade 1:N; isso significa que 1 Cliente pode fazer N Pedidos,
mas que cada Pedido é de apenas 1 Cliente, dando uma cardinalidade 1:N (leia-se 1
para N).
As cardinalidades representam os tipos de relacionamentos, que podem ser 1:1,
1:N, N:1 ou N:N.
Cardinalidade 1:1 uma instância da entidade A se relaciona com nenhuma ou
somente uma instância da entidade B. Exemplo: As entidades Fotografia e Cliente
possuem uma cardinalidade 1:1 porque uma Fotografia exibe apenas 1 Cliente e 1
Cliente possui apenas 1 Fotografia.
Cliente FotografiaExibe1 1
1 1
1:1
Teoria CArdinalidade
Cliente PedidoFaz1 N
1 1
1:N
Parte 1
www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218
8
Em um relacionamento com cardinalidade 1 para 1, existe o lado opcional e o
lado obrigatório. O atributo que identifica o lado opcional deve aparecer no lado
obrigatório, para que haja o relacionamento. No exemplo acima, um Cliente pode não
ter Fotografia, que é opcional. Porém toda Fotografia pertence a um Cliente, que é
obrigatório. Então o atributo Código Fotografia deve aparecer na entidade Cliente.
Cardinalidade 1:N uma instância da entidade A se relaciona com nenhuma,
uma ou muitas instâncias da entidade B. Exemplo: As entidades Classificação e
Cliente possuem um relacionamento com cardinalidade 1:N, porque uma Classificação,
por exemplo 5 estrelas, pode classificar muitos Clientes e cada Cliente possui apenas
1 classificação.
Em um relacionamento com cardinalidade 1:N ou N:1, o atributo que identifica
o lado 1 deve aparecer no lado N, para que haja o relacionamento. No Exemplo, uma
Classificação pode não ter Cliente relacionado, pode ter 1 ou pode ter muitos, mas um
Cliente pode ter somente uma Classificação.
Cardinalidade N:N uma instância da entidade A se relaciona com nenhuma,
uma ou muitas instâncias da entidade B e vice-versa. Exemplo: As entidades Cliente e
Produto, possuem um relacionamento com cardinalidade N:N porque 1 Cliente pode
comprar muitos Produtos e 1 Produto pode ser comprado por muitos Clientes.
Cliente ProdutoCompra1 N
N 1
N:N
Classificação1 1
N 1
N:1
ClassificaCliente1
Parte 1
www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218
9
1
Peça
Forma
N 1
N:N
1
N
Em um relacionamento com cardinalidade N:N não há como colocar o atributo
identificador de uma entidade na outra. Por exemplo, não podemos colocar o código
do Cliente na entidade Produto, porque um Produto pode ser comprado por N Clientes.
Da mesma forma não podemos colocar o código do produto no Cliente, porque um
Cliente pode comprar N Produtos.
Assim, um relacionamento com cardinalidade N:N precisa de uma entidade
associativa, que possa receber os atributos identificadores de ambas entidades.
Porém, no DER, não representamos essas entidades associativas, deixando a
cardinalidade N:N. Essa entidade associativa aparecerá no Modelo Lógico.
Indica o número de entidades que participam de um relacionamento.
Relacionamento Unário: Também conhecido como auto-relacionamento. É
quando existe relacionamento entre apenas uma entidade. Por exemplo, uma Peça é
formada por nenhuma, uma ou muitas outras Peças.
Teoria Grau do relacionamento
Parte 1
www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218
10
Relacionamento Binário: É quando existe relacionamento entre apenas duas
entidades. Por exemplo, um Fornecedor comercializa Materiais que são utilizados em
diversos Projetos. Observe que temos 3 entidades e dois relacionamentos com grau 2
(binário).
Fornecedor Material1 N
N 1
N:N
Comercializa
Utiliza
1
N
N
1
N:N
Projeto
Parte 1
www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218
11
1Relacionamento Ternário: É quando existe relacionamento entre três
entidades. Por exemplo, um Fornecedor comercializa Materiais que são utilizados em
Projetos específicos. Observe que temos 3 entidades e apenas 1 relacionamento com
grau 3 (ternário).
Fornecedor Material
N
N:NUtiliza
N
Projeto
1
1N 1
N:N
N:N
Parte 1
www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218
12
a) Uma Pizzaria precisa de um DER para
organizar seus dados. Foram identificadas as
seguintes entidades e atributos básicos:
Pedido – Número Pedido, Data e hora do Pedido.
Cliente – Código Cliente, Nome Cliente, Endereço Cliente, Telefone Cliente
Produto – Código do Produto, Descrição do Produto, Qtde. Estoque Produto
Entregador – Código Entregador, Nome Entregador, Alcunha Entregador
Histórico – Código Histórico, Texto Histórico, Data Criação Histórico, Data
Última Alteração Histórico
Tabela de Preço – Número Preço, Data Início Preço, Preço
As seguintes regras devem ser observadas:
Um cliente pode fazer muitos pedidos ao longo do tempo, porém um pedido
pertence a um só cliente.
Um entregador pode entregar muitos pedidos, porém um pedido só pode ser
entregue por um entregador.
Um pedido pode ter muitos produtos e um produto ser solicitado em muitos
pedidos.
Um Cliente possui um histórico e cada histórico é de apenas um cliente.
Um produto pode ter seu preço alterado várias vezes ao longo do tempo, mas
cada preço é de apenas um produto.
Atividade Trabalho em dupla
Parte 1
www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218
13
1
Parte 1
www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218
14
É uma visão mais detalhada do modelo de dados. Deriva do modelo conceitual,
possui entidades associativas em lugar de relacionamentos N:N e aglutina as
entidades com relacionamento 1:1 (aglutina o opcional no obrigatório e elimina a
chave primária do opcional), apresenta apenas relacionamentos 1:N e N:1, adequação
ao padrão de nomenclatura para entidades e atributos que devem ser bem
documentados em um dicionário de dados.
Vamos fazer algumas definições:
Chave Primária (PK = Primary Key) é o atributo ou agrupamento de atributos
(concatenação) que identifica de forma única cada ocorrência de instância da entidade.
Por exemplo codprod (código do produto), numnf (número da nota fiscal), etc
Chave Candidata é o atributo ou agrupamento de atributos que, não sendo
chave primária, também identifica de forma única uma ocorrência da instância da
entidade. Também é conhecida como chave alternativa. Por Exemplo: cpfcli (CPF do
Cliente), cnpjemp (CNPJ da Empresa), etc.
Chave Estrangeira (FK = Foreign Key) é o atributo ou agrupamento de
atributos que formam a chave primária de uma entidade em outra entidade, com a qual
faz relacionamento. Por exemplo, o codcli (código do cliente na entidade nota fiscal), o
codprod (código do produto na entidade item da nota fiscal), etc Em geral a chave
estrangeira mantem o mesmo nome da chave primaria de onde se originalizou.
Teoria Modelo lógico de dados
Lógica?
É comigo
Mesmo!
Parte 1
www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218
15
1
É a representação do modelo lógico de dados. Neste modelo utilizamos os
seguintes símbolos:
TeoriaMer – modelo
entidade - relacionamento
Entidade
Nenhum (cardinalidade mínima)
Um
Nenhum ou um
Muitos (cardinalidade máxima)
Nenhum ou muitos
Um ou muitos
Nenhum, um ou muitos
Eu pedi umrabo de galo!
Parte 1
www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218
16
Exemplo de M.E.R. (Modelo Entidade Relacionamento)
Neste MER podemos concluir que pode haver clientes para o qual nenhuma
venda foi feita. Isso significa que a empresa faz um cadastro de clientes em potencial.
Há também produtos que ainda não foram vendidos e que toda venda possui no
mínimo 1 item vendido.
Os atributos de cada entidade são relacionados em uma planilha, suas chaves
primária (PK) e estrangeira (FK) são identificadas e algumas instâncias são colocadas
para verificar se há coerência com o modelo. Para o nosso exemplo temos:
tabcliente
codcli (PK) Nomecli enderecocli cpfcli telefonecli
0001 ANTONIA MARIA ROSA RUA DAS FLORES, 123 23244454378 49993433
0002 MARCOS VASCONVELOS RUA DAS OLIVEIRAS, 45 23456578733 44335566
0003 JOAQUIM JOSE RUA DAS GOIABEIRAS, 432 32145398745 32226778
0004 JOANA DA ARCA RUA DAS FIGUEIRAS, 12 21234589755 43346656
tabproduto
codprod (PK) descprod precovenda qtdeestoque
0001 PARAFUSO SEXTAVADO 3/4 12.32 1230
0002 PORCA DE ACO NUMERO 12 10.15 230
0003 MARTELO 1,5 KG 35.78 23
0004 ALICATE UNIVERSAL 43.54 49
tabvenda
numvenda (PK) datavenda codcli (FK)
00001 20/05/2009 0002
00002 12/06/2009 0002
00003 30/10/2009 0001
tabcliente
codcli (PK)nomeclienderecoclicpfclitelefonecli
tabvenda
numvenda (PK)datavendacodcli (FK)
tabitemvenda
numitem(PK)numvenda (FK)qtdeitemcodprod (FK)
tabproduto
codprod (PK)descprodprecovendaqtdeestoque
Parte 1
www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218
17
1
Sempre que no D.E.R. for definido um relacionamento com cardinalidade N:N,
deveremos substituí-lo por uma entidade associativa. O procedimento para isto é o
seguinte:
1º) desenhar as entidades com cardinalidade N:N e representá-las com os
símbolos do M.E.R. conforme a imagem à esquerda.
2º) colocar a entidade associativa entre elas e o N que estava nas pontas vai
para o meio invertendo a ordem: o de baixo sobe e o de cima desce.
TABVENDA TABVENDA
TABITEMVENDA
TABPRODUTOTABPRODUTO
Simplesassim ?
Parte 1
www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218
18
Ao se montar uma chave primária de uma entidade associativa, temos três
opções, podemos usar um NSU (Número Sequencial Único) ou uma chave
concatenada (FK+NSU ou FK+FK).
1. NSU
Uma NSU é um número natural, começando de 1 e sempre acrescido de 1 a
cada nova linha (tupla) da tabela. No exemplo acima foi usada uma NSU para a chave
primária de todas as entidades (tabelas).
2. FK+NSU
Na chave primária concatenada, a entidade tabitemvenda recebe o atributo
numvenda como chave estrangeira, concatenada ao numitem para formar uma chave
primária concatenada, como mostra a tabela abaixo:
tabitemvenda
(numvenda (FK) + numitem) (PK) qtdeitem codprod (FK)
0000100001 3 0004
0000100002 2 0002
0000100003 3 0001
0000200001 5 0001
0000300001 4 0001
0000300002 1 0004
Observe que o numvenda se repete e o numitem recomeça em 1 para cada
novo item, mas concatenados não ocorre repetição, sendo uma chave primária válida.
tabitemvenda
numitem (PK) numvenda (FK) qtdeitem codprod (FK)
00001 00001 3 0004
00002 00001 2 0002
00003 00001 3 0001
00004 00002 5 0001
00005 00003 4 0001
00006 00003 1 0004
Parte 1
www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218
19
13. FK+FK
Outra forma de montar uma chave primária concatenada é unir numvenda com
o codprod, como mostra a tabela abaixo.
tabitemvenda
(numvenda (FK) + codprod(FK)) (PK) qtdeitem
0000100004 3
0000100002 2
0000100001 3
0000200001 5
0000300001 4
0000300004 1
Parte 1
www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218
20
Uma Pizzaria precisa de um MER para organizar
seus dados. Foram identificadas as seguintes entidades e
atributos básicos:
Pedido – Número Pedido, Data e hora do Pedido.
Cliente – Código Cliente, Nome Cliente, Endereço Cliente, Telefone Cliente
Produto – Código do Produto, Descrição do Produto, Qtde. Estoque Produto
Entregador – Código Entregador, Nome Entregador, Alcunha Entregador
Histórico – Código Histórico, Texto Histórico, Data Criação Histórico, Data
Última Alteração Histórico
Tabela de Preço – Número Preço, Data Início Preço, Preço
As seguintes regras devem ser observadas:
Um cliente pode fazer muitos pedidos ao longo do tempo, porém um pedido
pertence a um só cliente.
Um entregador pode entregar muitos pedidos, porém um pedido só pode ser
entregue por um entregador.
Um pedido pode ter muitos produtos e um produto ser solicitado em muitos
pedidos.
Um Cliente possui um histórico e cada histórico é de apenas um cliente.
Um produto pode ter seu preço alterado várias vezes ao longo do tempo, mas
cada preço é de apenas um produto.
Atividade Trabalho em dupla
Parte 1
www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218
21
1
Parte 1
www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218
22
Faça tabelas, com instâncias dos atributos para verificar se a modelagem está
correta.
CL
IEN
TE
PR
OD
UT
O
EN
TR
EG
AD
OR
Parte 1
www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218
23
1PRECO
PEDIDO
ITEM
Parte 1
www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218
24
O Modelo Físico já traz detalhes da implementação física desses dados no
SGBD escolhido, tais como o tipo de dado, seu tamanho e domínio.
Domínio – são os possíveis valores de um atributo. Por exemplo: o atributo
alturaaluno tem como domínio os valores de 0 a 3 metros. Para garantir que o atributo
tenha os valores definidos no Domínio escrevemos restrições (constraints), por
exemplo: alturaaluno> 0 andalturaaluno< 3
O nome da Entidade e de seus atributos deve seguir as regras de nomeação
do SGBD, não podendo ter espaço em branco, letras acentuadas, hífem e cedilha em
sua formação.
Segue abaixo o modelo físico da entidade Produto:
Produto
ATRIBUTO TIPO UNICIDADE PREENCHIMENTO RESTRICAO
CODPROD CHAR(4) UNIQUE NOT NULL
DESCPROD VARCHAR(40) NOT NULL
PRECOVENDA DECIMAL (8,2) > 0
QTDEESTOQUE SMALLINT >= 0
Teoria modelo físico de dados
Físico?
É comigo
Mesmo!
Parte 1
www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218
25
1
Um Lava-Rápido precisa de um DER para
organizar seus dados. Foram identificadas as seguintes
entidades e atributos básicos:
Ordem de Serviço – Número OS, Data e hora OS
Veículo – Placa veículo, modelo veículo, Cor veículo, Ano veículo
Cliente – Código Cliente, Nome Cliente, Endereço Cliente, Telefone Cliente
Serviço – Código Serviço, Descrição Serviço
Funcionário – Código Funcionário, Nome Funcionário
Tabela de Preço – Número Preço, Data Início Preço, Preço
Fotografia do Veículo– Número da Fotografia, Data Fotografia, Imagem
Fotografia
As seguintes regras devem ser observadas:
Um cliente pode solicitar muitas OS, mas cada OS é de apenas 1 cliente.
Uma OS atua sobre apenas um veículo, mas um veículo pode ter muitas OS.
Uma OS pode executar muitos serviços e um serviço pode ser solicitado por
muitas OS.
Um funcionário participa de muitas OS e uma OS pode ter a participação de
muitos funcionários.
Um serviço pode ter seu preço alterado várias vezes ao longo do tempo, mas
cada preço é de apenas um serviço.
Um veículo pode ter nenhuma ou uma fotografia, mas uma fotografia exibe
apenas um veículo.
Practice
Atividade Trabalho em dupla
Parte 1
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
27
1
Um Lava-Rápido precisa de um MER para
organizar seus dados. Foram identificadas as seguintes
entidades e atributos básicos:
Ordem de Serviço – Número OS, Data e hora OS
Veículo – Placa veículo, modelo veículo, Cor veículo, Ano veículo
Cliente – Código Cliente, Nome Cliente, Endereço Cliente, Telefone Cliente
Serviço – Código Serviço, Descrição Serviço
Funcionário – Código Funcionário, Nome Funcionário
Tabela de Preço – Número Preço, Data Início Preço, Preço
Fotografia do Veículo– Número da Fotografia, Data Fotografia, Imagem
Fotografia
As seguintes regras devem ser observadas:
Um cliente pode solicitar muitas OS, mas cada OS é de apenas 1 cliente.
Uma OS atua sobre apenas um veículo, mas um veículo pode ter muitas OS.
Uma OS pode executar muitos serviços e um serviço pode ser solicitado por
muitas OS.
Um funcionário participa de muitas OS e uma OS pode ter a participação de
muitos funcionários.
Um serviço pode ter seu preço alterado várias vezes ao longo do tempo, mas
cada preço é de apenas um serviço.
Um veículo pode ter nenhuma ou uma fotografia, mas uma fotografia exibe
apenas um veículo.
Atividade Trabalho em dupla
Parte 1
www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218
28
Vai
um
M
ER a
í?
Parte 1
www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218
29
1Faça tabelas, com instâncias dos atributos para verificar se a modelagem está
correta.
VEICULO
CLIENTE
SERVICO
FUNCIONARIO
OS
Parte 1
www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218
30
FUNCOS
SERVOS
PRECO
TÁ MEIO
APERTADO!
Parte 1
www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218
31
1
Dado o DER abaixo, representando a camada de
dados de um sistema de informação de uma loja de som
automotivo, referente a uma loja que vende e/ou instala
som automotivo, fazer o MER. Determine as chaves
primárias, estrangeiras e se necessário, represente as
entidades associativas.
Performance
Atividade Trabalho em dupla
tabforpag tabvendaPaga1 N
N 1
N:N
Gera tabclienteN
1
1
1
N:1
tabprodutotabfornectabservico
vende
Fornece
Vende
1 N
N 1
N:NN:N
1 N
N 1
1
N
N
1
N:N
Parte 1
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
33
1Faça tabelas, com instâncias dos atributos para verificar se a modelagem está
correta.
TABCLIENTE
TABSERVICO
TABPRODUTO
TABFORNEC
TABFORPAG
Parte 1
www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218
34
TABVENDA
TABPAGAMENTO
TABFORNECIMENTO
TABPRODVENDIDO
TABSERVVENDIDO
Parte 1
www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218
35
1
Parte 1
www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218
36
Avaliação Então...Como foi ?!?
Estou fera!
Fiz Certo!
Muito Bom Bom regular ruim Muito ruim
Parte
Matemático britânico, esteve envolvido com o trabalho deCodd no desenvolvimento do modelo relacional. Seu livro“Introdução a Sistemas de Banco de Dados” é amplamentereconhecido como texto fundamental para a área.
Christopher J. Date 1941 – (72)
Versão 2.2.3a
Parte 2
www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218
3
2
Antes de iniciarmos, vamos conversar sobre os tópicos apresentados na capa desta parte. Isso é importante para que seu instrutor e seus colegas saibam como está seu conhecimento sobre o assunto e se você precisa ou pode fornecer ajuda aos colegas e instrutor.
O que você já sabe?
O que você não sabe?
Porque é importante conhecer estes tópicos?
Quais são os seus temores?
O que você considera difícil?
Depois de falar sobre o assunto com seus colegas e instrutor, escreva,
desenhe, rabisque, diga algo sobre o que você vai fazer para dominar esses tópicos.Comprometa-se!
Preparation
Trocando Ideias É agora que você fala !!
Reflexão É aqui que você se compromete !!
Parte 2
www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218
4
Existe outra forma de modelar os dados, é só seguir as NORMAS. Codd, Date
e Boyce contribuíram muito para o desenvolvimento de um conjunto de regras que
auxiliam na modelagem.
O objetivo primeiro da modelagem é a economia de disco, evitando a
redundância dos dados, mas atualmente com o preço do Gigabyte abaixo de R$ 0,10
e usuários cada vez mais impacientes, o foco mudou para performance.
Mesmo assim, é fundamental saber modelar usando essas regras para depois,
racionalmente, colocar redundância de dados, objetivando uma maior performance.
A XPTO consultoria em desenvolvimento de software conta com você para
perpetuar sua fama de ter os modelos de dados mais bem equilibrados entre
economia e performance.
Presentation
História Normas e mais normas
Parte 2
www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218
5
2
Após o levantamento dos dados (atributos) que darão suporte aos negócios de
um empreendimento é preciso organizá-los em entidades e relacioná-las entre si.
Para que se evite ao máximo a redundância de dados, ou seja, ter os mesmos
dados repetidos em várias entidades, foi elaborado por Edgar Frank Codd (matemático
britânico) um conjunto de regras, que passou a ser conhecido como Normalização,
que uma vez seguidas, eliminam essa redundância de dados.
A motivação para a criação da Normalização foi a baixa capacidade de
armazenamento das primeiras unidades de disco, como mostra a figura abaixo.
Esse conjunto de regras é denominado Formas Normais. Embora existam 7
formas normais, na maioria dos casos apenas as 3 primeiras, propostas originalmente
por Codd em 1970 são usadas.
Teoria Normalização
Disco IBM 350Apresentado em 13/09/1956
Pilha de 40 discos de 24 polegadas
Capacidade 4,4 Megabytes
Aluguel de US$ 35.000,00
Edgar Frank Codd 23/08/1923 18/04/2003
Parte 2
www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218
6
Para aplicarmos as formas normais, precisamos de um agrupamento de dados
não normalizado. Como exemplo, vamos pegar alguns dados (atributos) de uma Nota
Fiscal, colocá-las em uma tabela e definir instâncias para as linhas (tuplas).
Neste exemplo, temos uma entidade com
18 atributos, trata-se de uma Nota Fiscal (com
dados básicos) onde foram vendidos 3 produtos
para um mesmo Cliente e transportados pela
mesma Transportadora. Agora vamos aplicar as
regras de normalização à esse agrupamento de
dados não normalizado.
Eu sou a Norma!
Tenho algumas
normas para
você...
TUPLA ?
Você não
quis dizer
SUPLA !
Atributos Instância 1 Instância 2 Instância 3
Número NF 1025 1025 1025
Data Emissão NF 25/10/2009 25/10/2009 25/10/2009
CNPJ Cliente 09.154.125/0001-10 09.154.125/0001-10 09.154.125/0001-10
Razão Social Cliente Chamex Inc Paper Chamex Inc Paper Chamex Inc Paper
Endereço Cliente Rua Davila, 34 - Centro - SP Rua Davila, 34 - Centro - SP Rua Davila, 34 - Centro - SP
Telefone Cliente 11-3221-8844 11-3221-8844 11-3221-8844
CNPJ Transportadora 07.458.478/0001-58 07.458.478/0001-58 07.458.478/0001-58
Razão Social Transportadora Zaz Traz Transportes Zaz Traz Transportes Zaz Traz Transportes
Endereço Transportadora Av. Angela, 22 - Centro - SBC Av. Angela, 22 - Centro - SBC Av. Angela, 22 - Centro - SBC
Telefone Transportadora 11-4432-8844 11-4432-8844 11-4432-8844
Número Item NF 1 2 3
Codigo Produto 1232 3221 8776
Descrição Produto Scanner HP Super Computador Básico Impressora Jato Tinta HP
Preço Unitário Produto 450,13 1250,21 333,13
Qtd. Estoque 200 80 127
Qtd. Item NF 5 12 3
Valor total do Item NF 2250,65 15002,52 999,39
Valor total da NF 18252,56 18252,56 18252,56
Parte 2
www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218
7
2
Um agrupamento de dados está na 1FN se não possuir dados em
repetição (ocorrência).
Observe que no exemplo acima, os dados em destaque (cinza) são digitados
repetidamente, para cada novo item da Nota Fiscal. Para que fiquem na 1FN, será
necessário dividir o agrupamento de dados em duas entidades, Nota Fiscal e Item
Nota Fiscal, como mostra a tabela abaixo:
Foram definidas as chaves primárias e estrangeiras das entidades e os dados
da Nota Fiscal agora só aparecem uma vez, pois estão relacionados pela chave
estrangeira Numero NF na entidade Item Nota Fiscal.
TeoriaPrimeira formanormal (1fn)
“Uma relação de variáveis está
em 1FN, se e somente se, em
todo valor válido dessa relação
de variáveis, cada tupla contém
exatamente um valor para cada
atributo”
C. J. Date
Nota Fiscal
Número NF (PK) 1025
Data Emissão NF 25/10/2009
CNPJ Cliente 09.154.125/0001-10
Razão Social Cliente Chamex Inc Paper
Endereço Cliente Rua Davila, 34 - Centro - SP
Telefone Cliente 11-3221-8844
CNPJ Transportadora 07.458.478/0001-58
Razão Social Transportadora Zaz Traz Transportes
Endereço Transportadora Av. Angela, 22 - Centro - SBC
Telefone Transportadora 11-4432-8844
Valor total da NF 18252,56
Item Nota Fiscal
Número Item NF (PK) 1 2 3
Número NF (FK) 1025 1025 1025
Codigo Produto 1232 3221 8776
Descrição Produto Scanner HP Super Computador Básico Impressora Jato Tinta HP
Preço Unitário Produto 450,13 1250,21 333,13
Qtd. Estoque 200 80 127
Qtd. Item NF 5 12 3
Valor total do Item NF 2250,65 15002,52 999,39
Norma
número um!
Parte 2
www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218
8
Um agrupamento de dados está na 2FN se estiver na 1FN e todo atributo
não chave depender funcionalmente da chave primária.
O atributo B depende funcionalmente do atributo A, indica-se AB, se quando
se muda o valor de A, também muda o valor de B. Por exemplo, A Descrição do
Produto depende funcionalmente do Código do Produto, pois toda vez que o Código
do Produto muda, muda também a Descrição do Produto, pois se trata de outro
Produto.
Vamos analisar essas duas entidades e colocar setas a partir dos atributos não
chave em direção ao atributo que dependam funcionalmente.
Teoriasegunda formanormal (2fn)
Nota Fiscal
Número NF (PK) 1025
Data Emissão NF 25/10/2009
CNPJ Cliente 09.154.125/0001-10
Razão Social Cliente Chamex Inc Paper
Endereço Cliente Rua Davila, 34 - Centro - SP
Telefone Cliente 11-3221-8844
CNPJ Transportadora 07.458.478/0001-58
Razão Social Transportadora Zaz Traz Transportes
Endereço Transportadora Av. Angela, 22 - Centro - SBC
Telefone Transportadora 11-4432-8844
Valor total da NF 18252,56
Item Nota Fiscal
Número Item NF (PK) 1
Número NF (FK) 1025
Codigo Produto 1232
Descrição Produto Scanner HP Super
Preço Unitário Produto 450,13
Qtd. Estoque 200
Qtd. Item NF 5
Valor total do Item NF 2250,65
Parte 2
www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218
9
2
Norma
número dois!
Foram localizados atributos que dependem funcionalmente de outros atributos
não chaves. Esses atributos não chave irão formar outras entidades. O atributo da
qual eles dependem funcionalmente será a chave primária dessa nova entidade e
chave estrangeirana entidade original. As novas entidades criadas são Cliente,
Transportadora e Produto. Após a aplicação da 2FN temos:
“Uma relação de variáveis está
em 2FN, se e somente se, está
em 1FN e todo atributo não
chave é irredutivelmente
dependente da chave primária”
C. J. Date
Nota Fiscal
Número NF (PK) 1025
Data Emissão NF 25/10/2009
CNPJ Cliente (FK) 09.154.125/0001-10
CNPJ Transportadora (FK) 07.458.478/0001-58
Valor total da NF 18252,56
Item Nota Fiscal
Número Item NF (PK) 1 2 3
Número NF (FK) 1025 1025 1025
Codigo Produto (FK) 1232 3221 8776
Qtd. Item NF 5 12 3
Valor total do Item NF 2250,65 15002,52 3075,00
Parte 2
www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218
10
Um agrupamento de dados está na 3FN se estiver na 2FN e os atributos
que não são chave não podem depender de forma transitiva de outro atributo
que também não é chave.
O atributo Valor total do Item NF é calculado como sendo o produto entre os
atributos Qtd. Item NF e Preço Unitário Produto. Temos um atributo não chave que
depende do conteúdo de outros atributos não chave. Para que o agrupamento de
dados fique na 3FN o atributo Valor total do Item NF deve ser eliminado.
A mesma regra se aplica ao atributo Valor total da NF, que é a soma dos totais
dos itens da nota fiscal. Esse atributo também deve ser eliminado. Finalmente,
utilizando a notação do MER, temos:
Teoriaterceira formanormal (3fn)
“Uma relação de variáveis está
em 3FN, se e somente se, está
em 2FN e todo atributo não
chave é dependente de forma não
transitiva da chave primária”
C. J. Date
Cliente
CNPJ Cliente (PK)
Razão Social Cliente
Endereço Cliente
Telefone Cliente
Nota Fiscal
Número NF (PK)
Data Emissão NF
CNPJ Cliente (FK)
CNPJ Transportadora (FK)
Item Nota Fiscal
Número Item NF (PK)
Número NF (FK)
Codigo Produto (FK)
Qtd. Item NF
Transportadora
CNPJ Transportadora (PK)
Razão Social Transportadora
Endereço Transportadora
Telefone Transportadora
Produto
Codigo Produto (PK)
Descrição Produto
Preço Unitário Produto
Qtd. Estoque
E essa
é a Norma
número três!
Parte 2
www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218
11
2
O objetivo primeiro da Normalização é a economia de espaço em disco. Isso é
obtido com a criação de mais entidades e o uso abundante de entidades associativas.
O problema da Normalização Extrema é que para se obter informações dos
modelos de dados, é necessário buscar esses dados em diversas entidades o que
impacta a performance das consultas.
Nos últimos anos, temos visto uma crescente diminuição de custo dos
dispositivos de armazenamento de massa (HDs, SSDs, etc), e também um crescente
aumento na velocidade com que o usuário quer o resultado de sua consulta, o que nos
faz refletir sobre até onde vale a pena Normalizar, e o que vale a pena redundar.
A figura abaixo mostra que é necessário encontrar um ponto de equilíbrio entre
a Normalização extrema e a redundância total. Este ponto de equilíbrio varia em cada
caso, cabendo ao analista de sistemas e o DBA localizá-lo.
Teoria O impacto da normalização
Economia
do espaco
em discoGanho de
Performance
Normalizar
Desnormalizar
,
Parte 2
www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218
12
Normalizar os agrupamentos de dados abaixo,
desenhando um MER com as entidades, relacionamentos,
atributos e chaves.
1) Ordem de Compra (código ordem de compra, data de emissão, código do fornecedor, nome do fornecedor, endereço do fornecedor, valor total da ordem). Cada ordem de compra possui um ou vários itens com os seguintes atributos: número item de compra, código do material, descrição do material, quantidade comprada, valor unitário e valor total do item.
Practice
Atividade Trabalho em dupla
Parte 2
www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218
13
2
2) Empregado (Número do Empregado, Nome do Empregado, Número do Departamento, Nome do Departamento, Número do Gerente, Nome do Gerente, Número do Projeto, Nome do Projeto, Data de Início do Projeto, Data de Término do Projeto, Número de horas trabalhadas no projeto). Vale a pena notar que o gerente é um empregado.
Parte 2
www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218
14
Normalizar os agrupamentos de dados abaixo,
desenhando um MER com as entidades,
relacionamentos, atributos e chaves, depois peça para
que seu colega corrija.
3) Notas Fiscais (Número NF, Série, Data emissão, Código Cliente, Nome cliente, Endereço cliente, CNPJ cliente, Código Mercadoria, Descrição Mercadoria, Quantidade vendida, Preço de venda, Total da venda da Mercadoria e Total Geral da Nota). Cada nota pode ter mais do que uma mercadoria. O número da nota fiscal recomeça em 1 para cada série da nota fiscal.
Atividade Revisão aos pares
Parte 2
www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218
15
2
4) Inscrição (Código do Aluno, Nome do Aluno, Telefone para contato, Ano de Admissão no curso, Código da Disciplina, Nome da Disciplina, Código do Curso, Nome do Curso, Data da Matricula na Disciplina). O aluno escolhe qual disciplina, pertencente ao curso, quer cursar.
Parte 2
www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218
16
Normalizar os agrupamentos de dados abaixo,
desenhando um MER com as entidades, relacionamentos,
atributos e chaves, utilize um flip-chart, apresente aos
colegas e anote o melhor entre eles.
5) Paciente (número do paciente, nome do paciente, número do quarto, descrição do quarto, número de cômodos no quarto, número da cama). Médico (código do médico, nome do médico, fone do médico).
Atividade Flip chart
Parte 2
www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218
17
2
A biblioteca de uma universidade empresta livros
para seus alunos regularmente matriculados. Foram
coletadas as seguintes informações com a bibliotecária.
1 livro tem 1 ou N autores
1 autor pode escrever 1 ou N livros
1 assunto pode aparecer em 1 ou muitos livros
1 livro pode ter 1 ou N exemplares
1 exemplar é sempre de 1 livro
Os exemplares são emprestados aos alunos. Cada exemplar possui um
número de identificação único, chamado TOMBO
O prazo de empréstimo é sempre de uma semana, podendo ser renovado,
desde que o livro não esteja reservado por outro aluno
Um aluno pode reservar 1 ou N livros
Para cada dia de atraso na devolução de um exemplar é cobrada uma multa de
um determinado valor
Alunos em atraso não podem pegar novos empréstimos
Fazer um MER para atender as necessidades desse sistema
Performance
Atividade Trabalho em dupla
Parte 2
www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218
18
Lembre-se
Das três
Normas
Parte 2
www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218
19
2
Parte 2
www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218
20
Avaliação Então...Como foi ?!?
Estou fera!
Fiz Certo!
Muito Bom Bom regular ruim Muito ruim
Parte
O nome DB2 foi dado para o Sistema de Gerenciamentode Banco de Dados que a IBM lançou em 1983 baseado emSQL/DS para seu mainframe. A principio o produto foichamado System R que fora iniciado em 1978. O projeto DB2
começou no inicio dos anos 70 quando Edgar Frank Codd,trabalhando para IBM descreveu a teoria dos Banco de dadosRelacionais e publicou sua teoria em Junho de 1970.
Versão 2.2.3a
Parte 3
www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218
3
3
Antes de iniciarmos, vamos conversar sobre os tópicos apresentados na capa desta parte. Isso é importante para que seu instrutor e seus colegas saibam como está seu conhecimento sobre o assunto e se você precisa ou pode fornecer ajuda aos colegas e instrutor.
O que você já sabe?
O que você não sabe?
Porque é importante conhecer estes tópicos?
Quais são os seus temores?
O que você considera difícil?
Depois de falar sobre o assunto com seus colegas e instrutor, escreva,
desenhe, rabisque, diga algo sobre o que você vai fazer para dominar esses tópicos.Comprometa-se!
Preparation
Trocando Ideias É agora que você fala !!
Reflexão É aqui que você se compromete !!
Parte 3
www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218
4
Vamos para a Parte Prática do nosso curso de COBOL Level 2. Você começará
a usar o DB2 a princípio de forma interativa, depois via programa COBOL.
Para poder usar o DB2 em seu Hércules, você precisará se logar no TSO
usando a Procedure IKJJANIN e na tela do OS/390, você precisará subir o DB2 com o
seguinte comando:
-DB2N START DB2
Pratique bastante não só aqui na Grande Porte, mas também no conforto de
seu lar. Lembre-se que a prática leva à perfeição.
Consegue ver
o hífen do início?
Presentation
História Mão na massa!!
Parte 3
www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218
5
3
O DB2 é um Sistema Gerenciador de Banco de Dados (SGBD) ou Data Base
Management System (DBMS) relacional da IBM. O DB2 é a nova tecnologia,
enquanto VSAM é a velha.
O VSAM (que é a sigla para Virtual Storage Access Method) é somente um
método de acesso à dados. Nele você pode ler um arquivo VSAM no método
sequencial (sequential mode) registro por registro, fazer acesso randômico (random
access), saltar (pular) diretamente para um registro em particular. O Skip-sequential
(salto-sequencial) é o melhor dos dois mundos, você pula para o 1º registro desejado,
e então comeca a leitura sequencial dos registros subsequentes um por um.
O DB2 é um pacote de software completo, que permite criar, armazenar,
atualizar e recuperar dados de forma sistemática. Suas características são:
a) Abstração de dados. Ele apresenta uma visão lógica e estruturada dos
dados para o usuário. O usuário não precisa se preocupar sobre os detalhes de
como os dados estão fisicamente armazenados no disco (DASD).
b) Independência dos dados. O DB2 provê uma camada de
independência entre a aplicação ou programa COBOL e os dados. Toda vez que a
estrutura dos dados muda (como adicionar uma nova coluna na tabela
Empregado) você não precisa reescrever o programa COBOL. Essa
independência dos dados é conhecida como arquitetura em duas camadas
(TwoTiers).
c) Segurança dos dados. O DB2 controla o acesso aos dados. Nem todo
mundo pode ver todos os dados. Você pode vê-los somente se obter todos os
privilégios necessários.
d) Gerenciamento de transações e concorrência. O DB2 gerencia todas
as transações e garante que os dados permaneçam consistentes. Ele provê um
mecanismo de travamento, para acesso concorrente aos dados, ou seja, enquanto
uma transação está usando um determinado dado, nenhuma outra tem acesso a
ele.
e) Recuperação de dados. Quando ocorrem “crashes” (erros físicos no
disco) o DB2 permite que você recupere e restaure rapidamente os dados originais.
Teoria Introdução ao db2
Parte 3
www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218
6
STORAGE GROUP (Grupo de Armazenamento)
É um conjunto de volumes (discos) que o DB2 utiliza para criar os Tablespaces
e os Índices. Os discos devem ter o mesmo DeviceType (3390). Fisicamente o DB2
utiliza arquivos VSAM. O DB2 fica responsável pelo gerenciamento do espaço alocado.
Ele é quem emite os comandos de DELETE/DEFINE CLUSTER. Os discos de um
STORAGE GROUP novo precisam ser dedicados ao DB2.
DATA BASE (Banco de Dados)
É um conjunto de Tablespaces, agrupados segundo critérios do DBA, por uma
questão de organização.
TABLESPACE (Espaço de Tabela)
É um Dataset físico VSAM LDS (Linear Data Set) que armazena linhas de uma
ou mais tabelas. Cada Tablespace consiste de um número de páginas. Suas páginas
podem ter o tamanho de 4K, 8K, 16K ou 32K. Uma linha de tabela precisa estar toda
em uma página. O tamanho da página é o limite para o tamanho de uma linha. Há 3
tipos de Tablespace:
a) Simples: As páginas de seus Datasets podem conter dados de uma ou mais
tabelas.
b) Segmentado: É dividido em segmentos (conjuntos de páginas) cada segmento
só pode conter dados de uma tabela. É a utilização recomendada pois permite
ao DB2 uma utilização melhor de espaço.
c) Particionado: Recomendado para tabelas gigantes. É dividido em partições
(Datasets VSAM). Requer um Índice Cluster com uma faixa de valores
estabelecidos para cada partição. O DB2 se baseia nesta faixa para saber em
qual partição gravar uma linha.
INDEXSPACE (Espaço de Índice)
Um indexspace é uma estrutura de armazenamento do DB2 que contém
apenas um índice. Quando você cria um índice, um indexspace é definido
automaticamente no mesmo data base da tabela que ele indexa.
Teoria Elementos do db2
Parte 3
www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218
7
3
TABELAS
As TABELAS são estruturas lógicas mantidas pelo DB2 para representar uma
ENTIDADE. É formada por um conjunto de colunas. Exemplo:
Tabela FUNCIONARIOS
COLUNAS
As COLUNAS são os ATRIBUTOS da ENTIDADE. Nelas estão armazenados
os dados (instâncias) da ENTIDADE. O nome e o formato das colunas são mantidos
pelo DB2.
Tabela FUNCIONARIOS
Colunas
CODIGO
NOME
ENDERECO
DATAADMISSAO
SALARIO
LINHA
Uma LINHA é cada conjunto de valores das COLUNAS. Formam uma instância
da ENTIDADE. Exemplo:
Tabela FUNCIONARIOS
Colunas CODIGO NOME ENDERECO DATAADMISSAO SALARIO
Linha 1 000010 PEDRO ALVARES CABRAL RUA DAS FLORES, 117 01/10/2001 5600.00
Linha 2 000023 MARIA ANTONIETA RUA GUILHOTINA, 21 30/05/1987 4300.00
ÍNDICES
É uma lista ordenada de valores que apontam para os dados nas tabelas. É
utilizada para agilizar a leitura dos dados, pois realiza busca binária. Também pode ser
usada para forçar a unicidade dos dados (UNIQUE INDEX). Pode ser formado por
uma (simples) ou mais colunas (composto). Está armazenado em um VSAM LDS
conhecido como INDEXSPACE. Há 3 tipos de índices:
a) Unique: Força a unicidade dos dados
b) Normal: Permite a duplicidade dos dados
c) Cluster: Usado para manter a sequência física dos dados na Tablespace.
VIEW
É uma tabela virtual, formada por um subconjunto de uma ou mais tabelas, sua
utilização, em principio nada difere de uma tabela normal. Conforme o caso uma view
pode ser usada somente de leitura.
Parte 3
www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218
8
SINÔNIMO
É um nome alternativo (apelido) para uma Tabela ou View. Uma vez criado,
sua utilização é restrita a um Auth-id.(Proprietário ou usuário).
ÁLIAS
É um nome alternativo (apelido) para uma Tabela ou View. Utilizado mais como
um nome local de uma tabela remota. Seu uso é compartilhado.
Todos esses conceitos podem ser vistos na figura abaixo:
INDEX 4
TABELA1
TABELA2
TABLESPACE A
TABELA3
TABLESPACE B
INDEX 1
INDEX 2
INDEX 3
INDEX 4
INDEX 2
INDEX 1
VIEW A
VIEW B
ÁLIAS
SINÔNIMO
VOLUME 1
VOLUME 2
VOLUME 3
TABLESPACE A
TABLESPACE B
STORAGE GROUP
INDEX 3
DATABASE X
INDEXSPACE 1
INDEXSPACE 2
INDEXSPACE 3
INDEXSPACE 4
Igualzinho
Lá em casa!
Parte 3
www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218
9
3
É uma coluna ou conjunto de colunas selecionadas para identificar as linhas da
tabela. As chaves podem identificar linhas dentro da própria tabela ou linhas de outra
tabela (Foreign Keys).
O DB2 aceita os seguintes tipos de KEYs:
UNIQUE KEY
Chave que identifica de maneira unívoca uma linha da tabela. Não existe mais
de uma linha da tabela com a mesma UNIQUE KEY. A UNIQUE KEY tem as seguintes
propriedades:
deve ser não vazia (NOT NULL).
deve possuir um índice único (UNIQUE INDEX).
podem ocorrer nenhuma, uma ou muitas vezes na tabela.
PRIMARY KEY
Chave única escolhida para identificar univocamente cada linha da tabela. A
PRIMARY KEY tem as seguintes propriedades:
deve ser uma UNIQUE KEY.
pode ser formada por mais de uma coluna da tabela (chave primária composta).
podem ocorrer nenhuma ou uma vez na tabela (não é obrigatória)
PARENT KEY
É uma PRIMARY KEY ou UNIQUE KEY de uma TABELA PAI (tabela PAI é a
tabela da posição 1 na relação 1:N do MER). O valor da PARENT KEY será replicado
nas FOREIGN KEY(chave estrangeira) das tabelas relacionadas (lado N na relação
1:N).
FOREIGN KEY
É uma KEY em uma TABELA RELACIONADA (lado N na relação 1:N do MER)
que identifica uma linha da TABELA PAI. As propriedades da FOREIGN KEY são:
podem ocorrer nenhuma, uma ou muitas vezes na tabela.
podem ter conteúdo vazio (NULL) – dependendo da regra de integridade
referencial.
Teoria Tipos de chaves
Parte 3
www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218
10
O DB2 possui algumas regras de validação de seus dados que são definidos
no momento da definição de suas tabelas. Estas validações independem dos
programas que atualizam o banco de dados, e são executadas automaticamente
quando se incluem, alteram ou excluem dados das tabelas. As regras de integridade
são:
UNICIDADE.
É a regra usada para definir UNIQUE KEYS. Esta regra define que uma ou
mais colunas (KEYS), da tabela não podem repetir valores.
INTEGRIDADE DE VALORES (CHECK CONSTRAINTS)
Esta regra define valores permitidos para colunas de uma tabela.
INTEGRIDADE REFERENCIAL
A INTEGRIDADE REFERENCIAL define a validade de uma FOREIGN KEY. Se
uma FOREIGN KEY não contém NULL, seu valor deve ser o da PARENT KEY da
TABELA PAI. A INTEGRIDADE REFERENCIAL deve ser definida na criação da tabela.
O DB2 testa a INTEGRIDADE REFERENCIAL nos comandos de inclusão
(INSERT), alteração (UPDATE) e exclusão (DELETE) dos programas conforme
abaixo:
a) INTEGRIDADE NA INCLUSÃO.
Se uma linha tiver uma coluna FOREIGN KEY com valor NOT NULL, deve
haver uma linha na PARENT TABLE com este valor na PARENT KEY.
b) INTEGRIDADE NA ALTERAÇÃO.
Se houver alteração em uma FOREIGN KEY, deve haver na PARENT TABLE
uma PARENT KEY com o novo valor da FOREIGN KEY.
Teoria Regras de Integridade
Parte 3
www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218
11
3
c) INTEGRIDADE NA EXCLUSÃO.
A exclusão de linhas com FOREIGN KEY não tem restrição, mas se uma linha
tiver uma coluna com PARENT KEY, uma das 3 regras de exclusão abaixo deve ser
definida na criação da tabela:
RESTRICT – a exclusão não será efetuada se houver uma TABELA DEPENDENTE com uma FOREIGN KEY com este valor.
CASCADE – O DB2 fará a exclusão automática de todas as linhas das TABELAS DEPENDENTES com este valor na FOREIGN KEY. Se estas exclusões tiverem sucesso, a linha da PARENT TABLE será excluída.
SET NULL – As FOREIGN KEY nas TABELAS DEPENDENTES serão alteradas para NULL.
Parte 3
www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218
12
Os formatos dos dados nas colunas de uma tabela DB2 se dividem em 3
grandes grupos:
STRING
NUMERIC
DATETIME
FORMATO STRING
É o formato para armazenar caracteres. São eles:
CHAR
Define colunas de caracteres com tamanho fixo com até 255 caracteres.
Exemplo:
CODCLI CHAR(6)
VARCHAR
Define colunas de caracteres com tamanho variável. Podem conter até 32.704
caracteres, mas tamanhos acima de 255 tem restrições em alguns comandos SQL.
Exemplo:
NOMECLI VARCHAR(50)
Teoria Tipos de dados
Parte 3
www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218
13
3
FORMATOS NUMÉRICOS
INTEGER
Define colunas para conter números inteiros usando 31 bits mais sinal. Uma
coluna INTEGER pode conter valores na faixa de –2.147.483.648 até +2.147.483.647.
Exemplo:
QUANTIDADE INTEGER
SMALLINT
Define colunas para conter números inteiros usando 15 bits mais sinal. Uma
coluna SMALLINT pode conter valores na faixa de –32.768 até +32.767. Exemplo:
IDADE SMALLINT
DECIMAL
O tipo DECIMAL define colunas com números reais (contendo parte inteira e
decimal). O DB2 aceita colunas DECIMAL com até 31 algarismos. Exemplo: Para
definir a coluna PRECO para 6 algarismos inteiros e 2 decimais (valores até
999999,99). Exemplo:
PRECO DECIMAL(8,2)
REAL
O tipo REAL define colunas com números no formato PONTO FLUTUANTE de
simples precisão. O DB2 usa 32 bits para este formato, e consegue controlar valores
na seguinte faixa:
Exemplo:
PESO REAL
-3,402 x 1038 -1,175 x 10-37 1,175 x 10-37 3,402 x 10380
Parte 3
www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218
14
DOUBLE
O tipo DOUBLE define colunas com números no formato PONTO FLUTUANTE
de dupla precisão. O DB2 usa 64 bits para este formato, e consegue controlar valores
na seguinte faixa:
Exemplo:
MEDIDA DOUBLE
Com tantos formatos numéricos, podemos seguir os seguintes critérios para
definir o melhor tipo de dado:
a) Faixa de valores requerido
b) Tipo de composição necessária para os processamentos
c) Comparação entre números de tipos diferentes implica em
overhead necessário para a conversão e riscos maiores devido a
erros induzidos por arredondamento.
-1,79769 x 10308 -2,225 x 10-307 2,225 x 10-307 1,79769 x 103080
Vou criar meu
próprio
formato de
dado numérico.
Ops...
Parte 3
www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218
15
3
FORMATOS DATETIME
Os formatos DATETIME definem formatos para armazenar datas e horas. Os
valores no formato DATETIME podem fazer parte de expressões aritméticas, isto é,
pode-se somar e subtrair duas variáveis com formato DATETIME. São 3 os tipos de
formato DATETIME:
DATE
O tipo DATE define uma coluna com datas. O formato interno é um formato
binário próprio do DB2, mas o conteúdo da coluna conterá DIA, MES e ANO de uma
data. Exemplo:
DATANASCIMENTO DATE
TIME
O tipo TIME define uma coluna com o horário. O formato interno é um formato
binário próprio do DB2, mas o conteúdo da coluna conterá HORA, MINUTO e
SEGUNDOS.Exemplo:
HORAPARTIDA TIME
TIMESTAMP
O tipo TIMESTAMP define uma coluna com a data e hora do dia com precisão
até microssegundos. O formato interno é um formato binário próprio do DB2, mas a
coluna conterá ANO, MES, DIA, HORA, MINUTO, SEGUNDOS e
MICROSSEGUNDOS. Exemplo:
DATACRIACAO TIMESTAMP
Parte 3
www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218
16
No DB2 as constantes alfanuméricas devem ser colocadas entre
APÓSTROFES. Exemplo:
‘JOAQUIM JOSE DA SILVA XAVIER’
As constantes numéricas são escritas sem os apóstrofes. As constantes com
decimais devem usar o ponto para separar as decimais. Exemplo:
3.14159
As constantes de DATA e HORA devem ser escritas no formato do exemplo
abaixo, entre apóstrofes. Exemplo:
‘10/30/2010’ MM/DD/AAAA formato USA
‘2010-10-30’ AAAA-MM-DD formato ISO
’30.10.2010’ DD.MM.AAAA formato EUR
‘16:35:15’ HH:MM:SS
SPECIAL REGISTERS (registradores especiais) são variáveis internas do DB2
com informações do ambiente que os programas podem acessar e usar. A lista é
extensa, e apresentamos abaixo uma relação com as mais usadas:
CURRENT DATE Data do sistema operacional no formato DATE
CURRENT TIME Data do sistema operacional no formato TIME
CURRENT TIMESTAMP TIMESTAMP do sistema operacional no formato TIMESTAMP
USER Usuário do sistema no formato CHAR(8)
Teoria constantes
Teoria Special registers
Parte 3
www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218
17
3
Associe as características do DB2 com suas definições
a) Abstração de dados
b) Independência dos dados
c) Segurança dos dados
d) Gerenciamento de transações e concorrência
e) Recuperação de dados
(XXXX) O DB2 controla o acesso aos dados. Nem todo mundo pode ver os dados.
Você pode vê-los somente se obter todos os privilégios necessários.
(XXXX) O DB2 prove uma camada de independência entre a aplicação ou programa
COBOL e os dados. Toda vez que a estrutura dos dados muda (como adicionar uma
nova coluna na tabela Empregado) você não precisa reescrever o programa COBOL.
Essa independência dos dados é conhecida como arquitetura em duas camadas
(TwoTiers).
(XXXX) Quando ocorrem “Crashes” (erros físicos no sistema) o DB2 permite que você
recupere e restaure rapidamente os dados originais.
(XXXX) O DB2 gerencia todas as transações e garante que os dados permaneçam
consistentes. Ele provê um mecanismo de travamento, para acesso concorrente aos
dados, ou seja, enquanto uma transação está usando um determinado dado, nenhuma
outra tem acesso a ele.
(XXXX) Ele apresenta uma visão lógica e estruturada dos dados para o usuário. O
usuário não precisa se preocupar sobre os detalhes de como os dados estão
fisicamente armazenados no disco (DASD).
Practice
Atividade Revisão aos pares
Parte 3
www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218
18
Associe os elementos do DB2 com o resumo se
suas definições.
a) StorageGroup
b) Data Base
c) Tablespace
d) Tabelas
e) Colunas
f) Linha
g) Índice
h) View
i) Sinônimo
j) Alias
(XXXX) É um nome alternativo para uma tabela ou View. Seu uso é compartilhado.
(XXXX) É um subconjunto de uma ou mais tabelas. Sua utilização em principio nada
difere de uma tabela normal.
(XXXX) É um DATASET físico VSAM LDS (linear dataset) que armazena linhas de
uma ou mais tabelas. Pode ser Simples, Segmentada ou Particionada.
(XXXX) São os atributos da Entidade. Seus nomes e formatos são mantidos pelo DB2.
(XXXX) É um nome alternativo para uma Tabela ou View, com utilização restrita.
(XXXX) É um conjunto de valores das colunas, formam uma instância da entidade.
(XXXX) É um conjunto de Tablespaces e Índices, agrupados segundo critérios do DBA,
por uma questão de organização.
(XXXX) É um conjunto de volumes (Disco) que o DB2 utiliza para criar os Tablespaces
e os Índices.
(XXXX) São estruturas lógicas mantidas pelo DB2 para representar uma entidade.
(XXXX) É uma lista ordenada de valores que apontam para os dados nas Tabelas. É
usado para agilizar a leitura dos dados, pois realiza uma busca binária.
Atividade Revisão aos pares
Parte 3
www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218
19
3
Localize no quadro abaixo as palavras em vermelho.
O DB2 aceita uma grande variedade de tipos de dados,
tais como STRING, NUMERIC e DATETIME. Do primeiro tipo
temos CHAR e VARCHAR, cuja principal diferença é que CHAR
armazena sempre o tamanho máximo daSTRING com espaços
à direita e o VARCHAR só armazena a STRING informada
ignorando os espaços à direita. Do segundo tipo temos
INTEGER, SMALLINT, DECIMAL, REAL, DOUBLE. Apesar de
haver vários tipos numéricos com capacidades diferentes o mais usado é o DECIMAL,
pois permite ao desenvolvedor formatar o número (casas inteiras decimais) com total
precisão. Do terceiro tipo temos DATE, TIME e TIMESTAMP. Sempre que for
importante registrar o exato momento de um acontecimento (abertura de um
chamado,entrada e saída do estacionamento, início e término de uma chamada
telefônica, etc) usamos TIMESTAMP, pois ele registra o tempo completo (ano, mês,
dia, hora, minuto, segundo e microsegundo).
Atividade Caça-palavras
S U B T R A C T S E L E C T V A L U E
P E R F O R M U N T I L V A R C H A R
I N T O I N T E G E R O W I D H C O U
C L O S E I E I O U T P U T S A L P P
X C P G M C L S M A L L I N T R O E D
R O E E P A B T O E R E A D R E S N A
E M N P I L U X T Y S 2 B D I N P U T
A M U Z C L O A W R L T E O N A B S E
L A M I C E D A D D A X A M G C D I E
X S E T C O M P U T E W H M O V E N F
C O R R E S P O N D L N G W P 3 4 G G
T O I N P U T D A T E T I M E S D S T
O T C A N C E L E N V I R O N M E N T
Parte 3
www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218
20
Nomeie as chaves como UNIQUE KEY, PRIMARY KEY,
PARENT KEY ou FOREIGN KEY, preenchendo as linhas do M.E.R
abaixo.
Atividade Correndo contra o tempo
5 minutos
funcionario
codfuncnomefunccpffunccoddepto
departamento
coddeptonomedepto
chamado
numchamadodatahorachamadocodfunctextofunc
Parte 3
www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218
21
3Atividade Todos juntos
Dado o MER abaixo, atribua o melhor formato e
tamanho aos diversos atributos.
Performance
cnpjcliente (PK)
razaosocialcliente
enderecocliente
telefonecliente
cliente
cnpjtransportadora(PK)
razaosocialtransportadora
enderecotransportadora
telefonetransportadora
transportadora
numeroitemnf(PK)
numeronf(FK)
codigoproduto(FK)
qtdeitemnf
itemnotafiscal
codigoproduto(PK)
descricaoproduto
precounitarioproduto
qtdeestoque
produto
numeronf(PK)
dataemissaonf
cnpjcliente(FK)
cnpjtransportadora(FK)
notafiscal
Parte 3
www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218
22
Avaliação Então...Como foi ?!?
Estou fera!
Fiz Certo!
Muito Bom Bom regular ruim Muito ruim
Parte
Don Chamberlin é melhor conhecido como o co-inventor dalinguagem SQL (Structured Query Language), a linguagem debanco de dados mais utilizada no mundo. Desenvolvida em
meados de 1970 por Chamberlin e Raymond Boyce, a SQL foi aprimeira linguagem comercial de sucesso para banco de dadosrelacionais.
Donald Don Chamberlim 1944 - (68)
Versão 2.2.3
Parte 4
www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218
3
4
Antes de iniciarmos, vamos conversar sobre os tópicos apresentados na capa desta parte. Isso é importante para que seu instrutor e seus colegas saibam como está seu conhecimento sobre o assunto e se você precisa ou pode fornecer ajuda aos colegas e instrutor.
O que você já sabe?
O que você não sabe?
Porque é importante conhecer estes tópicos?
Quais são os seus temores?
O que você considera difícil?
Depois de falar sobre o assunto com seus colegas e instrutor, escreva,
desenhe, rabisque, diga algo sobre o que você vai fazer para dominar esses tópicos.Comprometa-se!
Preparation
Trocando Ideias É agora que você fala !!
Reflexão É aqui que você se compromete !!
Parte 4
www.grandeporte.com.br (11) 4427-4579(11) 99903-3218
4
Para dominar a linguagem SQL precisaremos construir uma infraestrutura de
algumas tabelas relacionadas, que usaremos para “brincar” de SQL.
Apesar de não ser usada por programadores, é importante conhecer a
linguagem SQL DDL, pois pode despertar seu interesse pelo cargo de DBA (Data
Base Administrator), que precisa conhecê-la a fundo.
Vamos então construir nossa casa, onde desenvolveremos nossas habilidades
em SQL DDL.
Presentation
História Construindo a casa
Parte 4
www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218
5
4
A SQL (Structure Query Language ou Linguagem de Consulta Estruturada) é
uma linguagem de pesquisa declarativa para banco de dados relacional. Muitas das
características originais do SQL foram inspiradas na álgebra relacional.
A SQL foi desenvolvida originalmente em 1974 nos laboratórios da IBM em San
Jose (Califórnia) por Donald Don Chamberlin e Raymond F. Boyce, dentro do
projeto SYSTEM R, que tinha por objetivo demonstrar a viabilidade da implementação
do modelo relacional proposto por Edgard Frank Codd. O nome original da linguagem
era SEQUEL, acrônimo para StructuredEnglish Query Language (Linguagem de
Consulta Estruturada em Inglês), vindo daí o fato de, até hoje, a sigla em inglês, ser
comumente pronunciada “Síquel” ao invés de “és-kiu-él”, letra a letra. No entanto, em
português a pronuncia mais corrente é a letra a letra “ésse-quê-éle”.
A linguagem SQL é um grande padrão em uso dos Sistemas Gerenciadores de
Bancos de Dados. Isso decorre de sua simplicidade e facilidade de uso. Ela se
diferencia de outras linguagens de consulta à banco de dados no sentido em que uma
consulta SQL especifica a forma do resultado e não o caminho para chegar até ele.
Ela é uma linguagem declarativa em oposição as outras linguagens procedurais. Isto
reduz o ciclo de aprendizado daqueles que iniciam na linguagem.
Embora a SQL tenha sido originalmente criada pela IBM, rapidamente surgiram
vários dialetos desenvolvidos por outros produtores. Essa expansão levou a
necessidade de ser criado um padrão para a linguagem. Essa tarefa foi realizada pela
American National Standards Institute (ANSI) em 1986 e pelo
InternationalOrganization for Standarnization (ISO) em 1987, mas isso não impediu a
proliferação de variações e extensões produzidas pelos diferentes fabricantes de
Sistemas Gerenciadores de Bancos de Dados.
Os comandos da linguagem SQL podem ser usados em um dos modos abaixo:
SQL Interativo: Os comandos SQL são executadas diretamente em um terminal e
o resultado desses comandos são visualizados no próprio terminal. Utiliza-se um
programa que permite essa interação tal como o QMF e o SPUFI.
Programa com SQL Estático: Os comandos SQL são codificados em uma
linguagem hospedeira, em nosso caso o COBOL, e após o processo de
compilação esses comandos ficam imutáveis no programa.
Programa com SQL Dinâmico: Os comandos SQL são informados ao programa
em tempo de execução. O comando é passado em forma de texto para o DB2 para
ser resolvido e executado.
TeoriaA Linguagem sql
(Structured query language)
Parte 4
www.grandeporte.com.br (11) 4427-4579(11) 99903-3218
6
Os comandos SQL podem ser submetidos ao DB2 pelos seguintes modos:
QMF (QUERY MANAGEMENT FACILITY)
Este é um produto da IBM para submeter os comandos SQL para o DB2 e
visualizar os resultados. Abaixo tela inicial do QMF:
O QMF oferece três estilos de consulta diferentes para o usuário com
diferentes níveis de conhecimento:
Consulta Orientada: um método de consulta fácil de ser utilizar que solicita as
informações necessárias enquanto você estiver criando uma consulta. É adequada
para iniciantes e usuários ocasionais de QMF que desejam criar uma consulta mas
não conhecem SQL.
SQL (Structured Query Management): Usa a linguagem SQL que descreve
suas solicitações para os dados no banco de dados.
QBE (Query-By-Example): Um método “gráfico” para consultar, atualizar,
excluir ou inserir dados. Minimiza a sequencia de teclas e economiza tempo ao digitar
uma consulta.
Teoria Ambientes para o uso do sql
Parte 4
www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218
7
4
SPUFI
O TSO tem uma opção dentro do menu DB2 (opção D;1) chamado SPUFI
(SQL PROCESSING USING FILE INPUT). O SPUFI tem um menu onde o usuário
especifica um dataset (pode ser um particionado) contendo o texto do comando SQL a
ser executado, e um dataset para receber o resultado do comando (resulttable).
Usando o SPUFI o usuário pode facilmente executar quase todos os comandos SQL.
Abaixo telas do SPUFI.
Parte 4
www.grandeporte.com.br (11) 4427-4579(11) 99903-3218
8
Programas
Os comandos SQL podem ser codificados dentro de programas escritos em
várias linguagens, incluindo o COBOL. Exemplo:
Parte 4
www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218
9
4
Os comandos SQL se dividem em 4 grandes grupos:
DDL – DATA DEFINITION LANGUAGE.
Neste primeiro grupo estão os comandos para criar e alterar a estrutura das
tabelas do DB2. Este grupo de comandos é usado geralmente pelo DBA ou pessoal de
suporte. (CREATE, DROP, ALTER)
DML – DATA MANIPULATION LANGUAGE
Neste segundo grupo estão os comandos para pesquisar e manipular os
valores existentes nas tabelas do DB2. Este grupo de comandos compõe o material
usado em programação dos aplicativos usando DB2. (SELECT, INSERT, UPDATE,
DELETE)
DCL – DATA CONTROL LANGUAGE
Neste terceiro grupo estão os comandos para dar ou tirar privilégios de acesso
aos objetos do DB2 (GRANT, REVOKE)
DTL – DATA TRANSACTION LANGUAGE
Neste quarto grupo estão os comandos para manipular as transações enviadas
ao DB2. (COMMIT, ROLLBACK).
Teoria Comandos sql
Sou DBA,devo conhecer SQL DDL e DCL
a fundo.
Sou programador,devo conhecerSQL DML e DTL
a fundo.
Parte 4
www.grandeporte.com.br (11) 4427-4579(11) 99903-3218
10
A SQL DDL é formada basicamente por três comandos:
CREATE Define objetos novos
ALTER Altera objetos previamente definidos
DROP Elimina objeto previamente definido
NOMEANDO OBJETOS
Toda Tabela, Índice, Coluna, View, precisa de um nome. A regra para nomear
objetos no DB2 é a seguinte:
O primeiro caractere deve ser de A a Z, $, @ ou # os demais caracteres podem
ser de A a Z, $, @, #, de 0 a 9 ou _.
O nome da tabela é único através do seu Owner/Creator/Schema. Já onome da
coluna deve ser único na tabela. Exemplo
Teoria SQL DDL
Owner/Creator/Schema
GPXXNN
Nome Simples da Tabela
TBPROD
Nome Qualificado da Tabela
(Completo)GPXXNN.TBPROD
Nome da Tabela
TBPROD
Nome da Coluna
DESCPROD
Nome Qualificado da Coluna
(Completo)TBPROD.DESCPROD
Parte 4
www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218
11
4
CRIANDO TABELAS
Apesar de ser tecnicamente possível, os comandos SQL para criar e alterar
tabelas não são usados em programas COBOL.
O comando SQL para criar uma nova tabela é o CREATE TABLE. Podem ser
criadas tabelascom até 750 colunas e 16 terabytes de tamanho total. O comando
define o nome da tabela seguido de uma série de especificações de colunas.
Exemplo 1:
CREATE TABLE PRODUTO
( CODIGO CHAR(6) UNIQUE NOT NULL,
NOME VARCHAR(20) ,
PRECO DECIMAL(8,2) NOT NULL,
DEPTOFABR CHAR(3) ,
DATAFABR DATE DEFAULT
)
Neste exemplo o argumento UNIQUE que aparece em CODIGO indica que o
valor desta coluna não pode se repetir nas linhas da tabela (Unique Key).
O argumento NOT NULL da coluna PRECO indica que nas inclusões de novas
linhas na tabela (inclusão de novos produtos no cadastro), o PRECO deve sempre ser
informado.
O argumento DEFAULT da coluna DATAFABR indica que nas inclusões de
produtos, se a coluna DATAFABR não for informada, o DB2 preencherá esta coluna
com o valor “default” para datas.Os valores default para o DB2 depende do tipo de
dado da coluna, conforme a tabela abaixo:
CHAR VARCHAR
Espaço em Branco
INTEGER SMALLINT DECIMAL REAL DOUBLE
Zero
DATE Data Corrente do Sistema
TIME Hora Corrente do Sistema
TIMESTAMP Data e Hora Corrente do Sistema
É possível definir um valor default diferente, basta informar esse valor na
sequência do comando, observe que WITH é opcional. Exemplo:
COMISSAO DECIMAL(8,2) WITH DEFAULT 100
TIMEDOCORACAO VARCHAR(30) DEFAULT ‘OLARIA F.C.’
Parte 4
www.grandeporte.com.br (11) 4427-4579(11) 99903-3218
12
Exemplo 2:
CREATE TABLE DEPTO
( CODDEPTO CHAR(03) PRIMARY KEY NOT NULL,
NOMEDEPTO CHAR(10) NOT NULL,
ENDERDEPTO VARCHAR(60)
)
Neste exemplo a tabela DEPTO esta sendo criada com a chave primária
CODDEPTO.Será necessário criar um índice único (UNIQUE INDEX) na coluna
CODDEPTO antes de inserir dados na tabela.
Exemplo 3:
CREATE TABLE CHAMADO
( NUMCHAMADO DECIMAL(6,0) NOT NULL,
TEXTOCHAMADO VARCHAR(200) NOT NUll,
ABERTURACHAMADO TIMESTAMP DEFAULT ,
FECHAMENTOCHAMADO TIMESTAMP ,
PRIMARY KEY (NUMCHAMADO)
)
Neste exemplo, a definição de Chave Primária foi dada no final com PRIMARY
KEY (NUMCHAMADO).
Não foi bem isso
que eu quis dizer
com create table!
Parte 4
www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218
13
4
CHECK CONSTRAINTS (restrições)
A verificação de restrições em tabelas especifica condições que são avaliadas
para cada linha da tabela no momento da inclusão ou alteração de dados. Você pode
especificar verificações de restrição para colunas individuais (check) ou para um grupo
de colunas (constraintnome_da_restrição). Você pode adicioná-las usando os
comandos CREATE ou ALTER TABLE.
O exemplo abaixo cria a tabela EMPREGADO com as seguintes restrições:
a) Os valores para os números do departamento devem estar entre 10 e 100
inclusive.
b) O cargo do empregado só pode ser um dos seguintes: ‘VENDAS’,
‘GERENTE’ ou ‘AUXILIAR’.
c) Cada empregado que foi admitido antes de 1986 deve ganhar mais de
R$ 40.000,00 de salário anual.
Exemplo:
CREATE TABLE EMPREGADO
( MATRICULA SMALLINT NOT NULL,
NOME VARCHAR(40) NOT NULL,
DEPTO SMALLINT
CHECK (DEPTO BETWEEN 10 AND 100),
CARGO VARCHAR(8)
CHECK(CARGO IN (’VENDAS’,’GERENTE’,’AUXILIAR’)),
DATAADMIN DATE,
SALARIO DECIMAL(7,2),
COMISSAO DECIMAL(7,2),
PRIMARY KEY (MATRICULA),
CONSTRAINT SALARIOANUAL CHECK (YEAR (DATAADMIN) >= 1986 OR
SALARIO * 12 > 40000))
Quando a verificação é sobre uma coluna, coloca-se CHECK imediatamente
após a definição desta coluna. Quando a verificação é sobre um grupo de colunas,
cria-se.umaconstraintnome_da_restrição e no check se informa a verificação desejada.
Parte 4
www.grandeporte.com.br (11) 4427-4579(11) 99903-3218
14
CRIANDO ÍNDICES
Toda coluna definida como Unique ou Primary Key precisa de um índice único,
antes da tabela começar a receber dados. Para a criação de índices únicos usamos o
comando SQL CREATE UNIQUE INDEX.Exemplo:
CREATE UNIQUE INDEX IDXDEPTO
ON DEPTO (CODDEPTO)
Neste exemplo IDXDEPTO é o nome do índice. ON indica qualtabela será
indexada e entre os parênteses é colocado a coluna que será indexada, no caso
CODDEPTO.
Qualquer coluna não Unique pode também ter um índice. Os índices
aumentam a performance das pesquisas que usam esta coluna. Exemplo:
CREATE INDEX IDXNOME
ON EMPREGADO (NOMEEMP)
Neste exemplo como pode haver mais de um empregado com o mesmo nome,
a cláusula Unique não foi usada.
Índice Tabela
IDXDEPTO DEPTO
CODDEPTO
001
002
003004
NOMEDEPTO
PRODUCAO
PINTURA
FUNILARIATAPECARIA
CODDEPTO
003
001
004002
ÍndiceTabela
NOMEEMP
BARNABE ATANASIO
CARLOS MOURA
AMBROSIO TEIXEIRABARNABE ATANASIO
CODDEPTO
002
001
004003
NOMEEMP
AMBROSIO TEIXEIRA
BARNABE ATANASIO
BARNABE ATANASIOCARLOS MOURA
EMPREGADO IDXNOME
Parte 4
www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218
15
4
ALTERANDO TABELAS
O comando SQL para alterar a estrutura de uma tabela é o ALTER TABLE.
Este comando pode ser usado tanto para alterar a especificação das colunas já
existentes como para transformar as colunas em PRIMARY KEY ou FOREIGN KEY.
Também é possível inserir ou excluir restrições. Os exemplos abaixo mostram
algumas dessas possibilidades.
Exemplo 1 – transforma a coluna CODIGO, que já era UNIQUE, em PRIMARY KEY.
ALTER TABLE PRODUTO
ADD PRIMARY KEY (CODIGO)
Exemplo 2 – transforma a coluna DEPTOFABR, em uma FOREIGN KEY para a tabela
DEPTO. Depois desta alteração, uma linha de PRODUTO somente poderá ser
incluída se houver na tabela DEPTO uma linha descrevendo o departamento onde
este produto será fabricado. Também foi definida uma restrição para a exclusão da
linha do departamento em DEPTO, especificando que se a linha DEPTO for excluída o
DB2 deverá inserir NULL na coluna DEPTOFABR dos produtos relacionados.
ALTER TABLE PRODUTO
ADD FOREIGN KEY (DEPTOFABR)
REFERENCES DEPTO (CODDEPTO)
ON DELETE SET NULL
Pode-se também usar:
ON DELETE RESTRICT – que não permite a exclusão da PARENT KEY
enquanto houverem FOREIGN KEY relacionada.
ON DELETECASCADE – que exclui todas linhas com essa chave estrangeira
antes de excluir a PARENT KEY.
Parte 4
www.grandeporte.com.br (11) 4427-4579(11) 99903-3218
16
Exemplo 3 – adiciona a coluna TAXAIMP na tabela PRODUTO. As novas colunas são
inseridas no final da estrutura da tabela.
ALTER TABLE PRODUTO
ADD COLUMN TAXAIMP DECIMAL(6,4)
Exemplo 4 – exclui a coluna TAXAIMP da tabela PRODUTO.
ALTER TABLE PRODUTO
DROP COLUMN TAXAIMP
Exemplo 5 – adiciona uma restrição na tabela PRODUTO.
ALTER TABLE PRODUTO
ADD CONSTRAINT QUANTIDADES CHECK (QTDMAX > QTDMIN)
Exemplo 6 – exclui uma restrição da tabela PRODUTO.
ALTER TABLE PRODUTO
DROP CONSTRAINT QUANTIDADES
CRIANDO VISÕES (VIEW)
Uma visão pode ser criada referenciando de 1 a 255 tabelas, dependendo da
complexidade da instrução SELECT, que não pode conter ORDER BY. Exemplo:
CREATE VIEW VDEPTOSEL
(COD_DEPTO_SEL, NOME_DEPTO_SEL)
AS
SELECT COD_DEPTO, NOME_DEPTO
FROM DEPARTAMENTO
WHERE COD_DEPTO BETWEEN ‘010’ AND ‘050’
Toda vez que a tabela DEPARTAMENTO sofrer alterações, a VIEW irá refleti-
las. Não é possível inserir dados na VIEW (INSERT), mas podemos alterar (UPDATE)
e excluir (DELETE) dados, o que acarreta alteração e exclusão na tabela original.
departamento
vdeptoselcod_depto_sel nome_depto_sel
cod_depto cod_gerente nome_depto centro_custo telefone
015 0141 Produção 127125 4455-1021038 0525 Marketing 130220 4455-1025052 0084 Vendas 130250 4455-1017067 0092 SAC 130300 4455-1035
015038
ProduçãoMarketing
Parte 4
www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218
17
4
HIRARQUIA DE EXCLUSÕES
A eliminação de qualquer objeto faz com que:
Os objetos dependentes sejam eliminados
As informações associadas sejam perdidas
As informações necessárias para recuperação sejam perdidas
Planos/Packages que referenciam os objetos sejam invalidados
A figura a seguir mostra a hierarquia dos objetos:
EXCLUINDO TABELAS
Para excluir uma tabela, usa-se o comando DROP TABLE. Exemplo:
DROP TABLE PRODUTO
Caso a tabela seja uma PARENT TABLE, ou seja, fornecedora de chave
estrangeira, a exclusão só será permitida quando a restrição de exclusão for SET
NULL ou não houver referência de sua PRIMARY KEY como FOREIGN KEY na tabela
destino. Ao se excluir uma tabela, todos os seus Índices são também excluídos.
EXCLUINDO ÍNDICES
Para excluir um índice, usa-se o comando DROP INDEX. Exemplo:
DROP INDEX IDXPRODUTO
EXCLUINDO VIEW
Para excluir uma VIEW, usa-se o comando DROP VIEW. Exemplo:
DROP VIEW VDEPTOSEL
Database Tablespace Tabela
View
Índice
Olá Tabelas,
procuro a tabcliente
Alguém a viu?
tabcliente
codcli (PK)nomecli
enderecocli
cpfclitelefonecli tabvendanumvenda (PK)
datavendacodcli (FK)
tabitemvenda
numitem(PK)
numvenda (FK)
qtdeitemcodprod (FK)
tabproduto
codprod (PK)
descprodprecovenda
qtdeestoque
Parte 4
www.grandeporte.com.br (11) 4427-4579(11) 99903-3218
18
CATALOGO DB2
O CATÁLOGO DB2 é um conjunto de tabelas da IBM para descrever todo o banco de
dados do DB2 o OWNER do CATALOGO é SYSIBM. Algumas tabelas podem ser consultadas
como por exemplo:
CATÁLOGO Que tipo de informação contém
SYSIBM.SYSCOPY Cópias e tipos das cópias
SYSIBM.SYSTABLES Tabela, criador, tipo, qual database, qual tablespace
SYSIBM.SYSCOLUMNS Coluna, a qual tabela pertence, default, nulidade
SYSIBM.TABAUTH Autorização de tabela, view-automatizador, autorizado
SYSIBM.SYSINDEXES Índices, colunas, tabela, ascendente, descendente
SYSIBM.SYSKEYS Colunas dos índices
SYSIBM.SYSPACKAGE Pacotes, token de consistência
SYSIBM.SYSDBRM DBRMs, token de consistência
SYSIBM.SYSPLAN Planos, válido, operativo
SYSIBM.SYSPLANAUTH Autorização de planos
CONSULTANDO TABELAS, COLUNAS E ÍNDICES
Para consultar as tabelas existentes no DB2, usamos o comando:
SELECT *
FROM SYSIBM.SYSTABLES
Para consultar as tabelas criadas por determinado usuário, usamos o
comando:
SELECT *
FROM SYSIBM.SYSTABLES
WHERE CREATOR = ‘GPXXNN’
Para consultar as colunas de uma determinada tabela, usamos o comando:
SELECT *
FROM SYSIBM.SYSCOLUMNS
WHERE TBNAME = ‘TABELA’ AND
TBCREATOR = ‘GPXXNN’
Parte 4
www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218
19
4
Para consultar os índices criados por determinado usuário, usamos o comando:
SELECT *
FROM SYSIBM.SYSINDEXES
WHERE CREATOR = ‘GPXXNN’
Para consultar as colunas de um determinado índice, usamos o comando:
SELECT *
FROM SYSIBM.SYSKEYS
WHERE IXCREATOR = ‘GPXXNN’ AND
IXNAME = ‘INDICE’
Parte 4
www.grandeporte.com.br (11) 4427-4579(11) 99903-3218
20
Apontando o SPUFI para a instalação de DB2 desejada.
A partir do Menu Principal do TSO, digitar as opções D (DB2 Interactive) e D
(DB2 Defaults). No painel DB2I DEFAULTS, no campo 1 DB2 NAME digitar DB2N e
pressionar a tecla ENTER. No painel COBOL DEFAULTS não mudar nada e
pressionar a tecla ENTER. Isso mudará o SSID para DB2N.
Teoria Como usar o spufi
Parte 4
www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218
21
4
1
2
3
Informando ao SPUFI os arquivos de entrada e saída
A partir do Menu Principal do TSO, digitar as opções D (DB2 Interactive) e 1
(SPUFI). No painel do SPUFI preencher os campos:
1. Entre apóstrofes, colocar o nome do arquivo sequencial ou particionado
com o membro entre parenteses, contendo o texto SQL DDL. Usaremos o
arquivo particionado GP.GPXXNN.JCLDATA(membro).
2. Entre apóstrofes, colocar o nome do arquivo sequencial, variável blocado,
para receber o resulttable. Usaremos o arquivo sequencial
GP.GPXXNN.DB2SAI.
3. Deixar NO na opção CHANGE DEFAULTS e pressionar a tecla ENTER
para digitar o comando SQL desejado.
Parte 4
www.grandeporte.com.br (11) 4427-4579(11) 99903-3218
22
Veja como o SPUFI interage com o DB2
1. O TSO envia ao SPUFI um arquivo de entrada contendo comando SQL
2. O SPUFI passa ao DB2 esse comando SQL
3. Após a execução, o DB2 DEVOLVE ao SPUFI o resultado do comando SQL
4. O SPUFI grava esse resultado no arquivo de saída e devolve o controle ao TSO
TSO
GP.GPXXNN.JCLDATA (CREATE1)PDS
GP.GPXXNN.DB2 SAIPS/VB
DB2SPUFI
1 2
34
Parte 4
www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218
23
4
Digitando o comando SQL, executando e exibindo o resultado
1. Digitar o comando SQL desejado e pressionar a tecla PF3, que sai salvando
2. A mensagem informa que você terminou de editar o comando SQL e que
precisa pressionar a tecla ENTER para executar o comando. Observe que o
campo 6 está com *, indicando que não entrará novamente na edição (Se
desejar editar novamente, coloque Y neste campo)
3. Agora você está vendo (BROWSE) o arquivo de saída. Para voltar ao painel do
SPUFI pressione a tecla PF3.
Para comentar os comandos, utilize dois hífens em qualquer coluna. Tudo que
vier na sequência será ignorado pelo DB2.
1
2
3
Parte 4
www.grandeporte.com.br (11) 4427-4579(11) 99903-3218
24
Coloque entre os parentêses em qual grupo os
comandos SQL pertencem, depois peça para seu colega
corrigí-lo.
DDL–Data Definition Language
DML – Data Manipulation Language
DCL – Data Control Language
DTL – Data Transaction Language
1. ( ) SELECT
2. ( ) ROLLBACK
3. ( ) CREATE
4. ( ) UPDATE
5. ( ) ALTER
6. ( ) DROP
7. ( ) GRANT
8. ( ) COMMIT
9. ( ) REVOKE
10. ( ) INSERT
11. ( ) DELETE
Practice
Atividade Revisão aos pares
Parte 4
www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218
25
4
Escreva os comandos SQL DDL para atender os
seguintes requisitos.
1) Inserir a coluna PRECOVENDA DECIMAL(9,2) NOT NULL na tabela TBPROD.
2) Tirar a coluna OBSCLIENTE da tabela CADCLI.
Atividade Trabalho em dupla
Parte 4
www.grandeporte.com.br (11) 4427-4579(11) 99903-3218
26
3) Criar o índice IDXENDERECO para a tabela TBCLI coluna ENDCLI.
4) Excluir o índice IDXCPF.
5) Exibir todos os índices criados pelo seu usuário.
6) Exibir todas as colunas de todas as tabelas criadas por seu usuário.
Parte 4
www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218
27
4
Criar as cinco tabelas abaixo conforme
layout, com suas Constraints, Índices, Primary
Keys e Foreign Keys com as restrições de exclusão
indicadas.
Performance
Atividade Prática de laboratório
1 2
3 4
5
SE
T N
UL
L
CA
SC
AD
E
RE
ST
RIC
T
SE
T N
UL
L
TBTIPOCLI
CODTIPOCLI (PK)DESCTIPOCLI
IDXTIPOCLI
TBVENDA
NUMVENDA (PK)DATAHORAVENDAQTDEVENDACODCLI (FK)CODPROD (FK)
IDXVENDA
TBTIPOPROD
CODTIPOPROD (PK)DESCTIPOPROD
IDXTIPOPROD
TBPROD
CODPROD (PK)DESCPRODPRECOPRODUNIDPRODCODTIPOPROD (FK)
IDXPRODTBCLI
CODCLI (PK)NOMECLIENDCLIDATANASCCLIALTURACLICODTIPOCLI (FK)
IDXCLI
Parte 4
www.grandeporte.com.br (11) 4427-4579(11) 99903-3218
28
Layout das tabelas
Tabela TBTIPOCLI
Colunas CODTIPOCLI CHAR(2) UNIQUE NOT NULL
DESCTIPOCLI VARCHAR(30) NOT NULL
Tabela TBTIPOPROD
Colunas CODTIPOPROD CHAR(2) UNIQUE NOT NULL
DESCTIPOPROD VARCHAR(30) NOT NULL
Tabela TBCLI
Colunas CODCLI CHAR(4) UNIQUE NOT NULL
NOMECLI VARCHAR(30) NOT NULL
ENDCLI VARCHAR(40)
DATANASCCLI DATE >= 01/01/1900
ALTURACLI DECIMAL(3,2) >= 1.00
CODTIPOCLI CHAR(2)
Tabela TBPROD
Colunas CODPROD CHAR(4) UNIQUE NOT NULL
DESCPROD VARCHAR(30) NOT NULL
PRECOPROD DECIMAL(9,2) > 0
UNIDPROD VARCHAR(10) ‘KG’,’PECA’,’PCT’,’LITRO’
CODTIPOPROD CHAR(2)
Tabela TBVENDA
Colunas NUMVENDA CHAR(6) UNIQUE NOT NULL
DATAHORAVENDA TIMESTAMP DEFAULT
QTDEVENDA SMALLINT > 0
CODCLI CHAR(4) NOT NULL
CODPROD CHAR(4) NOT NULL
Parte 4
www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218
29
4
Os membros do arquivo particionado GP.GPXXNN.JCLDATA conterão os
comandos SQL DDL para a criação das tabelas, índices, chaves primária e estrangeira
de acordo com a numeração dada às tabelas (de 1 a 5).
1) Escrever os comandos SQL DDL para a criação das tabelas:
Membro Tabela
CREATE1 TBTIPOCLI
CREATE2 TBTIPOPROD
CREATE3 TBCLI
CREATE4 TBPROD
CREATE5 TBVENDA
2) Escrever os comandos SQL DDL para a criação dos índices únicos (UNIQUE
INDEX) para as colunas UNIQUE NOT NULL:
Membro Índice Tabela Coluna
INDEX1 IDXTIPOCLI TBTIPOCLI CODTIPOCLI
INDEX2 IDXTIPOPROD TBTIPOPROD CODTIPOPROD
INDEX3 IDXCLI TBCLI CODCLI
INDEX4 IDXPROD TBPROD CODPROD
INDEX5 IDXVENDA TBVENDA NUMVENDA
3) Escrever os comandos SQL DDL para alterar as tabelas inserindo as chaves
primárias.
Membro Tabela Primary Key
PRIKEY1 TBTIPOCLI CODTIPOCLI
PRIKEY2 TBTIPOPROD CODTIPOPROD
PRIKEY3 TBCLI CODCLI
PRIKEY4 TBPROD CODPROD
PRIKEY5 TBVENDA NUMVENDA
4) Escrever os comandos SQL DDL para alterar as tabelas inserindo as chaves
estrangeiras.
Membro Tabela Foreign Key on Delete
FORKEY3 TBCLI CODTIPOCLI SET NULL
FORKEY4 TBPROD CODTIPOPROD SET NULL
FORKEY5 TBVENDA CODCLI CASCADE
CODPROD RESTRICT
Parte 4
www.grandeporte.com.br (11) 4427-4579(11) 99903-3218
30
Avaliação Então...Como foi ?!?
Estou fera!
Fiz Certo!
Muito Bom Bom regular ruim Muito ruim
Parte
Matemático inglês, desenvolveu a lógicamatemática de Boole, estabeleceu umarepresentação das intersecções e uniões de
conjuntos através de diagramas que levam o seunome.
John Venn1834- 1923
Versão 2.2.3
Parte 5
www.grandeporte.com.br (11) 4427-4579(11) 99903-3218
3
5
Antes de iniciarmos, vamos conversar sobre os tópicos apresentados na capa desta parte. Isso é importante para que seu instrutor e seus colegas saibam como está seu conhecimento sobre o assunto e se você precisa ou pode fornecer ajuda aos colegas e instrutor.
O que você já sabe?
O que você não sabe?
Porque é importante conhecer estes tópicos?
Quais são os seus temores?
O que você considera difícil?
Depois de falar sobre o assunto com seus colegas e instrutor, escreva,
desenhe, rabisque, diga algo sobre o que você vai fazer para dominar esses tópicos.Comprometa-se!
Preparation
Trocando Ideias É agora que você fala !!
Reflexão É aqui que você se compromete !!
Parte 5
www.grandeporte.com.br (11) 4427-4579(11) 99903-3218
4
Do ponto de vista do desenvolvedor, a linguagem SQL DML é a mais
importante, pois é a que permite a manipulação dos dados, importante para os
processos de tomada de decisão por parte do usuário.
Você aprenderá a “popular” as tabelas, atribuindo valores às suas colunas, a
consultar esses dados das mais variadas formas, algumas bem complexas, a alterar
seus valores e a excluir esses dados.
Esta parte do treinamento é longa e cobre muitos aspectos da SQL DML.
Dedique-se bastante ao SELECT e suas variantes. Isso vai ajudá-lo bastante no
momento de escrever os programas COBOL com SQL.
Presentation
História MANIPULANDO OS DADOS
Parte 5
www.grandeporte.com.br (11) 4427-4579(11) 99903-3218
5
5
A linguagem SQL DML (Data Manipulation Language) é a mais usada em
programação, para acesso a Banco de Dados Relacionais e a usaremos
extensivamente na linguagem COBOL. São quatro os principais comandos:
INSERT Para inserir novas linhas
SELECT Para consultar dados
UPDATE Para atualizar colunas
DELETE Para excluir linhas
A seguir veremos em detalhes cada um desses comandos:
O comando INSERT é usado para inserir novas linhas em uma tabela. Sua
sintaxe básica é:
INSERT INTO tabela
(coluna1, coluna2,...)
VALUES
(valor1, valor2,...)
Este comando SQL define o nome da tabela onde a linha será inserida, em
seguida dentro de parênteses, uma série de colunas para as quais serão informados
os valores, e após o argumento VALUES, os valores de cada coluna, na mesma
ordem de aparição das colunas.
Quando se insere uma nova linha em uma tabela, não é necessário fornecer
valores para todas as colunas da linha. Somente as colunas definidas como NOT
NULL devem receber obrigatoriamente valores. As colunas que não recebem valores
na inclusão da linha permanecem como colunas inexistentes (valor = NULL) até que
uma alteração (UPDATE) crie esta coluna, a menos que tenha sido definido um valor
default para a coluna.
Teoria Sql dml
Teoria insert
Parte 5
www.grandeporte.com.br (11) 4427-4579(11) 99903-3218
6
Exemplo 1:
-- INFORMANDO NULL NO VALOR DA COLUNA
INSERT INTO FUNCIONARIOS
(CODIGO, NOME, SALARIO)
VALUES
(‘00120’, ‘JOSE DA SILVA’, NULL)
-- NAO INFORMANDO A COLUNA SALARIO
INSERT INTO FUNCIONARIOS
(CODIGO, NOME)
VALUES
(‘00120’, ‘JOSE DA SILVA’)
A série de colunas no comando INSERT pode ser informada em qualquer
ordem, isto é, as colunas no INSERT não precisam estar na ordem de sua criação na
tabela, mas os valores informados em VALUES devem estar na ordem das colunas
informadas.
Exemplo 2:
-- NA ORDEM DE CRIACAO DA TABELA
INSERT INTO FUNCIONARIOS
(CODIGO, NOME, SALARIO)
VALUES
(‘00120’, ‘JOSE DA SILVA’, 1325.50)
-- EM UMA ORDEM QUALQUER
INSERT INTO FUNCIONARIOS
(NOME, SALARIO, CODIGO)
VALUES
(‘JOSE DA SILVA’,1325.50, ‘00120’)
Nos casos em que o INSERT preenche valores para todas as colunas da
tabela, a sequência de colunas pode ser omitida, e o comando se simplifica como:
INSERT INTO nome-tabela
VALUES (valor1 , valor2 ,valor3 , ...)
Neste caso terá de ser informado os valores de todas as colunas na sequência
em que as colunas foram definidas na tabela.
Exemplo 3:
-- COM COLUNAS INFORMADAS
INSERT INTO FUNCIONARIOS
(CODIGO, NOME, SALARIO)
VALUES
(‘00120’,’JOSE DA SILVA’,1325.50)
Parte 5
www.grandeporte.com.br (11) 4427-4579(11) 99903-3218
7
5
-- SEM INFORMAR AS COLUNAS
INSERT INTO FUNCIONARIOS
VALUES
(‘00120’, ‘JOSE DA SILVA’, 1325.50)
Uma forma interessante e pouco conhecida é utilizar o resultado de um
comando SELECT (RESULT TABLE) para inserir dados em uma tabela.
As colunas relacionadas com SELECT devem ser do mesmo tipo e tamanho
daqueles onde seus dados serão inseridos.
Assim, se a tabela TBCLIGERAL tem o seguinte layout:
CODCLI CHAR(5)
NOMECLI VARCHAR(50)
FONECLI CHAR(10)
SALDOCLI DECIMAL(9,2)
e a tabela TBCLINEG temo seguinte layout:
CODCLI CHAR(5)
SALDOCLI DECIMAL(9,2)
e desejarmos carregar a TBCLINEG com os clientes da TBCLIGERAL com saldo
negativo, podemos proceder da seguinte maneira:
-- INFORMANDO AS COLUNAS NO INSERT
INSERT INTO TBCLINEG
(CODCLI, SALDOCLI)
SELECT CODCLI, SALDOCLI
FROM TBCLIGERAL
WHERE SALDOCLI < 0
-- NAO INFORMANDO AS COLUNAS NO INSERT
INSERT INTO TBCLINEG
SELECT CODCLI, SALDOCLI
FROM TBCLIGERAL
WHERE SALDOCLI < 0
Parte 5
www.grandeporte.com.br (11) 4427-4579(11) 99903-3218
8
Proibido em
muitas empresas!
O objetivo do comando SELECT é pesquisar dados dentro do DB2. Ele
especifica o formato de uma tabela para conter o resultado da pesquisa e outros
parâmetros para definir o processo de pesquisa. O formato básico do SELECT é:
SELECT colunas
FROM tabela
WHERE restrição
No argumento SELECT é especificado o conjunto de colunas ou valores,
separados por vírgula, que deverão compor a tabela resultado da pesquisa. O
caractere asterisco (*) pode ser usado em colunas para indicar que todas as colunas
da tabela devem ser selecionadas.
No argumento FROM indicam-se os nomes das tabelas de onde serão
retiradas as colunas para formar a tabela resultado.
No argumento WHERE (que é opcional) especificam-se os critérios de
pesquisa usando operadores relacionais.
Exemplo1:
SELECT CODIGO, NOME, SALARIO
FROM FUNCIONARIOS
WHERE SALARIO > 1000
Neste exemplo a tabela resultado conterá uma relação com o código, nome e
salário da tabela FUNCIONARIOS, para aqueles cujo SALARIO é maior que
R$ 1000,00.
Exemplo 2:
SELECT *
FROM FUNCIONARIOS
Este exemplo lista todas as colunas da tabela
FUNCIONARIOS. Não há restrição (WHERE), portanto todas as
linhas da tabela serão exibidas. Isso consome muita CPU.
Teoria Select
Parte 5
www.grandeporte.com.br (11) 4427-4579(11) 99903-3218
9
5
Exemplo 3:
SELECT NOME, SALARIO * 12 AS SALARIOANUAL
FROM FUNCIONARIOS
Neste exemplo a tabela resultado conterá uma relação com o nome e salário
anual dos funcionários da tabela FUNCIONARIOS. UmÁlias (rótulo)pode ser colocado
para nomear as colunas. AS é opcional, podendo então ser omitido.
Exemplo 4:
SELECT PRECOPRODAS LISTA,
PRECOPROD * 0.9 AS DESCONTO,
PRECOPROD * 1.1 AS AUMENTO
FROM TABPRODUTOAS PROD
Outro exemplo do uso de alias. Aqui foram dados Álias para as colunas e
também para a tabela, artifício que facilitará a digitação de SELECTs com várias
tabelas, como veremos adiante.
Exemplo 5:
SELECT CODCLI AS “CODIGO DO CLIENTE”,
NOMECLI AS “NOME COMPLETO”,
FONECLI AS “TELEFONE RESIDENCIAL”
FROM TBCLI
Neste exemplo o Álias tem espaço em branco, e deve ser informado entre
aspas, observando o limite máximo de 18 caracteres.
A S
PROD
Parte 5
www.grandeporte.com.br (11) 4427-4579(11) 99903-3218
10
Os critérios de pesquisa do argumento WHERE envolvem comparações entre
valores de colunas, variáveis, expressões aritméticas ou constantes empregando os
operadores da tabela:
Operador
Descrição
= <>
> >=
< <=
¬> ¬<
¬=
Igual Diferente
Maior Maior ou igual
Menor Menor ou igual
Não Maior Não Menor
Não igual
BETWEEN
O valor deve estar entre os dois limites, inclusive. Exemplos:
IDADE BETWEEN 1 AND 9
NOME BETWEEN ‘B%’ AND ‘F%’
IN
O valor deve ser um dos fornecidos na lista. Exemplo:
IDADE IN (1, 3, 5, 7, 9)
LIKE
O valor deve ser semelhante ao indicado. No literal indicado
pode-se usar % para representar um conjunto de caracteres, ou _ para
representar a posição de 1 caractere. Exemplo:
NOME LIKE ‘CARLA’ Nomes exatamente iguais a CARLA
NOME LIKE ‘AN%’ Nomes iniciando com AN
NOME LIKE ‘%A’ Nomes Terminando com A
NOME LIKE ‘%SH%’ Nomes que contenham SH
NOME LIKE ‘___E%’ Nome com E na posição 4
Se o sinal ¬não estiver presente no teclado, ele pode ser obtido digitando em
hexadecimal o valor 5F.
O operador NOT pode ser usado junto com qualquer dos operadores acima.
Exemplos:
IDADE NOT BETWEEN 1 AND 9
IDADE NOT IN (1, 3, 5, 7, 9)
NOME NOT LIKE ‘%SILVA’
Parte 5
www.grandeporte.com.br (11) 4427-4579(11) 99903-3218
11
5
Os operadores lógicos AND e OR podem ser usados na construção restrições
com múltiplas condições.
Exemplo 6:
SELECT CODFUNC, NOMEFUNC, FONEFUNC
FROM FUNCIONARIOS
WHERE SALARIOFUNC > 2500 AND CODDEPTOFUNC = ‘050’
Neste exemplo somente os funcionários com salário maior que R$ 2500,00 e
que trabalhem no departamento ‘050’ são selecionados.
Vale relembrar que a prioridade dos operadores lógicos é:
1º. NOT
2º. AND
3º. OR
Assim as duas restrições abaixo produzem resultados diferentes:
WHERE CARGO = ‘PEAO’ AND SALARIO > 1200 OR DEPTO = ‘050’
WHERE CARGO = ‘PEAO’ AND (SALARIO > 1200 OR DEPTO = ‘050’)
Exemplo 7:
SELECT NOMEFUNC || ‘, ’ || FONEFUNC
FROM FUNCIONARIOS
Neste exemplo o nome do funcionário será concatenado com uma vírgula e um
espaço em branco, que por sua vez será concatenado com seu telefone. Para que a
concatenação ocorra, utilize dois símbolos pipe ||. Se o sinal | não estiver presente no
teclado, ele pode ser obtido digitando em hexadecimal o valor 4F.
Exemplo 8:
SELECT 'CODIGO..: ' , CODPROD,
'MINIMO..: ' , QTDMIN ,
'MAXIMO..: ' , QTDMAX ,
'ESTOQUE.: ' , QTDEST
FROM PRODUTO
Neste exemplo uma constante precede a coluna e também será exibida em
cada linha da consulta. As constantes são delimitadas por apóstrofes.
Parte 5
www.grandeporte.com.br (11) 4427-4579(11) 99903-3218
12
Exemplo 9:
SELECT CODFUNC, NOMEFUNC, COMISSAO
FROM FUNCIONARIO
WHERE COMISSAO IS NULL
Neste exemplo foi usado o argumento IS NULL como critério de seleção da
coluna. Pode-se inverter esse critério com NOT:
WHERE COMISSAO IS NOT NULL
ELIMINANDO REPETIÇÕES DA TABELA RESULTADO
O argumento DISTINCT é opcional, e quando especificado a tabela resultado
não conterá linhas com valores repetidos para a coluna informada. A sintaxe é a
seguinte:
SELECT DISTINCT coluna
FROM tabela
WHERE restrição
O exemplo abaixo lista o código dos produtos vendidos, sem repetição, que
foram vendidos mais de 10 unidades.
Exemplo 10:
SELECT DISTINCT CODPROD
FROM TBVENDA
WHERE QTDVENDA > 10
A palavra chave DISTINCT deve aparecer logo depois do SELECT.
O uso do DISTINCT pode implicar o uso da área de Sort do DB2. Use
preferencialmente colunas que fazem parte do índice.
DISTINCT gentleman
There is no other like him
Parte 5
www.grandeporte.com.br (11) 4427-4579(11) 99903-3218
13
5
OPERAÇÕES ARITMÉTICAS
Os seguintes operadores aritméticos podem ser usados em SQL:
Prioridade Sinal Operação
0 ( ) Parênteses – Agrupa expressões
1 * / Multiplicação e Divisão
2 + - Soma e Subtração
Exemplo 11:
SELECT NUMEFUNC, SALARIO+COMISSAO AS RENDIMENTOS
FROM FUNCIONARIO
WHERE SALARIO+COMISSAO >= 20000
ARITMÉTICA com DATE/TIME
Os formatos DATE, TIME e TIMESTAMP armazenam dados como decimal
compactado sem sinal, de acordo com a tabela abaixo:
Tipo de Dado Formato Interno
DATE aaaammdd
TIME hhmmss
TIMESTAMP aaaammddhhmmssnnnnnn
Os programas só lidam com o formato externo que é uma string de caracteres,
de acordo com o padrão em uso, como mostra a tabela abaixo:
Padrão Formato Time
Tamanho Formato Date
Tamanho
ISO hh.mm.ss 8 Bytes aaaa-mm-dd 10 Bytes
USA hh.mm AM hh.mm PM
8 Bytes mm/dd/aaaa 10 Bytes
EUR hh.mm.ss 8 Bytes dd.mm.aaaa 10 Bytes
JIS hh:mm:ss 8 Bytes aaaa-mm-dd 10 Bytes
Timestamp usa o formato aaaa-mm-dd-hh-mm-ss-nnnnnn com 26 Bytes.
A subtração fornece o seguinte resultado:
horário – horário ===> duração em hhmmss
data – data ===> duração em aaaammdd
Há também a subtração e adição com DURAÇÃO ROTULADA, que é um
número n seguido da palavra chave YEARS, MONTHS, DAYS, HOURS, MINUTES,
SECONDS ou MICROSECONDS.
horário duração rotulada ===> horário
data duração rotulada ===>data
Parte 5
www.grandeporte.com.br (11) 4427-4579(11) 99903-3218
14
Exemplo 12:
SELECT CURRENT DATE - DATAADMISSAO
FROM FUNCIONARIO
Neste exemplo será exibido no formato aaaammdd o tempo que o funcionário
tem de empresa.
Exemplo 13:
SELECT DATANASCIMENTO + 18 YEARS
FROM TABCLIENTE
Neste exemplo será exibido no formato de data (de acordo com o padrão do
sistema) a data em que o cliente terá 18 anos.
Exemplo 14:
SELECT DATAVENCTO + 1 MONTHS – 3 DAYS
FROM TABBOLETOS
Neste exemplo será exibido no formato de data (de acordo com o padrão do
sistema) a data de vencimento do boleto somando 1 mês e subtraindo 3 dias.
Parte 5
www.grandeporte.com.br (11) 4427-4579(11) 99903-3218
15
5
ORDENAÇÃO DA TABELA RESULTADO
Para ordenar as linhas na tabela resultado usamos ORDER BY, sua sintaxe é a
seguinte:
SELECT DISTINCT colunas
FROM tabela
WHERE restrição
ORDER BY colunas ASC
Com esta sintaxe a tabela resultado será ordenada pelas colunas especificadas
no argumento ORDER BY. O argumento ASC é opcional, pode ser DESC, e indica se
a ordenação é crescente ou decrescente.
Exemplo 15:
SELECT DISTINCT NOME
FROM FUNCIONARIOS
ORDER BY NOME
Neste exemplo é listado sem repetição, os nomes dos funcionários em ordem
alfabética.
Exemplo 16:
SELECT NOME,CARGO,DEPTO,SALARIO
FROM FUNCIONARIOS
ORDER BY 4
Neste exemplo foi usado a posição da coluna no SELECT como argumento do
ORDER BY.
Colunas classificadas não precisam ser referenciadas pelo SELECT.
Nulos são considerados como valor mais alto.
Podemos especicar colunas para o ORDER BY fornecendo um número que
indique suas posições na cláusula SELECT.
ORDER BY classifica uma tabela resultante.Logo,deve ser a última a aparecer
numa instrução SELECT.
ORDER BY pode implicar no uso de área de Sort do DB2.Use
preferencialmente colunas que fazem parte de índice.
É possível usar mais de uma coluna para fazer a ordenação:
Exemplo 17:
SELECT CODCLI,CODPROD
FROM TBVENDA
ORDER BY CODCLI ASC, CODPROD DESC
Parte 5
www.grandeporte.com.br (11) 4427-4579(11) 99903-3218
16
BUILT-IN FUNCTIONS
O DB2 possui um conjunto de funções pré-programadas que podem ser
usadas pelos comandos SQL. Os argumentos passados para as funções podem ser
colunas de uma tabela ou expressões com constantes e variáveis não pertencentes ao
DB2.
Quando todos os argumentos não pertencem ao DB2 ou não existe uma tabela
para preencher o argumento FROM do SELECTdeve-se usar a pseudo-tabela
SYSIBM.SYSDUMMY1. Exemplo de um SELECT para obter a data do sistema:
Exemplo 18:
SELECT CURRENT DATE
FROM SYSIBM.SYSDUMMY1
A lista de funções é extensa e as principais estão na tabelas abaixo:
Funções de Data/Hora
DATE(coluna) Devolve um valor DATE contido na expressão
ou coluna do tipo DATE ou TIMESTAMP
DAY(expressão)
Devolve o dia do mês se a expressão for do tipo
DATE, ou a quantidade de dias se a expressão
representar uma diferença de datas.
DAYS(expressão)
Devolve um numero inteiro representando o
numero de dias transcorridos entre o valor DATE
da expressão e o dia 01/01/0001.
HOUR(expressão)
Retorna o valor da HORA contido na expressão.
Expressão deve ter formato TIME ou
TIMESTAMP.
MICROSECOND(expressão)
Devolve o valor dos MICROSSEGUNDOS
contidos na expressão. Expressão precisa ter
formato TIME ou TIMESTAMP.
MINUTE(expressão)
Devolve o valor dos MINUTOS contidos na
expressão. Expressão deve ter formato TIME ou
TIMESTAMP
MONTH(expressão)
Devolve o valor do MES contido na expressão.
Expressão deve ter formato DATE ou
TIMESTAMP
SECOND(expressão)
Devolve o valor dos SEGUNDOS contidos na
expressão. Expressão deve ter formato TIME ou
TIMESTAMP
YEAR(expressão)
Devolve o valor do ANO contido na expressão.
Expressão deve ter formato DATE ou
TIMESTAMP
Parte 5
www.grandeporte.com.br (11) 4427-4579(11) 99903-3218
17
5
Funções Agregativas
AVG(DISTINCT coluna)
Obtém a média aritmética dos valores das
colunas ou expressões. Se DISTINCT for usado,
os valores repetidos serão desprezados.
COUNT(* ou DISTINCT coluna)
* obtém a quantidade de linhas selecionadas. Se
DISTINCT for usado, as linhas repetidas não
serão contadas.
MAX(coluna) Obtém o maior valor contido nas colunas ou
expressões selecionadas.
MIN(coluna) Obtém o menor valor contido nas colunas ou
expressões selecionadas.
SUM(DISTINCT coluna)
Obtém a soma dos valores das colunas ou
expressões selecionadas. Se DISTINCT for
usado, os valores repetidos não serão somados.
Funções de Conversão
CHAR(expressão)
Converte o resultado de expressão para
STRING. O resultado de expressão pode estar
nos formatos:INTEGER ou SMALLINT
DECIMAL
REAL ou DOUBLE
DECIMAL(expressão,n1,n2)
Transforma o valor de expressão em valor no
formato DECIMAL, contendo um total de n1
algarismos e n2 decimais.
DIGITS(expressão)
Retorna o valor da expressão com os algarismos
no formato de um STRING de caracteres,
preenchendo com zeros a esquerda. A
expressão deve estar no formato INTEGER,
SMALLINT ou DECIMAL.
FLOAT(expressão) Retorna o valor da expressão ou coluna no
formato FLOAT.
HEX(expressão) Retorna um STRING de dígitos hexadecimais
com o valor da expressão.
INTEGER(expressão) Retorna o valor da expressão no formato
INTEGER
LENGTH(expressão) Retorna o numero de caracteres do valor da
expressão (ou coluna)
VALUE(expressão,expressão) Retorna o valor da primeira expressão cujo valor
não for NULL. São duas funções equivalentes. COALESCE (expressão,expressão)
SUBSTR(string1,inicio,tamanho)
Devolve um STRING extraído de STRING1 a
partir de INICIO. O argumento TAMANHO é
opcional, e indica o comprimento do resultado.
Se TAMANHO for omitido, a extração se inicia
em INICIO até o fim de STRING1.
Parte 5
www.grandeporte.com.br (11) 4427-4579(11) 99903-3218
18
AGRUPANDO LINHAS NO RESULTADO
A tabela resultado pode ter suas linhas agrupadas e resumidas segundo o valor
de uma coluna especifica com a sintaxe:
SELECT colunas
FROM tabela
WHERE restrição
GROUP BY colunas
HAVING condição
Com esta sintaxe, cada linha da tabela resultado será o resumo das linhas
pesquisadas para cada valor das colunas especificadas em GROUP BY. O argumento
HAVING é opcional, e se especificado conterá as condições de seleção de cada grupo
gerado pelo GROUP BY. WHERE seleciona linhas e HAVING seleciona grupos.
Exemplo 19:
SELECT CARGO,SUM(SALARIO)
FROM FUNCIONARIOS
GROUP BY CARGO
HAVING SUM(SALARIO) > 10000
Este exemplo lista os cargos e a respectiva soma de salários da tabela de
funcionários somente para os cargos cuja soma de salários é superior a R$ 10.000,00.
Exemplo 20:
SELECT DEPTO, SUM(SALARIO),SUM(COMISSAO)
FROM FUNCIONARIOS
WHERE CARGO <> ‘GERENTE’
GROUP BY DEPTO
Este exemplo lista os departamentos e a respectiva soma de salários e
comissão da tabela de funcionários somente para os cargos diferentes de GERENTE.
Exemplo 21:
SELECT DEPTO, CARGO, SUM(SALARIO)
FROM FUNCIONARIO
GROUP BY DEPTO, CARGO
Este exemplo lista os departamentos e os cargos dentro do departamento com
a respectiva soma de saláriosda tabela de funcionários.
Podemos fazer GROUP BY sobre múltiplas colunas.Colunas GROUP BY não
precisam ser referenciadas pelo SELECT.Colunas referenciadas pelo SELECT que
não tenham função aplicada precisam ser agrupadas pelo GROUP BY. Isso é um erro
muito frequente.O resultado contém uma linha sumário para cada grupo.Todos os
valores nulos são considerados como um grupo.
Parte 5
www.grandeporte.com.br (11) 4427-4579(11) 99903-3218
19
5
UNINDO SELECTS (UNION e UNION ALL)
Dois ou mais SELECTs podem ser reunidos para formar uma única tabela
resultado. O comando UNION tem a seguinte sintaxe:
1º Comando SELECT
UNION
2º Comando SELECT
UNION ALL
3º Comando SELECT
Os SELECTs são executados serialmente. A quantidade de colunas precisa ser
igual em todos os SELECTs. O data type das colunas correspondentes deve ser igual.
O tamanho das colunas não precisa ser igual, é considerado o tamanho do maior. O
Operador UNION usa as tabelas resultantes e elimina as linhas duplicadas, o que
implica no uso do SORT. O operador UNION ALL também une as tabelas, mas não
elimina as linhas duplicadas. Portanto não usa O SORT.
Exemplo 22:
SELECT CODCLISP, NOMECLISP, FONECLISP
FROM TBCLISP
UNION
SELECT CODCLIRJ, NOMECLIRJ, FONECLIRJ
FROM TBCLIRJ
Neste exemplo dois cadastros de clientes são consultados para formas uma
única tabela resultado. Caso o mesmo cliente esteja em ambos os cadastros com o
mesmo código, nome e telefone, ele não será repetido.
Exemplo 23:
SELECT CODCLISP AS CODIGO, NOMECLISP, FONECLISP
FROM TBCLISP
UNION ALL
SELECT CODCLIRJ AS CODIGO, NOMECLIRJ, FONECLIRJ
FROM TBCLIRJ
ORDER BY CODIGO
Neste exemplo os mesmos dois cadastros de clientes são consultados para
formas uma única tabela resultado. Foi atribuído o mesmo Álias nas colunas de código
do cliente, o que permitiu o uso de ORDER BY. O uso do UNION ALL faz com que
clientes cadastrados em duplicidade apareçam na tabela resultado.
Parte 5
www.grandeporte.com.br (11) 4427-4579(11) 99903-3218
20
JOIN
O JOIN é o processo do SELECT de pesquisar dados em mais de uma tabela.
A tabela resultado conterá valores provenientes de colunas das várias tabelas. Para
que seja possível esta união das linhas de várias tabelas para compor uma linha da
tabela resultado, é necessário que as linhas das várias tabelas tenham em comum
uma coluna que tenha valores correspondentes.
Para exemplificar, vamos usar 2 tabelas: FUNCIONARIOS e
DEPARTAMENTO com as seguintes colunas:
Queremos fazer uma relação de funcionários com o nome do departamento em
que trabalham. A tabela resultado deste SELECT deverá conter CODFUNC,
NOMEFUNC tirados da tabela FUNCIONARIOS e conter NOMEDEPTO tirado da
tabela DEPARTAMENTO. Este SELECT deverá fazer um JOIN destas duas tabelas
usando como colunas de ligação DEPTOFUNC e CODDEPTO. O SELECT será o
seguinte:
SELECT CODFUNC, NOMEFUNC, NOMEDEPTO
FROM FUNCIONARIOS, DEPARTAMENTO
WHERE FUNCIONARIOS.DEPTOFUNC = DEPARTAMENTO.CODDEPTO
Podemos usar Áliaspara as tabelas, o que simplificaria a digitação. O SELECT
com o uso de Álias fica:
SELECT CODFUNC, NOMEFUNC, NOMEDEPTO
FROM FUNCIONARIOS AS TBF, DEPARTAMENTO AS TBD
WHERE TBF.DEPTOFUNC = TBD.CODDEPTO
Podemos colocar as seguintes regras para construir um JOIN:
1. As tabelas envolvidas precisam ter uma coluna com valores iguais. 2. A cláusula WHERE do SELECT deve especificar esta correspondência entre
colunas. 3. Não é necessário que as colunas do JOIN sejam ligadas como FOREIGN KEY.
Esta declaração só tem finalidade para garantir a INTEGRIDADE RELACIONAL. 4. Note que na cláusula WHERE as colunas estão prefixadas pelo nome da tabela
(Álias). O esquema de prefixação (nome da tabela, nome da coluna separados por ponto) é usado aqui para definir o JOIN. O esquema de prefixação pode ser usado, no entanto em qualquer comando SQL para resolver ambiguidades de nomes de colunas entre varias tabelas.
5. A quantidade máxima de tabelas que podem participar de um JOIN é 255 ou menos, dependendo da complexidade do comando.
FUNCIONARIOS
CODFUNC (PK)NOMEFUNCDEPTOFUNC(FK)SALARIOFUNC
DEPARTAMENTO
CODDEPTO (PK)NOMEDEPTO
Parte 5
www.grandeporte.com.br (11) 4427-4579(11) 99903-3218
21
5
OS 7 TIPOS DE JOIN
Dada as tabelas TABCLISP e TABCLIRJ, definidas abaixo:
CREATE TABLE TBCLISP
(CODCLISP CHAR(3) NOT NULL,
NOMECLISP VARCHAR(10),
SALDOCLISP DECIMAL(8,2),
PRIMARY KEY (CODCLISP)
)
CREATE TABLE TBCLIRJ
(CODCLIRJ CHAR(3) NOT NULL,
NOMECLIRJ VARCHAR(10),
SALDOCLIRJ DECIMAL(8,2),
PRIMARY KEY (CODCLIRJ)
)
Com o seguinte conteúdo:
SELECT * FROM TBCLISP
SELECT * FROM TBCLIRJ;
CODCLISP NOMECLISP SALDOCLISP
---------+---------+---------+--
001 ANA 100.00
003 BEATRIZ 300.00
005 CARLA 500.00
008 PEDRO 2800.00
009 JOAO 2900.00
010 JOSE 3000.00
CODCLIRJ NOMECLIRJ SALDOCLIRJ
---------+---------+---------+--
002 DANIEL 200.00
004 ELIZABETE 400.00
006 FABIO 600.00
008 PEDRO 800.00
009 JOAO 900.00
010 JOSE 1000.00
Trata-se de dois cadastros de clientes, um de São Paulo (TBCLISP) e outro do
Rio de Janeiro (TBCLIRJ), mas com clientes em comum.
Usando diagrama de Venn, podemos observar que existe um grupo de linhas
com a mesma chave primária em ambas as tabelas:
Desejamos fazer uma consulta (SELECT) exibindo CODCLISP, NOMECLIRJ e
SALDOCLIRJ, como mostrado abaixo:
SELECT CODCLISP, NOMECLIRJ, SALDOCLIRJ
001003005
008009010
002004006
TBCLIRJTBCLISP
RIGHTLEFT
Parte 5
www.grandeporte.com.br (11) 4427-4579(11) 99903-3218
22
1. A B Intersecção (INNER JOIN ou NATURAL JOIN)
Queremos os clientes cadastrados em duplicidade. São aqueles que existem
tanto no TBCLISP quanto no TBCLIRJ.
2. A B União (FULL OUTER JOIN)
Queremos o cadastro completo.
Quando o código do cliente existe em TBCLISP, mas não existe em TBCLIRJ
ou vice-versa, as colunas são preenchidas com NULL (o DB2 exibe essas colunas
preenchendo o seu tamanho com vários hífens).
A B
SELECT CODCLISP, NOMECLIRJ, SALDOCLIRJ
FROM TBCLISP INNER JOIN TBCLIRJ
ON CODCLISP = CODCLIRJ
CODCLISP NOMECLIRJ SALDOCLIRJ
---------+---------+---------+-----
008 PEDRO 800.00
009 JOAO 900.00
010 JOSE 1000.00
SELECT CODCLISP, NOMECLIRJ, SALDOCLIRJ
FROM TBCLISP FULL OUTER JOIN TBCLIRJ
ON CODCLISP = CODCLIRJ
CODCLISP NOMECLIRJ SALDOCLIRJ
-------+---------+---------+----
001 ---------- ----------
-------- DANIEL 200.00
003 ---------- ----------
-------- ELIZABETE 400.00
005 ---------- ----------
-------- FABIO 600.00
008 PEDRO 800.00
009 JOAO 900.00
010 JOSE 1000.00
BA
Parte 5
www.grandeporte.com.br (11) 4427-4579(11) 99903-3218
23
5
3. Somente A (LEFT JOIN)
Queremos somente os clientes da TBCLISP e que também existam em
TBCLIRJ.
Somente os códigos dos clientes de São Paulo são exibidos. As colunas
correspondentes aos códigos dos clientes do Rio de Janeiro são preenchidas com
NULL.
4. Somente B (RIGHT JOIN)
Queremos somente os clientes da TBCLIRJ e que também existam em
TBCLISP.
Somente o nome e o saldo dos clientes do Rio de Janeiro são exibidos. Os
códigos dos clientes de São Paulo que não existem na TBCLIRJ são preenchidos com
NULL.
SELECT CODCLISP, NOMECLIRJ, SALDOCLIRJ
FROM TBCLISP LEFT JOIN TBCLIRJ
ON CODCLISP = CODCLIRJ
CODCLISP NOMECLIRJ SALDOCLIRJ
-------+---------+---------+----
001 ---------- ----------
003 ---------- ----------
005 ---------- ----------
008 PEDRO 800.00
009 JOAO 900.00
010 JOSE 1000.00
SELECT CODCLISP, NOMECLIRJ, SALDOCLIRJ
FROM TBCLISP RIGHT JOIN TBCLIRJ
ON CODCLISP = CODCLIRJ
CODCLISP NOMECLIRJ SALDOCLIRJ
-------+---------+---------+----
-------- DANIEL 200.00
-------- ELIZABETE 400.00
-------- FABIO 600.00
008 PEDRO 800.00
009 JOAO 900.00
010 JOSE 1000.00
A B
A B
Parte 5
www.grandeporte.com.br (11) 4427-4579(11) 99903-3218
24
5. (A B) – B A menos B
Queremos exclusivamente os clientes de São Paulo. Eles não podem estar
cadastrados na TBCLIRJ.
Somente os códigos dos clientes de São Paulo que não existem na TBCLIRJ
são exibidos.Como eles não possuem correspondentes na TBCLIRJ, as colunas
NOMECLIRJ e SALDOCLIRJ são preenchidas com NULL.
6. (A B) – A B menos A
Queremos exclusivamente os clientes do Rio de Janeiro. Eles não podem estar
cadastrados na TBCLISP.
Somente as colunas NOMECLIRJ e SALDOCLIRJ, cujos códigos de cliente
não existem na TBCLISP são exibidas. A coluna CODCLISP será preenchida com
NULL.
SELECT CODCLISP, NOMECLIRJ, SALDOCLIRJ
FROM TBCLISP LEFT JOIN TBCLIRJ
ON CODCLISP = CODCLIRJ
WHERE CODCLIRJ IS NULL
CODCLISP NOMECLIRJ SALDOCLIRJ
-------+---------+---------+----
001 ---------- ----------
003 ---------- ----------
005 ---------- ----------
SELECT CODCLISP, NOMECLIRJ, SALDOCLIRJ
FROM TBCLISP RIGHT JOIN TBCLIRJ
ON CODCLISP = CODCLIRJ
WHERE CODCLISP IS NULL
CODCLISP NOMECLIRJ SALDOCLIRJ
-------+---------+---------+----
-------- DANIEL 200.00
-------- ELIZABETE 400.00
-------- FABIO 600.00
A B
BA
Parte 5
www.grandeporte.com.br (11) 4427-4579(11) 99903-3218
25
5
7. (A B) – (A B ) União menos Intersecção
Queremos exclusivamente os clientes que não estão cadastrados ao mesmo
tempo em São Paulo e Rio de Janeiro.
Somente as colunas CODCLISP, NOMECLIRJ, SALDOCLIRJ cujos códigos de
clientes não são comuns são exibidas. As colunas que não possuem correspondente
na outra tabela são preenchidas com NULL.
SELECT CODCLISP, NOMECLIRJ, SALDOCLIRJ
FROM TBCLISP FULL OUTER JOIN TBCLIRJ
ON CODCLISP = CODCLIRJ
WHERE CODCLISP IS NULL OR
CODCLIRJ IS NULL
CODCLISP NOMECLIRJ SALDOCLIRJ
-------+---------+---------+---
001 ---------- ----------
-------- DANIEL 200.00
003 ---------- ----------
-------- ELIZABETE 400.00
005 ---------- ----------
-------- FABIO 600.00
Parte 5
www.grandeporte.com.br (11) 4427-4579(11) 99903-3218
26
SUBQUERIES ou SUBSELECTs
O processo de SUBQUERIES acontece quando os elementos de comparação
da cláusula WHERE ou HAVING de um SELECT são resultado de um segundo
SELECT. Neste caso usamos um encadeamento de SELECTS, o que configura o uso
de SUB-QUERIES.
Exemplo 24:
Queremos uma lista dos funcionários do departamento P1 cujo salário é menor
que a média dos salários do departamento P2. Temos aqui o SELECT principal que
produz a lista de funcionários do departamento P1, e o SELECT auxiliar que calcula a
média dos salários do departamento P2. O SELECT completo com a SUBQUERY fica:
SELECT NOME,SALARIO
FROM FUNCIONARIOS
WHERE DEPTO = ‘P1’ AND
SALARIO < (SELECT AVG(SALARIO)
FROM FUNCIONARIOS
WHERE DEPTO = ‘P2’)
No exemplo acima, a SUBQUERY produziu somente uma linha. Nos casos em
que a SUBQUERY produz mais de uma linha, existem operandos no SELECT para
decidir o campo de ação da condição do WHERE. Estes operandos são os do quadro:
ALL
A condição do WHERE deve ser satisfeita para TODAS as linhas da
SUBQUERY.
IN
ANY
SOME
A condição do WHERE deve ser satisfeita pelo menos por UMA linha da
SUBQUERY
EXISTS
O WHERE é verdadeiro se a SUBQUERY tiver pelo menos UMA linha.
Uma Subquery é um SELECT embutido dentro de um SELECT. O resultado de
uma Subquery é usado pelo SELECT mais externo. Pode ser usado no WHERE ou no
HAVING. Pode ser encadeado. Deve estar à direita do operador na condição de
seleção. Deve ser colocado entre parênteses. Pode retornar uma ou mais linhas e isto
acaba determinando o operador a ser usado na condição de pesquisa. Não pode
conter ORDER BY.
Parte 5
www.grandeporte.com.br (11) 4427-4579(11) 99903-3218
27
5
O comando UPDATE é usado para alterar valores em uma ou mais linhas de
uma tabela. O comando enumera as colunas e seus novos valores.
UPDATE Tabela
SET coluna1=valor1,
Coluna2=valor2,
.......
WHERE condição
Exemplo 1:
UPDATE FUNCIONARIOS
SET SALARIO = SALARIO * 1.10,
BONUS = NULL,
COMISSAO = 10.00
WHERE DEPTO = ‘P1’
Neste exemplo, todos os funcionários do departamento P1 terão um aumento
de 10% no salário, perderão o bônus e terão uma valor de comissão igual a R$ 10,00.
Uma Subquery pode ser usada no WHERE para aprimorar a seleção das linhas
alteradas.
Exemplo 2:
UPDATE FUNCIONARIOS
SET SALARIO = SALARIO * 1.35,
COMISSAO = 500.00
WHERE CODFUNCNOT IN (SELECT CODFUNC
FROM ADVERTIDOS)
Neste exemplo, todos os funcionários que não foram advertidos, terão um
aumento de 35% e uma comissão de R$ 500,00.
Teoria update
Parte 5
www.grandeporte.com.br (11) 4427-4579(11) 99903-3218
28
O comando DELETE exclui linhas de uma tabela selecionadas pela clausula
WHERE. Se a clausula WHERE não for especificada em um comando DELETE, todas
as linhas da tabela serão apagadas.
DELETE FROM Tabela
WHERE condição
Exemplo 1:
DELETE FROM FUNCIONARIOS
WHERE CODFUNC = ‘00120’
Uma Subquery pode ser usada no WHERE para aprimorar a seleção das linhas
excluídas.
Exemplo 2:
DELETE FROM FUNCIONARIOS
WHERE CODFUNC IN ( SELECT CODFUNC
FROM TABDEMITIDOS
WHERE DATADEMISSAO < YEAR(CURRENT DATE))
Neste exemplo, são excluídas as linhas da tabela FUNCIONARIOS cujo código
do funcionário esteja na tabela TABDEMITIDOS e a data de demissão seja menor que
o ano corrente.
Teoria delete
Esta bem, onde
estão as linhas
para delecão ?,
Parte 5
www.grandeporte.com.br (11) 4427-4579(11) 99903-3218
29
5
Descreva o resultado dos SELECTs abaixo:
1 SELECT CODIGO,NOME
FROM FUNCIONARIOS
2 SELECT *
FROM FUNCIONARIOS
3
SELECT CODIGO,NOME
FROM FUNCIONARIOS
WHERE CARGO = ‘VENDAS’
4
SELECT NOME,SALARIO
FROM FUNCIONARIOS
WHERE CARGO = ‘VENDAS’
AND SALARIO > 1000
5
SELECT NOME,SALARIO
FROM FUNCIONARIOS
WHERE SALARIO BETWEEN
500 AND 2000
6
SELECT CODIGO,NOME
FROM FUNCIONARIOS
WHERE CARGO IN
(‘VENDAS’,’COBRANCA’)
Practice
Atividade TRABALHO EM DUPLA
Parte 5
www.grandeporte.com.br (11) 4427-4579(11) 99903-3218
30
7
SELECT NOME
FROM FUNCIONARIOS
WHERE NOME LIKE
‘MARIA%’
8
SELECT NOME,SALARIO
FROM FUNCIONARIOS
WHERE SALARIO * 12 >
50000
9
SELECT NOME,
CURRENT DATE –
DATADEMISSAO
FROM FUNCIONARIOS
WHERE DATADEMISSAO
IS NOT NULL
10
SELECT NOME || ‘-‘
|| CODDEPTO
FROM FUNCIONARIOS
WHERE SALFUNC ¬> 10000
11
SELECT NOME, CARGO
FROM FUNCIONARIOS
WHERE DATAADMISSAO +
10 YEARS >
CURRENT DATE
12
SELECT NOMEFUNC, CARGO
FROM TABFUNCSP
UNION
SELECT NOMEFUNC, CARGO
FROM TABFUNCRJ
13
SELECT NOMEFUNC, CARGO
FROM TABFUNCSP
UNION ALL
SELECT NOMEFUNC, CARGO
FROM TABFUNCRJ
Parte 5
www.grandeporte.com.br (11) 4427-4579(11) 99903-3218
31
5
Descreva o resultado dos SELECTs abaixo:
1
SELECT SUM(SALARIO),
AVG(COMISSAO)
FROM FUNCIONARIOS
WHERE DEPTO = ‘P1’
2
SELECT MAX(SALARIO),
MIN(SALARIO)
FROM FUNCIONARIOS
3
SELECT CARGO,
SUM(SALARIO)
FROM FUNCIONARIOS
GROUP BY CARGO
HAVING SUM(SALARIO) > 10000
4
SELECT SALARIO,
DECIMAL(SALARIO,6,1),
INTEGER(SALARIO),
HEX(SALARIO),
DIGITS(SALARIO)
FROM FUNCIONARIOS
5
SELECT NOME,
LENGTH(NOME)
FROM FUNCIONARIOS
Atividade TRABALHO EM DUPLA
Parte 5
www.grandeporte.com.br (11) 4427-4579(11) 99903-3218
32
6 SELECT SUBSTR(NOME,1,3)
FROM FUNCIONARIOS
7 SELECT COUNT(*)
FROM FUNCIONARIOS
8
SELECT NOME,
VALUE(COMISSAO,0)
FROM FUNCIONARIOS
WHERE COMISSAO IS NULL
9
SELECT NOME,
YEAR(DATANASC)
FROM FUNCIONARIOS
WHERE CODFUNC = ‘0010’
10
SELECT NOME,
YEAR(DATANASC)
FROM FUNCIONARIOS
WHERE YEAR(CURRENT DATE
– DATANASC) >= 18
11
SELECT NOME, SALARIO * 12
FROM FUNCIONARIOS
WHERE YEAR(DATAADMISSAO
+ 10 YEARS) >
YEAR(CURRENT DATE)
12
SELECT NOME, TELEFONE,
COMISSAO + SALARIO
AS BONUS
FROM FUNCIONARIOS
WHERE MONTH(DATAADMISSAO)
= MONTH(CURRENT DATE)
13
SELECT NOME, TELEFONE
FROM FUNCIONARIO
WHERE SUBSTR(NOME,1,3) =
‘SIL’
Parte 5
www.grandeporte.com.br (11) 4427-4579(11) 99903-3218
33
5
Descreva o resultado das Subqueries abaixo:
1
SELECT NOME,SALARIO
FROM FUNCIONARIOS
WHERE DEPTO = ‘P1’ AND SALARIO > ALL
( SELECT SALARIO
FROM FUNCIONARIOS
WHERE DEPTO = ‘P2’)
2
SELECT NOME,SALARIO
FROM FUNCIONARIOS
WHERE DEPTO = ‘P1’ AND SALARIO >ANY
( SELECT SALARIO
FROM FUNCIONARIOS
WHERE DEPTO = ‘P2’)
Atividade Revisão aos pares
Parte 5
www.grandeporte.com.br (11) 4427-4579(11) 99903-3218
34
3
SELECT NOME,SALARIO
FROM FUNCIONARIOS
WHERE DEPTO = ‘P1’ AND SALARIO EXISTS
( SELECT SALARIO
FROM FUNCIONARIOS
WHERE DEPTO = ‘P2’)
4
SELECT DEPTO, AVG(SALARIO)
FROM FUNCIONARIOS
WHERE CARGO <> ‘GERENTE’
GROUP BY DEPTO
HAVING AVG(SALARIO) < ( SELECT AVG(SALARIO)
FROM FUNCIONARIOS
WHERE CARGO <> ‘GERENTE’)
ORDER BY 2 DESC
Parte 5
www.grandeporte.com.br (11) 4427-4579(11) 99903-3218
35
5
Dado o MER monte os SELECTs para responder
as questões abaixo:
Atividade Revisão aos pares
CLIENTE
CODCLI(PK)NOMECLIFONECLI
PEDIDO
NUMPED(PK)DATAPEDCODCLI(FK)CODBOY(FK)
MOTOBOY
CODBOY(PK)NOMEBOYALCUNHABOY
ITEM
(FK)NUMPEDNUMITEMCODPROD(FK)QTDPROD
PK
PRODUTO
CODPROD(PK)DESCPRODPRECOPROD
FORMAPGTO
CODFORMA(PK)DESCFORMA
COMPAGTO
(FK)NUMPED(FK)CODFORMAVALORPAGTO
PK
Parte 5
www.grandeporte.com.br (11) 4427-4579(11) 99903-3218
36
1) Qual é o nome dos clientes que o motoboy “Bigode” fez entregas ontem?
2) Qual é o produto mais vendido?
3) Quantos pedidos foram pagos em cheque este ano?
4) Qual produto nunca foi vendido?
Parte 5
www.grandeporte.com.br (11) 4427-4579(11) 99903-3218
37
5
5) Qual cliente fez mais pedidos?
6) Qual a pizza mais cara?
7) Qual a forma de pagamento usada pela cliente “Ana Maria”?
8) Quantos pedidos foram feitos ontem?
Parte 5
www.grandeporte.com.br (11) 4427-4579(11) 99903-3218
38
9) Quantos pedidos foram feitos antes de ontem?
10) A relação de pedidos por motoboy.
Parte 5
www.grandeporte.com.br (11) 4427-4579(11) 99903-3218
39
5
Utilize as tabelas abaixo para executar os
comandos INSERT, SELECT, DELETE e UPDATE.
Performance
Atividade Prática de laboratório
1 2
3 4
5
SE
T N
UL
L
CA
SC
AD
E
RE
ST
RIC
T
SE
T N
UL
L
TBTIPOCLI
CODTIPOCLI (PK)DESCTIPOCLI
IDXTIPOCLI
TBVENDA
NUMVENDA (PK)DATAHORAVENDAQTDEVENDACODCLI (FK)CODPROD (FK)
IDXVENDA
TBTIPOPROD
CODTIPOPROD (PK)DESCTIPOPROD
IDXTIPOPROD
TBPROD
CODPROD (PK)DESCPRODPRECOPRODUNIDPRODCODTIPOPROD (FK)
IDXPRODTBCLI
CODCLI (PK)NOMECLIENDCLIDATANASCCLIALTURACLICODTIPOCLI (FK)
IDXCLI
Parte 5
www.grandeporte.com.br (11) 4427-4579(11) 99903-3218
40
Monte os INSERTs para popular as tabelas.
Os membros do arquivo particionado GP.GPXXNN.JCLDATA conterão os
comandos SQL DML para os INSERTs de acordo com a numeração dada às tabelas
(de 1 a 5).
Membro Tabela Qtde. Linhas
INSERT1 TBTIPOCLI 5
INSERT2 TBTIPOPROD 5
INSERT3 TBCLI 10
INSERT4 TBPROD 10
INSERT5 TBVENDA 30
Dica: para digitar vários comandos SQL no mesmo membro, separe-os usando
ponto-e-vírgula como mostra o exemplo abaixo.
Atividade INSERT
Parte 5
www.grandeporte.com.br (11) 4427-4579(11) 99903-3218
41
5
Monte os SELECTs para as consultas abaixo.
Os membros do arquivo particionado GP.GPXXNN.JCLDATA conterão os
comandos SQL DML para os SELECTs de acordo com a numeração de exercício.
Membro Consulta solicitada
SELECT01
Exibir o nome dos clientes com menos de 1.7m de altura
SELECT02
Exibir o nome e o endereço dos clientes do tipo ‘01’
SELECT03
Exibir a descrição dos produtos do tipo ‘03’
SELECT04
Exibir todos os dados (*) de vendas feitos para o cliente ‘0001’
SELECT05
Exibir o preço do produto mais caro (MAX)
Atividade select
Parte 5
www.grandeporte.com.br (11) 4427-4579(11) 99903-3218
42
SELECT06
Exibir o nome dos clientes que moram em rua (LIKE)
SELECT07
Exibir a média de preço dos produtos do tipo ‘02’
SELECT08
Exibir todos os dados dos produtos (*) em ordem crescente de descrição (ORDER BY)
SELECT09
Exibir todos os dados dos clientes do tipo ‘03’e (AND) que tenham mais de 1.7m de altura em ordem decrescente de nome
SELECT10
Exibir quantas vendas foram feitas (COUNT) feitas para o cliente ‘0001’
SELECT11
Exibir a descrição dos produtos do tipo ‘01’, ’03’ e ‘05’ (IN)
Parte 5
www.grandeporte.com.br (11) 4427-4579(11) 99903-3218
43
5
SELECT12
Exibir o preço dos produtos mais caros por tipo de produto (MAX e GROUP BY)
SELECT13
Exibir a média da altura dos clientes por tipo de cliente (AVG e GROUP BY)
SELECT14
Exibir o nome e a data de nascimento dos clientes maiores ou iguais a 18 anos. (YEAR e CURRENT DATE)
SELECT15
Exibir o nome e a descrição do tipo de cliente (JOIN)
SELECT16
Exibir a descrição dos produtos comprados por clientes do tipo ‘04’ (SUB-QUERIE)
Parte 5
www.grandeporte.com.br (11) 4427-4579(11) 99903-3218
44
SELECT17
Exibir sem repetição, o nome dos clientes que compraram produtos do tipo ‘03’em ordem crescente de nome. (JOIN ou SUB-QUERIE)
SELECT18
Exibir o valor de cada compra feita pelo cliente ‘0002’(JOIN)
SELECT19
Exibir o valor do total de compras feitas pelo cliente ‘0001’ no mês e ano correntes. (JOIN)
Parte 5
www.grandeporte.com.br (11) 4427-4579(11) 99903-3218
45
5
SELECT20
Exibir o nome dos clientes que compraram mais de R$ 1.000,00 em produtos do tipo ‘01’. (JOIN / SUB-QUERIE)
SELECT21
Exibir a descrição do tipo de produto que os clientes do tipo ‘03` compraram mais de 10 unidades por compra. (JOIN / SUB-QUERIE)
Parte 5
www.grandeporte.com.br (11) 4427-4579(11) 99903-3218
46
Monte os UPDATEs para as alterações abaixo.
Os membros do arquivo particionado GP.GPXXNN.JCLDATA conterão os
comandos SQL DML para os UPDATEs de acordo com a numeração dada ao
exercício.
Membro Alteração Solicitada
UPDATE1
Aumentar o preço dos produtos do tipo ‘01’ em 15%
UPDATE2
Alterar os clientes do tipo ‘01’para tipo ‘03’
UPDATE3
Alterar para tipo ‘05’ os clientes nascidos depois de 1980 com mais de 1.6m de altura
UPDATE4
Abaixar os preços dos produtos nunca que foram vendidos em 10%
Atividade UPDATE
Parte 5
www.grandeporte.com.br (11) 4427-4579(11) 99903-3218
47
5
Monte os DELETEs para as exclusões abaixo.
Os membros do arquivo particionado GP.GPXXNN.JCLDATA conterão os
comandos SQL DML para os DELETEs de acordo com a numeração dada ao
exercício.
Membro Exclusão solicitada
DELETE1
Excluir as vendas feitas para os clientes ‘0005’ e ‘0010’
DELETE2
Excluir os clientes que compraram os produtos ‘0001’ e ‘0003’
DELETE3
Excluir os produtos com preço entre R$ 500,00 e R$ 1500,00 e tipo de produto ‘01’
DELETE4
Excluir os produtos que nunca foram vendidos
Atividade DELETE
Lembrem-se das
Regras de integridade
Na exclusão
Cascade / delete / set null
Parte 5
www.grandeporte.com.br (11) 4427-4579(11) 99903-3218
48
Avaliação Então...Como foi ?!?
Estou fera!
Fiz Certo!
Muito Bom Bom regular ruim Muito ruim
Parte
Ray Boyce foi um cientista da computaçãoamericano, mais conhecido por suas pesquisasem banco de dados relacionais. Trabalhou naIBM onde foi co-desenvolvedor da Forma Normal
Boyce-Codd (em parceria com Edgar FrankCodd) e da linguagem SQL (com Donald DonChamberlim)
Raymond Francis Boyce1947- 1974
Versão 2.2.3
Parte 6
www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218
3
6
Antes de iniciarmos, vamos conversar sobre os tópicos apresentados na capa desta parte. Isso é importante para que seu instrutor e seus colegas saibam como está seu conhecimento sobre o assunto e se você precisa ou pode fornecer ajuda aos colegas e instrutor.
O que você já sabe?
O que você não sabe?
Porque é importante conhecer estes tópicos?
Quais são os seus temores?
O que você considera difícil?
Depois de falar sobre o assunto com seus colegas e instrutor, escreva,
desenhe, rabisque, diga algo sobre o que você vai fazer para dominar esses tópicos. Comprometa-se!
Preparation
Trocando Ideias É agora que você fala !!
Reflexão É aqui que você se compromete !!
Parte 6
www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218
4
Chegou o momento de escrevermos o primeiro programa COBOL com DB2. É
agora que você irá aplicar seu conhecimento da SQL DML para que, via programa
COBOL possa manipular os dados armazenados nas tabelas do DB2.
Os arquivos VSAM (Virtual Storage Access Method), vistos no curso de COBOL
Level 1, estão aos poucos sendo substituídos por Banco de Dados armazenados em
DB2. Assim, é comum que novos sistemas já nasçam com a camada de dados
baseada em Sistemas Gerenciadores de Banco de Dados Relacional.
Há todo um jargão novo para aprender aqui, tais como DECLARATION, HOST
VARIABLES, INDICATOR, CURSOR, etc. Acostume-se com eles e utilize esse
linguajar durante seu treinamento. Assim, quando estiver em uma entrevista e utilizar
os termos certos para as situações certas, mostrará ao entrevistador que você está
preparado para os desafios de programação COBOL com DB2.
Presentation
História O PRIMEIRO PROGRAMA
Parte 6
www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218
5
6
FORMATO DOS COMANDOS
Para codificar um comando SQL em COBOL basta colocá-lo entre as palavras
EXEC SQL e END-EXEC na margem B, como no modelo:
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
EXEC SQL
COMANDO SQL
END-EXEC
Exemplo:
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
EXEC SQL
DELETE FROM FUNCIONARIOS
WHERE DATAADMISSAO IS NOT NULL
END-EXEC
HOST VARIABLES
Quando se manipula os dados de tabelas em um programa COBOL, é preciso
primeiro anunciar (DECLARE) essas tabelas ao programa.
Por exemplo, dada a tabela EMPREGADO abaixo:
Antes do programa COBOL poder manipular seus dados, é preciso declará-la
na WORKING-STORAGE SECTION, como mostrado abaixo:
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
WORKING-STORAGE SECTION.
EXEC SQL
DECLARE EMPREGADO TABLE
(IDEMP INTEGER,
NOMEEMP CHAR(10),
SALARIOEMP DECIMAL(7,2),
DATAADMINEMP DATE)
END-EXEC
Teoria Programando em cobol
IDEMP NOMEEMP SALARIOEMP DATAADMINEMP
integer char(10) decimal(7,2) date
1 JOAO 1000.00 10/05/2000
2 JOSE 2000.00 11/06/2001
3 MARIA 3000.00 12/07/2002
Parte 6
www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218
6
Essa declaração diz ao programa COBOL que será usada a tabela
EMPREGADO, composta pelas colunas (SQL FIELDS) IDEMP, NOMEEMP,
SALARIOEMP e DATAADMINEMP com seus respectivos tipos de dados. Como essa
declaração é um comando SQL, e não um comando COBOL é preciso delimitá-lo por
EXEC SQL e END-EXEC.
Quando os dados são trazidos dessas colunas para o COBOL, deve haver
variáveis correspondentes para receber esses dados. Para cada coluna da tabela
(SQL FIELDS) é preciso declarar uma variável COBOL correspondente (HOST
VARIABLE).
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
WORKING-STORAGE SECTION.
EXEC SQL
DECLARE EMPREGADO TABLE
(ID_EMP INTEGER,
NOME_EMP CHAR(10),
SALARIO_EMP DECIMAL(7,2),
DATAADMIN_EMP DATE)
END-EXEC.
01 WS-REG-EMPREGADO.
05 WS-ID-EMP PIC S9(9) COMP.
05 WS-NOME-EMP PIC X(10).
05 WS-SALARIO-EMP PIC S9(5)V99 COMP-3.
05 WS-DATAADMIN-EMP PIC X(10).
O processo de especificar o nome da tabela, colunas SQL (SQL FIELDS) e as
variáveis correspondentes no COBOL (HOST VARIABLES) é chamado de
DECLARATIONS.
A tabela abaixo mostra os SQL FIELDS e as HOST VARIABLES
correspondentes. É necessário haver uma compatibilidade completa entre o
formato do dado nas colunas das tabelas (SQL FIELDS) e as variável do COBOL
(HOST VARIABLE), pois ao contrário do COBOL que ajusta o formato dos dados nos
MOVEs, o DB2 não faz nenhuma conversão de formato nestas operações.
SQL Field Tipo de dado SQL Host Variable Tipo de dado COBOL
IDEMP INTEGER (4 Bytes) WS-IDEMP PIC S9(9) COMP.
NOMEEMP CHAR (10 Bytes) WS-NOMEEMP PIC X(10).
SALARIOEMP DECIMAL (4 Bytes) WS-SALARIOEMP PIC S9(5)V99 COMP-3.
DATAADMINEMP DATE (10 bytes) WS-DATAADMINEMP PIC X(10).
Qualquer variável definida no COBOL pode ser usada como HOST VARIABLE,
desde que seu formato seja completamente compativel (tamanho, PICTURE, casas
decimais etc) com a coluna da tabela com a qual troca dados.
Podemos fazer as declarações das tabelas manualmente, como visto
anteriormente, ou podemos gerá-las automaticamente pelo aplicativo chamado
DCLGEN (Declaration Generator Tool).Como mostra as telas a seguir:
Parte 6
www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218
7
6
Para usar o painel do DCLGEN, a partir do menu principal do TSO, escolhemos
as opções D (DB2I) e 2 (DCLGEN). No painel preenchemos os seguintes campos:
1 Nome da tabela para a qual vamos criar as variáveis hospedeiras
4 Entre apóstrofes, o nome do arquivo particionado e seu membro, que conterá a
book das variáveis hospedeiras.
6 ADD quando for criar a book ou REPLACE quando a book já existe e será
atualizada.
Depois de pressionar a tecla ENTER, o terminal será notificado com a seguinte
mensagem, indicando o sucesso da operação:
Parte 6
www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218
8
A área produzida pelo DCLGEN deve ser inserida na WORKING-STORAGE
SECTION do programa COBOL com o seguinte comando:
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
*----------------------------------------------------------------*
WORKING-STORAGE SECTION.
*----------------------------------------------------------------*
EXEC SQL
INCLUDE PRODUTO
END-EXEC
Mostramos abaixo um exemplo de declaração da tabela PRODUTO produzida
pelo DCLGEN:
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
******************************************************************
* DCLGEN TABLE(PRODUTO) *
* LIBRARY(GP.GPAZ99.JCLDATA(PRODUTO)) *
* LANGUAGE(COBOL) *
* QUOTE *
* ... IS THE DCLGEN COMMAND THAT MADE THE FOLLOWING STATEMENTS *
******************************************************************
EXEC SQL DECLARE PRODUTO TABLE
( CODPROD CHAR(4) NOT NULL,
DESCPROD VARCHAR(20) NOT NULL,
UNIDPROD CHAR(5),
LOCALPROD CHAR(5),
QTDEST DECIMAL(5, 0),
QTDMAX DECIMAL(5, 0),
QTDMIN DECIMAL(5, 0),
PRECOCOMPRA DECIMAL(8, 2),
PRECOVENDA DECIMAL(8, 2),
PERCOMIS DECIMAL(4, 2)
) END-EXEC.
******************************************************************
* COBOL DECLARATION FOR TABLE PRODUTO *
******************************************************************
01 DCLPRODUTO.
10 CODPROD PIC X(4).
10 DESCPROD.
49 DESCPROD-LEN PIC S9(4) USAGE COMP.
49 DESCPROD-TEXT PIC X(20).
10 UNIDPROD PIC X(5).
10 LOCALPROD PIC X(5).
10 QTDEST PIC S9(5)V USAGE COMP-3.
10 QTDMAX PIC S9(5)V USAGE COMP-3.
10 QTDMIN PIC S9(5)V USAGE COMP-3.
10 PRECOCOMPRA PIC S9(6)V9(2) USAGE COMP-3.
10 PRECOVENDA PIC S9(6)V9(2) USAGE COMP-3.
10 PERCOMIS PIC S9(2)V9(2) USAGE COMP-3.
******************************************************************
* THE NUMBER OF COLUMNS DESCRIBED BY THIS DECLARATION IS 10 *
******************************************************************
Todos os comandos SQL devem portanto usar HOST VARIABLES contidos
dentro destas áreas produzidas pelo DCLGEN. No exemplo acima estas variáveis
estão na área DCLPRODUTO.
O nome da variável hospedeira de nível 01 sempre será DCLnome-da-tabela.
Ela será usada quando se fizer uma leitura (SELECT) de todas as colunas (*) da
tabela.
Parte 6
www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218
9
6
Existe uma equivalência na declaração de arquivos e tabelas. A figura abaixo
mostra essa equivalencia.
Precisamos contar ao COBOL sobre os arquivos e tabelas que o programa irá
manipular, bem como as variáveis espelho e hospedeira a serem usadas.
Variável Espelho
Variável Hospedeira
Declaration da Tabela
Definição do Arquivo
Parte 6
www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218
10
Quando usadas nos comando SQL as HOST VARIABLES devem sempre estar
precedidas pelo caractere dois pontos(:). Se o compilador de comandos SQL encontra
o (:) antes de uma palavra, ela é interpretada como HOST VARIABLE, caso contrário é
interpretada como nome de coluna de tabela (SQL FIELD).
O exemplo abaixo mostra o de uso de variáveis hospedeiras. Um código de
funcionário é passado à variável hospedeira CODEMP e um SELECT faz o conteúdo
das colunas NOMEEMP e SALARIO carregarem as hospedeiras :NOMEEMP
e :SALARIO, para o funcionário “000001”. Depois essas variáveis são exibidas na
SYSOUT pelo comando DISPLAY.
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
MOVE “000001” TO CODEMP
EXEC SQL
SELECT NOMEEMP, SALARIO
INTO :NOMEEMP, :SALARIO
FROM EMPREGADOS
WHERE CODEMP = :CODEMP
END-EXEC
DISPLAY “CODIGO..: “ CODEMP
DISPLAY “NOME....: “ NOMEEMP
DISPLAY “SALARIO.: “ SALARIO
Observe que a variável hospedeira precisou usar os dois pontos (:) apenas no
comando SQL, isto é, entre EXEC-SQL e END-EXEC. No COBOL, a variável
hospedeira não precisa dos dois pontos (:).
EXEC SQL
DECLARE JULIETA
TABLE
Parte 6
www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218
11
6
Use COPY para inserir book de arquivos, variáveis e rotinas em seu programa.
Lembre-se que é possível usar REPLACING para substituir coringas por strings que
você precisa. Exemplo:
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
COPY BK001D1 REPLACING ==::== BY ==WS-==.
Use INCLUDE para inserir as books de tabelas (DECLARATIONS) criadas pelo
DCLGEN ou por você mesmo. Só assim o compilador reconhecerá que se trata de
código especifico a ser tratado como SQL.
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
EXEC SQL
INCLUDE BK002TP
END-EXEC
Teoria Include x copy
Então eu disse a ele para fazer
COPY de book de arquivo e INCLUDE
de variáveis hospedeiras para as
tabelas, mas ele não me ouviu e ...
Parte 6
www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218
12
Sempre que um comando SQL é executado, um código de retorno é gerado
automaticamente, semelhante ao FILE STATUS para os arquivos. É preciso declarar
uma book de variáveis chamada SQLCA (SQL Communication Area) que contém as
variáveis que armazenam esse retorno.
A principal variável da SQLCA é a SQLCODE, que será testada pelos
comandos do COBOL. Para declarar a SQLCA na WORKING-STORAGE dos
programas usamos a seguinte sintaxe:
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
*----------------------------------------------------------------*
WORKING-STORAGE SECTION.
*----------------------------------------------------------------*
EXEC SQL
INCLUDE SQLCA
END-EXEC
Esse INCLUDE carrega a seguinte área (BOOK de variáveis):
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
01 SQLCA.
05 SQLCAID PIC X(8).
05 SQLCABC PIC S9(9) COMP-4.
05 SQLCODE PIC S9(9) COMP-4.
05 SQLERRM.
49 SQLERRML PIC S9(4) COMP-4.
49 SQLERRMC PIC X(70).
05 SQLERRP PIC X(8).
05 SQLERRD OCCURS 6 TIMES
PIC S9(9) COMP-4.
05 SQLWARN.
10 SQLWARN0 PIC X.
10 SQLWARN1 PIC X.
10 SQLWARN2 PIC X.
10 SQLWARN3 PIC X.
10 SQLWARN4 PIC X.
10 SQLWARN5 PIC X.
10 SQLWARN6 PIC X.
10 SQLWARN7 PIC X.
05 SQLEXT.
10 SQLWARN8 PIC X.
10 SQLWARN9 PIC X.
10 SQLWARNA PIC X.
10 SQLSTATE PIC X(5).
Nem sempre o SQLCODE é suficiente para descobrir o motivo do não sucesso
na execução de um comando SQL. A variável SQLERRMC adiciona informações que
ajudam na análise do erro (mensagem de erro).
TeoriaTESTE DE ERRO NOS COMANDOS SQL(SQLCODE)
Parte 6
www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218
13
6
Se a variável SQLWARN0 for igual a “ “ (espaço em branco), então as variáveis
de SQLWARN1 a SQLWARN6 estão em branco.
Mas se a variável SQLWARN0 for igual a “W”, significa que alguns SQLWARN
foram “setados” para “W”:
SQLWARN1 A string assinaladana variável Host foi truncada
SQLWARN2 Nulos ignorados no cálculo de uma função de coluna
SQLWARN3 Número de colunas maior que o de variáveis HOST
SQLWARN4 UPDATE ou DELETE “PREPARED” sem cláusula WHERE
SQLWARN5 Instrução SQL/DS inválida no DB2
SQLWARN6 Valor da Data ou Timestamp corrigidas de um valor inválido
resultante de uma operação aritmética.
Os valores a serem testados no SQLCODEsão:
SQLCODE = 0
Execução com sucesso.
SQLCODE < 0
Comando não foi executado. O codigo do erro é o valor do
SQLCODE.
SQLCODE > 0
O comando foi executado, com um WARNING dado pelo valor
do SQLCODE.
Os códigos de erro dados pelo SQLCODE podem ser encontrados no manual
de erros da IBM (DB2 MESSAGES AND CODES), mas a seguir temos alguns valores
importantes, que todo programador precisa saber:
SQLCODE = +100 Linha pesquisada não existe
SQLCODE = 0 Sucesso na execução do comando SQL
SQLCODE = -545 Há valores que não satisfazem as (CHECK CONSTRAINTS)
SQLCODE = -803 Linha com esta PRIMARY KEY já existe
0
Parte 6
www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218
14
É necessário testar o código de retorno para todos os comandos SQL
executáveis (Os comandos DECLARE não são executáveis). Como a variável
SQLCODE é binária (PIC S9(9) COMP-4) é necessário movê-la para uma variável
formatada para poder ser exibida. Usaremos a variável WS-SQLCODE, como mostra
o exemplo:
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
WORKING-STORAGE SECTION.
EXEC SQL
INCLUDE SQLCA
END-EXEC
77 WS-SQLCODE PIC +9(9).
PROCEDURE DIVISION.
.
.
.
EXEC SQL
INSERT INTO PRODUTO
(CODPROD, DESCPROD, QTDMIN, QTDMAX, QTDEST)
VALUES
(:CODPROD, :DESCPROD, :QTDMIN, :QTDMAX, :QTDEST)
END-EXEC
EVALUATE SQLCODE
WHEN 0 ADD 1 TO WS-CT-GRAV
WHEN -803 DISPLAY "PRODUTO JA EXISTE"
WHEN -545 DISPLAY "PRODUTO COM DADOS INVALIDOS"
WHEN OTHER
MOVE "ERRO INSERT PRODUTO" TO WS-MSG
MOVE SQLCODE TO WS-SQLCODE
GO TO 9000-ERRO-DB2
END-EVALUATE
.
.
.
9000-ERRO-DB2.
DISPLAY “*-------------------------------------------------*“
DISPLAY “* ERRO AO ACESSAR O DB2 *“
DISPLAY “*-------------------------------------------------*“
DISPLAY “ MENSAGEM......: “ WS-MSG
DISPLAY “ SQLCODE.......: “ WS-SQLCODE
DISPLAY “ SQL MESSAGE...: “ SQLERRMC
DISPLAY “*-------------------------------------------------*“
DISPLAY “* TERMINO ANORMAL DO PROGRAMA *“
DISPLAY “*-------------------------------------------------*“
MOVE +12 TO RETURN-CODE
STOP RUN
.
Parte 6
www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218
15
6
A cláusula WHENEVER (sempre que) do DB2 pode ser usada para substituir
os testes do SQLCODE, ela define uma ação no programa para onde a execução
continuará quando ocorrer uma condição de erro apontada no WHENEVER.
O WHENEVER no entanto somente intercepta 3 condições de erro:
SQLWARNING Intercepta SQLCODE positivo diferente de +100 ou
SQLWAR0 = “W”
SQLERROR Intercepta SQLCODE negativo
NOT FOUND Intercepta SQLCODE = +100
Também só podem ser programadas 2 ações para processar os erros
interceptados:
GO TO parágrafo a execução se desvia para o parágrafo
CONTINUE a execução continua na próxima sentença
A instrução WHENEVER é substituída por códigos “IF...ELSE...END-IF” pelo
pré-compilador. O pré-compilador insere a condição equivalente logo após cada
instrução SQL do programa fonte.
Como resultado das definições acima, a sintaxe do WHENEVER pode ser uma
das seguintes:
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
PROCEDURE DIVISION.
EXEC SQL
WHENEVER condicao
GO TO paragrafo
END-EXEC
ou
EXEC SQL
WHENEVER condicao
CONTINUE
END-EXEC
Teoria WHENEVER
NOT FOUND
SQLWARNING
SQLERROR
0 100
Parte 6
www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218
16
Exemplos:
Parte 6
www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218
17
6
É possível não criar um parágrafo principal na PROCEDURE DIVISION
porque o pré-compilador acrescenta uma SECTION (DSNSQL SECTION) com os
parágrafos SQL-SKIP, SQL-INITIAL e SQL-INITIEND. O parágrafo SQL-INITIAL varia
em função dos comandos SQL e das tabelas em uso pelo programa. Abaixo temos um
exemplo para o programa de carga (INSERT).
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
*-------------------------------------------------------------*
PROCEDURE DIVISION.
*-------------------------------------------------------------*
*000-ROTINA-PRINCIPAL.
DSNSQL SECTION.
SQL-SKIP.
GO TO SQL-INIT-END.
SQL-INITIAL.
MOVE 1 TO SQL-INIT-FLAG.
CALL 'DSNHADDR' USING SQL-VPARMPTR OF SQL-PLIST2 SQL-PVAR-LIS
- T2.
CALL 'DSNHADDR' USING SQL-PVAR-ADDRS OF SQL-PLIST2 CODPROD OF
DCLPRODUTO SQL-NULL DESCPROD OF DCLPRODUTO SQL-NULL UNIDPROD
OF DCLPRODUTO SQL-NULL LOCALPROD OF DCLPRODUTO SQL-NULL QTDES
- T OF DCLPRODUTO SQL-NULL QTDMAX OF DCLPRODUTO SQL-NULL QTDMIN
OF DCLPRODUTO SQL-NULL PRECOCOMPRA OF DCLPRODUTO SQL-NULL PRE
- COVENDA OF DCLPRODUTO SQL-NULL PERCOMIS OF DCLPRODUTO SQL-NUL
- L
CALL 'DSNHADDR' USING SQL-CODEPTR OF SQL-PLIST2 SQLCA.
SQL-INIT-END.
PERFORM 010-INICIALIZAR
PERFORM 030-PROCESSAR
UNTIL CADPRDD1-EOF
PERFORM 040-TERMINO
STOP RUN
.
Porém se for colocado no parágrafo principal, o compilador produzirá uma
INFORMATIONAL MESSAGE (não é erro) com os seguintes dizeres:
the paragraph or section prior to paragraph or section
“000-ROTINA-PRINCIPAL” did not contain any statements.
TeoriaProcedure division com ou sem Parágrafo principal
Parte 6
www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218
18
A síntaxe do comando para incluir linhas em uma tabela é a mesma vista nos
conceitos de SQL DML, somente acrescentando que os argumentos informados em
VALUES podem ser constantes ou HOST VARIABLES.
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
PROCEDURE DIVISION.
.......
EXEC SQL
INSERT INTO tabela
(coluna1, coluna2, ...)
VALUES
(:variavel1,:variavel2, ...)
END-EXEC
IF SQLCODE NOT = 0
MOVE “ERRO NO INSERT” TO WS-MSG
MOVE SQLCODE TO WS-SQLCODE
GO TO 9000-ERRO-DB2
END-IF
Se alguma das colunas do comando INSERT for do tipo VARCHAR,
ahospedeira com –LEN (length) precisa ser carregado com o comprimento total do
valor da coluna e a hospedeira com –TEXT recebe o conteúdo alfanumérico. Exemplo:
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
PROCEDURE DIVISION.
.......
MOVE 10 TO DESCRICAO-LEN
MOVE WS-DESCRICAO-M TO DESCRICAO-TEXT
EXEC SQL
INSERT INTO PRODUTO
(CODIGO, DESCRICAO, ...)
VALUES
(:CODIGO, :DESCRICAO, ...)
END-EXEC
EVALUATE SQLCODE
WHEN 0
ADD 1 TO WS-CTINSERIDO
WHEN -803
ADD 1 TO WS-CTDUPLICADO
WHEN ANOTHER
MOVE “ERRO NO INSERT” TO WS-MSG
MOVE SQLCODE TO WS-SQLCODE
GO TO 9000-ERRO-DB2
END-EVALUATE
Teoria Incluindo linhas na tabela
Parte 6
www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218
19
6
Objetivo do Programa
Carregar a tabela TBCLIENTE com base em um arquivo sequencial CADCLI.
Macro-Fluxo
Exemplo Programa de carga
TBCLIENTE
CADCLI
EXECARGA
Parte 6
www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218
20
Layout do Arquivo
BOOK CADCLI
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
******************************************************************
* BOOK DO ARQUIVO - CADASTRO DE CLIENTE *
* NOME DA BOOK - BKEXEAC *
* NOME DO PDS - GP.GPXXNN.BOOKLIB *
* NOME DO ARQUIVO - CADCLI *
* TAMANHO DO REGISTRO - 151 BYTES *
******************************************************************
01 ::REG-CADCLI.
03 ::CODCLI-CADCLI PIC X(04).
03 ::NOMECLI-CADCLI PIC X(30).
03 ::ENDCLI-CADCLI PIC X(40).
03 ::FONECLI-CADCLI PIC X(09).
03 ::EMAILCLI-CADCLI PIC X(50).
03 ::CPFCLI-CADCLI PIC X(11).
03 ::SALDOCLI-CADCLI PIC 9(05)V99.
Nome do Arquivo CADCLI
Nome do Registro REG-CADCLI
Nome do Campo Tipo e Tamanho
Descrição
CODCLI-CADCLI PIC X(04) Código do cliente
NOMECLI-CADCLI PIC X(30) Nome do cliente
ENDCLI-CADCLI PIC X(40) Endereço do cliente
FONECLI-CADCLI PIC X(09) Telefone do cliente
EMAILCLI-CADCLI PIC X(50) E-mail do cliente
CPFCLI-CADCLI PIC X(11) CPF do cliente
SALDOCLI-CADCLI PIC 9(05)V99 Saldo do cliente
Parte 6
www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218
21
6
Layout da Tabela
DECLARATION da tabela TBCLIENTE
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
******************************************************************
* DCLGEN TABLE(TBCLIENTE) *
* LIBRARY(GP.GPAZ99.BOOKLIB(BKEXETC)) *
* LANGUAGE(COBOL) *
* QUOTE *
* DBCSDELIM(NO) *
* ... IS THE DCLGEN COMMAND THAT MADE THE FOLLOWING STATEMENTS *
******************************************************************
EXEC SQL DECLARE TBCLIENTE TABLE
( CODCLI CHAR(4) NOT NULL,
NOMECLI VARCHAR(30) NOT NULL,
ENDCLI VARCHAR(40),
FONECLI CHAR(9),
EMAILCLI VARCHAR(50),
CPFCLI CHAR(11),
SALDOCLI DECIMAL(9,2)
) END-EXEC.
******************************************************************
* COBOL DECLARATION FOR TABLE TBCLIENTE *
******************************************************************
01 DCLTBCLIENTE.
10 CODCLI PIC X(4).
10 NOMECLI.
49 NOMECLI-LEN PIC S9(4) USAGE COMP.
49 NOMECLI-TEXT PIC X(30).
10 ENDCLI.
49 ENDCLI-LEN PIC S9(4) USAGE COMP.
49 ENDCLI-TEXT PIC X(40).
10 FONECLI PIC X(9).
10 EMAILCLI.
49 EMAILCLI-LEN PIC S9(4) USAGE COMP.
49 EMAILCLI-TEXT PIC X(50).
10 CPFCLI PIC X(11).
10 SALDOCLI PIC 9(05)V99.
******************************************************************
* THE NUMBER OF COLUMNS DESCRIBED BY THIS DECLARATION IS 6 *
******************************************************************
Nome do Tabela TBCLIENTE
Nome do Campo Tipo e Tamanho Complemento
CODCLI CHAR(04) UNIQUE NOT NULL
NOMECLI VARCHAR(30) NOT NULL
ENDCLI VARCHAR(40)
FONECLI CHAR(09)
EMAILCLI VARCHAR(50)
CPFCLI CHAR(11)
SALDOCLI DECIMAL(9,2)
Parte 6
www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218
22
Layout da SYSOUT
1 2 3 4 5
12345678901234567890123456789012345678901234567890
**************************************************
* DATA GREGORIANA 1 - 99/99/2099 *
* DATA GREGORIANA 2 - 99 DE XXXXXXXXX DE 2099 *
* DATA JULIANA – 999 DE 2099 *
* DIA DA SEMANA – XXXXXXXXXXXXX *
**************************************************
==================================================
== ESTATISTICA FINAL DE PROCESSAMENTO ==
==================================================
QTDE. PRODUTOS LIDOS CADPRDD1........: ZZ.ZZ9
QTDE. PRODUTOS INSERIDOS TBPRODUTO...: ZZ.ZZ9
QTDE. PRODUTOS DUPLICADOS............: ZZ.ZZ9
QTDE. PRODUTOS INVALIDOS.............: ZZ.ZZ9
==================================================
TEMPO TOTAL DE PROCESSAMENTO.........: HH:MM:SS:CC
==================================================
== TERMINO NORMAL DO PROGRAMA EXECARGA ==
==================================================
BOOK VARDATA
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
* VARIAVEL DA DATA *
01 WS-DATA-SISTEMA.
05 WS-ANO PIC 9(02).
05 WS-MES PIC 9(02).
05 WS-DIA PIC 9(02).
01 WS-DATA-JUL.
05 WS-ANO-J PIC 9(02).
05 WS-DIA-J PIC 9(03).
01 WS-DATA-SISTEMA-F.
05 WS-DIA PIC 9(02).
05 FILLER PIC X(01)
VALUE "/".
05 WS-MES PIC 9(02).
05 FILLER PIC X(01)
VALUE "/".
05 FILLER PIC X(02)
VALUE "20".
05 WS-ANO PIC 9(02).
77 WS-MES-EXT PIC X(09).
77 WS-DIA-SEMANA PIC 9.
77 WS-DIA-SEMANA-F PIC X(13).
Parte 6
www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218
23
6
BOOK VARTEMPO
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
*----------------------------------------------------------------*
* VARIAVEL DO HORARIO *
*----------------------------------------------------------------*
01 WS-HORARIO-INICIAL.
05 WS-HORA-I PIC 9(02).
05 WS-MIN-I PIC 9(02).
05 WS-SEG-I PIC 9(02).
05 WS-CENT-I PIC 9(02).
01 WS-HORARIO-FINAL.
05 WS-HORA-F PIC 9(02).
05 WS-MIN-F PIC 9(02).
05 WS-SEG-F PIC 9(02).
05 WS-CENT-F PIC 9(02).
01 WS-TEMPO-PROCESSAMENTO.
05 WS-HORA-P PIC 9(02).
05 FILLER PIC X(01)
VALUE ":".
05 WS-MIN-P PIC 9(02).
05 FILLER PIC X(01)
VALUE ":".
05 WS-SEG-P PIC 9(02).
05 FILLER PIC X(01)
VALUE ":".
05 WS-CENT-P PIC 9(02).
77 WS-DIFERENCA PIC 9(07).
BOOK ROTINA DE CÁLCULO DO TEMPO DE PROCESSAMENTO
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
*----------------------------------------------------------------*
* ROTINA PARA CALCULO DO TEMPO DE PROCESSAMENTO BASEADO NA *
* DIFERENCA EM CENTESIMOS DE SEGUNDO ENTRE O INICIO E O *
* TERMINO DO PROCESSAMENTO. *
*----------------------------------------------------------------*
9000-CALCULA-TEMPO-PROC.
COMPUTE WS-DIFERENCA = ( WS-HORA-F * 360000 +
WS-MIN-F * 6000 +
WS-SEG-F * 100 +
WS-CENT-F ) -
( WS-HORA-I * 360000 +
WS-MIN-I * 6000 +
WS-SEG-I * 100 +
WS-CENT-I )
COMPUTE WS-HORA-P = WS-DIFERENCA / 360000
COMPUTE WS-DIFERENCA = WS-DIFERENCA - WS-HORA-P * 360000
COMPUTE WS-MIN-P = WS-DIFERENCA / 6000
COMPUTE WS-DIFERENCA = WS-DIFERENCA - WS-MIN-P * 6000
COMPUTE WS-SEG-P = WS-DIFERENCA / 100
COMPUTE WS-DIFERENCA = WS-DIFERENCA - WS-SEG-P * 100
COMPUTE WS-CENT-P = WS-DIFERENCA
.
Parte 6
www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218
24
BOOK ROTINA IMPRIME DATA
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
*----------------------------------------------------------------*
* ROTINA PARA DETERMINAR E IMPRIMIR *
* A) DATA GREGORIANA *
* B) DATA JULIANA *
* C) DIA DA SEMANA *
*----------------------------------------------------------------*
9000-IMPRIME-DATA.
ACCEPT WS-DATA-SISTEMA FROM DATE
ACCEPT WS-DATA-JUL FROM DAY
ACCEPT WS-DIA-SEMANA FROM DAY-OF-WEEK
EVALUATE WS-DIA-SEMANA
WHEN 1 MOVE "SEGUNDA-FEIRA" TO WS-DIA-SEMANA-F
WHEN 2 MOVE "TERCA-FEIRA" TO WS-DIA-SEMANA-F
WHEN 3 MOVE "QUARTA-FEIRA" TO WS-DIA-SEMANA-F
WHEN 4 MOVE "QUINTA-FEIRA" TO WS-DIA-SEMANA-F
WHEN 5 MOVE "SEXTA-FEIRA" TO WS-DIA-SEMANA-F
WHEN 6 MOVE "SABADO" TO WS-DIA-SEMANA-F
WHEN 7 MOVE "DOMINGO" TO WS-DIA-SEMANA-F
END-EVALUATE
MOVE CORR WS-DATA-SISTEMA TO WS-DATA-SISTEMA-F
EVALUATE WS-MES OF WS-DATA-SISTEMA
WHEN 1 MOVE "JANEIRO" TO WS-MES-EXT
WHEN 2 MOVE "FEVEREIRO" TO WS-MES-EXT
WHEN 3 MOVE "MARCO" TO WS-MES-EXT
WHEN 4 MOVE "ABRIL" TO WS-MES-EXT
WHEN 5 MOVE "MAIO" TO WS-MES-EXT
WHEN 6 MOVE "JUNHO" TO WS-MES-EXT
WHEN 7 MOVE "JULHO" TO WS-MES-EXT
WHEN 8 MOVE "AGOSTO" TO WS-MES-EXT
WHEN 9 MOVE "SETEMBRO" TO WS-MES-EXT
WHEN 10 MOVE "OUTUBRO" TO WS-MES-EXT
WHEN 11 MOVE "NOVEMBRO" TO WS-MES-EXT
WHEN 12 MOVE "DEZEMBRO" TO WS-MES-EXT
END-EVALUATE
DISPLAY "************************************************"
DISPLAY "* DATA GREGORIANA 1 - "
WS-DATA-SISTEMA-F
" *"
DISPLAY "* DATA GREGORIANA 2 - "
WS-DIA OF WS-DATA-SISTEMA
" DE "
WS-MES-EXT
" DE 20"
WS-ANO OF WS-DATA-SISTEMA
" *"
DISPLAY "* DATA JULIANA - "
WS-DIA-J OF WS-DATA-JUL
" DE 20"
WS-ANO-J OF WS-DATA-JUL
" *"
DISPLAY "* DIA DA SEMANA - "
WS-DIA-SEMANA-F
" *"
DISPLAY "************************************************"
.
Parte 6
www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218
25
6
Programa COBOL
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
*----------------------------------------------------------------*
ID DIVISION.
*----------------------------------------------------------------*
PROGRAM-ID. EXECARGA.
*----------------------------------------------------------------*
ENVIRONMENT DIVISION.
*----------------------------------------------------------------*
CONFIGURATION SECTION.
SPECIAL-NAMES.
DECIMAL-POINT IS COMMA.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT CADCLI ASSIGN TO UT-S-CADCLI
FILE STATUS IS FS-CADCLI
.
*----------------------------------------------------------------*
DATA DIVISION.
*----------------------------------------------------------------*
FILE SECTION.
FD CADCLI
RECORDING MODE IS F.
COPY BKEXEAC REPLACING ==::== BY ====.
*----------------------------------------------------------------*
WORKING-STORAGE SECTION.
*----------------------------------------------------------------*
* BOOK DA VARIAVEL ESPELHO
COPY BKEXEAC REPLACING ==::== BY ==WS-==.
* BOOK DAS VARIAVEIS PARA CALCULO DO TEMPO
COPY VARDATA.
COPY VARTEMPO.
* BOOK DAS VARIAVEIS HOSPEDEIRAS
EXEC SQL
INCLUDE BKEXETC
END-EXEC
* BOOK DAS VARIAVEIS PARA USO DO SQL
EXEC SQL
INCLUDE SQLCA
END-EXEC
01 WS-CONTADORES-COMP.
05 WS-CTLIDO PIC 9(04) COMP.
05 WS-CTINS PIC 9(04) COMP.
05 WS-CTDUP PIC 9(04) COMP.
05 WS-CTINV PIC 9(04) COMP.
Parte 6
www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218
26
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
01 WS-CONTADORES-FORMATADOS.
05 WS-CTLIDO-F PIC ZZZ9.
05 WS-CTINS-F PIC ZZZ9.
05 WS-CTDUP-F PIC ZZZ9.
05 WS-CTINV-F PIC ZZZ9.
01 FS-CADCLI PIC X(02).
88 SUCESSO-CAD VALUE "00".
88 FIM-ARQ-CAD VALUE "10".
77 WS-SQLCODE PIC +9(9).
77 WS-MSG PIC X(60).
77 WS-FS PIC X(02).
*----------------------------------------------------------------*
PROCEDURE DIVISION.
*----------------------------------------------------------------*
0000-PRINCIPAL.
PERFORM 1000-INICIALIZAR
PERFORM 2000-PROCESSAR UNTIL FIM-ARQ-CAD
PERFORM 3000-TERMINO
STOP RUN
.
1000-INICIALIZAR.
ACCEPT WS-HORARIO-INICIAL FROM TIME
MOVE 0 TO WS-CTLIDO
WS-CTINS
WS-CTDUP
WS-CTINV
OPEN INPUT CADCLI
IF NOT SUCESSO-CAD
MOVE "ERRO ABERTURA CADCLI" TO WS-MSG
MOVE FS-CADCLI TO WS-FS
PERFORM 9000-ERRO
END-IF
PERFORM 1500-LER-CADCLI
.
1500-LER-CADCLI.
READ CADCLI INTO WS-REG-CADCLI
IF SUCESSO-CAD
ADD 1 TO WS-CTLIDO
ELSE
IF NOT FIM-ARQ-CAD
MOVE "ERRO LEITURA CADCLI"
TO WS-MSG
MOVE FS-CADCLI TO WS-FS
PERFORM 9000-ERRO
END-IF
END-IF
.
Parte 6
www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218
27
6
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
2000-PROCESSAR.
*----------------------------------------------------------------*
* MOVER DADOS DA VARIAVEL ESPELHO PARA A HOSPEDEIRA
*----------------------------------------------------------------*
MOVE WS-CODCLI-CADCLI TO CODCLI
MOVE +30 TO NOMECLI-LEN
MOVE WS-NOMECLI-CADCLI TO NOMECLI-TEXT
MOVE +40 TO ENDCLI-LEN
MOVE WS-ENDCLI-CADCLI TO ENDCLI-TEXT
MOVE WS-FONECLI-CADCLI TO FONECLI
MOVE +50 TO EMAILCLI-LEN
MOVE WS-EMAILCLI-CADCLI TO EMAILCLI-TEXT
MOVE WS-CPFCLI-CADCLI TO CPFCLI
MOVE WS-SALDOCLI-CADCLI TO SALDOCLI
*----------------------------------------------------------------*
* INSERIR OS DADOS DA HOSPEDEIRA NA TABELA (SQL FIELDS)
*----------------------------------------------------------------*
EXEC SQL
INSERT INTO TBCLIENTE
( CODCLI
, NOMECLI
, ENDCLI
, FONECLI
, EMAILCLI
, CPFCLI
, SALDOCLI
)
VALUES
( :CODCLI
,:NOMECLI
,:ENDCLI
,:FONECLI
,:EMAILCLI
,:CPFCLI
,:SALDOCLI
)
END-EXEC
*----------------------------------------------------------------*
* TESTAR SQLCODE
*----------------------------------------------------------------*
EVALUATE SQLCODE
WHEN 0
ADD 1 TO WS-CTINS
WHEN -803
ADD 1 TO WS-CTDUP
WHEN -545
ADD 1 TO WS-CTINV
WHEN OTHER
MOVE "ERRO INSERT TBCLIENTE"
TO WS-MSG
MOVE SQLCODE TO WS-SQLCODE
PERFORM 9000-ERRO-DB2
END-EVALUATE
PERFORM 1500-LER-CADCLI
.
Parte 6
www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218
28
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
3000-TERMINO.
CLOSE CADCLI
IF NOT SUCESSO-CAD
MOVE "ERRO FECHAMENTO CADCLI"
TO WS-MSG
MOVE FS-CADCLI TO WS-FS
PERFORM 9000-ERRO
END-IF
ACCEPT WS-HORARIO-FINAL FROM TIME
PERFORM 9000-CALCULA-TEMPO-PROC
MOVE WS-CTLIDO TO WS-CTLIDO-F
MOVE WS-CTINS TO WS-CTINS-F
MOVE WS-CTDUP TO WS-CTDUP-F
MOVE WS-CTINV TO WS-CTINV-F
PERFORM 9000-IMPRIME-DATA
DISPLAY " "
DISPLAY " "
DISPLAY "=================================================="
DISPLAY "== ESTATISTICA FINAL DE PROCESSAMENTO =="
DISPLAY "=================================================="
DISPLAY "QTDE. CLIENTES LIDOS CADCLI..........: " WS-CTLIDO-F
DISPLAY "QTDE. CLIENTES INSERIDOS TBCLIENTE...: " WS-CTINS-F
DISPLAY "QTDE. CLIENTES DUPLICADOS............: " WS-CTDUP-F
DISPLAY "QTDE. CLIENTES INVALIDOS.............: " WS-CTINV-F
DISPLAY "=================================================="
DISPLAY "TEMPO TOTAL DE PROCESSAMENTO.........: "
WS-TEMPO-PROCESSAMENTO
DISPLAY "=================================================="
DISPLAY "== TERMINO NORMAL DO PROGRAMA EXECARGA =="
DISPLAY "=================================================="
.
9000-ERRO.
DISPLAY "=================================================="
DISPLAY "MENSAGEM....: " WS-MSG
DISPLAY "FILE STATUS.: " WS-FS
DISPLAY "=================================================="
DISPLAY "== TERMINO ANORMAL DO PROGRAMA EXECARGA =="
DISPLAY "=================================================="
MOVE 12 TO RETURN-CODE
STOP RUN
.
9000-ERRO-DB2.
DISPLAY "=================================================="
DISPLAY "MESSAGE..: " WS-MSG
DISPLAY "SQLCODE..: " WS-SQLCODE
DISPLAY "SQLERRMC.: " SQLERRMC
DISPLAY "=================================================="
DISPLAY "== TERMINO ANORMAL DO PROGRAMA EXECARGA =="
DISPLAY "=================================================="
MOVE 16 TO RETURN-CODE
STOP RUN
.
* BOOK DA ROTINA 9000-IMPRIME-DATA
COPY IMPDATA.
* BOOK DA ROTINA 9000-CALCULA-TEMPO-PROC
COPY CALCTEMP.
Parte 6
www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218
29
6
Criar a tabela TESTEDCL descrita abaixo e
preencher o quadro com os tipos de dados gerados para
o COBOL pelo DCLGEN. (membro CREATET no
JCLDATA).
Coluna
Tipo DB2
Tipo COBOL
CAMPO01 CHAR(5)
CAMPO02 VARCHAR(20)
CAMPO03 INTEGER
CAMPO04 SMALLINT
CAMPO05 DECIMAL(10,4)
CAMPO06 REAL
CAMPO07 DOUBLE
CAMPO08 DATE
CAMPO09 TIME
CAMPO10 TIMESTAMP
Practice
Atividade Prática de laboratório
Parte 6
www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218
30
Fazer a DECLARATION para a tabela TBCLI,
baseado nos tipos dados gerados pelo DCLGEN do
exercício anterior e nas colunas abaixo.
CODCLI INTEGER UNIQUENOT NULL
NOMECLI VARCHAR(40) NOT NULL
ENDCLI VARCHAR(60)
NASCCLI DATE
ALTURACLI DECIMAL(3,2)
PESOCLI DECIMAL(4,1)
WORKING-STORAGE SECTION.
Atividade Revisão aos pares
Parte 6
www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218
31
6
Objetivo do Programa
A Metal Screws Inc. está implantando o Sistema Gerenciador de banco de Dados DB2 e está migrando seus dados de arquivos sequenciais para tabelas em um banco de dados relacional.
Escrever um programa para ler os produtos do arquivo sequencial CADPRDD1 e carregar a tabela TBPRODUTO.
Macro-Fluxo
Atividade Projeto 1 - carga
Performance
TBPRODUTO
CADPRDD1
GPXXNND1
Parte 6
www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218
32
Layout do Arquivo
Layout da Tabela
Nome do Arquivo CADPRDD1
Nome do Registro REG-CADPRDD1
Nome do Campo Tipo e Tamanho
Descrição
CODPROD-D1 X(04) Código
DESCPROD-D1 X(20) Descrição
UNIDPROD-D1 X(05) Unidade (caixa, litro, Kg, etc)
LOCALPROD-D1 X(05) Localização no estoque
QTDEST-D1 9(05) Quantidade em estoque
QTDMAX-D1 9(05) Quantidade máxima em estoque
QTDMIN-D1 9(05) Quantidade mínima em estoque
PRECOCOMPRA-D1 9(06)V99 Preço de Compra
PRECOVENDA-D1 9(06)V99 Preço de Venda
PERCOMIS-D1 9(02)V99 Percentual de comissão
Nome da tabela TBPRODUTO
Nome da coluna Tipo e Tamanho
Complementos
CODPROD CHAR(4) UNIQUE NOT NULL
DESCPROD VARCHAR(20) NOT NULL
UNIDPROD CHAR(5)
LOCALPROD CHAR(5)
QTDEST DECIMAL(5,0)
QTDMAX DECIMAL(5,0) > QTDMIN
QTDMIN DECIMAL(5,0) < QTDMAX
PRECOCOMPRA DECIMAL(8,2) >=0
PRECOVENDA DECIMAL(8,2) >=0
PERCOMIS DECIMAL(4,2) >=0
Parte 6
www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218
33
6
Layout da SYSOUT
1 2 3 4 5
12345678901234567890123456789012345678901234567890
**************************************************
* DATA GREGORIANA 1 - 99/99/2099 *
* DATA GREGORIANA 2 - 99 DE XXXXXXXXX DE 2099 *
* DATA JULIANA – 999 DE 2099 *
* DIA DA SEMANA – XXXXXXXXXXXXX *
**************************************************
==================================================
== ESTATISTICA FINAL DE PROCESSAMENTO ==
==================================================
QTDE. PRODUTOS LIDOS CADPRDD1........: ZZ.ZZ9
QTDE. PRODUTOS INSERIDOS TBPRODUTO...: ZZ.ZZ9
QTDE. PRODUTOS DUPLICADOS............: ZZ.ZZ9
QTDE. PRODUTOS INVALIDOS.............: ZZ.ZZ9
==================================================
TEMPO TOTAL DE PROCESSAMENTO.........: HH:MM:SS:CC
==================================================
== TERMINO NORMAL DO PROGRAMA GPXXNND1 ==
==================================================
Observação
Dar carga em tabelas a partir de dados armazenados em arquivos
sequenciais é uma atividade comum na implantação de um sistema novo. Execute
os passos abaixo (Lembre-se de que XXNN é o seu prefixo de usuário):
1) Edite o membro BK001D1 em sua BOOKLIB com as variáveis espelho do
arquivo CADPRDD1. (Usar coringa vazio ::)
2) Copie o membro CREATEP da JCLDATA de seu instrutor para a sua
JCLDATA. Esse membro contém os comandos SQL DDL para a definição
da tabela TBPRODUTO, índice, chave primária e constraints.
3) Via SPUFI execute o membro CREATEP, criando a tabela TBPRODUTO e
seu índice IDXPRODUTO.
4) Via DCLGEN crie a DECLARATION para a tabela TBPRODUTO em sua
BOOKLIB no membro BK002TP
5) Edite o programa GPXXNND1 na sua COBLIB.
Parte 6
www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218
34
Orientação para processamento
Como foi visto, não pode haver um parágrafo principal.
Executa o parágrafo 1000-INICIALIZAR
Executa o parágrafo 2000-PROCESSAR
até que o file status do arquivo CADPRDD1 seja “10”
Executar o parágrafo 3000-TERMINO
Encerrar o programa
Parágrafo 1000-INICIALIZAR
Receber o horário inicial de processamento
Mover zero para os contadores:
produtos lidos
produtos inseridos
produtos duplicados
produtos inválidos
Abrir para leitura o arquivo CADPRDD1
Se file status for diferente de “00”
Mover mensagem de erro para variável da rotina de erro
Mover file status para variáveis da rotina de erro
Executar rotina de erro (9000-ERRO)
Ler o primeiro registro do arquivo CADPRDD1 (1100-LER-CADPRDD1)
Parágrafo 1100-LER-CADPRDD1
Ler registro do arquivo CADPRDD1 carregando variável espelho
Se file status for igual a “00” (sucesso)
Somar 1 ao contador de produtos lidos
Senão
Se file status for diferente de “10” (fim de arquivo)
Mover mensagem de erro para variável da rotina de erro
Mover file status para variáveis da rotina de erro
Executar rotina de erro (9000-ERRO)
Parte 6
www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218
35
6
Parágrafo 2000-PROCESSAR
Mover os dados da variável espelho para a hospedeira
Inserir o registro na tabela TBPRODUTO (INSERT) e testar SQLCODE:
se SQLCODE = 0
somar 1 ao contador de produto inserido
se SQLCODE = -803
somar 1 ao contador de produto duplicado
se SQLCODE = -545
somar 1 ao contador de produto inválidos
senão
mover mensagem de erro para variável da rotina de erro
mover SQLCODE para variável formatada
executar a rotina de erro para DB2 (9000-ERRO-DB2)
Ler o próximo registro do arquivo CADPRDD1(1100-LER-CADPRDD1)
Parágrafo 3000-TERMINO
Fechar o arquivo CADPRDD1
Se file status for diferente de “00”
Mover mensagem de erro para variável da rotina de erro
Mover file status para variáveis da rotina de erro
Executar rotina de erro (9000-ERRO)
Receber o horário final de processamento
Calcular o tempo de processamento
Exibir SYSOUT de acordo com LAYOUT
Exibir contador de produtos lidos
Exibir contador de produtos inseridos
Exibir contador de produtos duplicado
Exibir contador de produtos inválido
Exibir o tempo total de processamento
Parágrafo 9000-ERRO
Exibir mensagem de erro
Exibir file status
Abendar o programa com RETURN-CODE = 12
Parágrafo 9000-ERRO-DB2
Exibir mensagem de erro
Exibir SQLCODE formatado
Exibir SQLERRMC (mensagem de erro do SQLCODE)
Abendar o programa com RETURN-CODE = 16
Usar EVALUTE aqui,
entendeu ?
Parte 6
www.grandeporte.com.br (11) 4427-4579(11) 9 9903-3218
36
Avaliação Então...Como foi ?!?
Estou fera!
Fiz Certo!
Muito Bom Bom regular ruim Muito ruim
Parte
Hugh Darwen é um cientista da computação quetrabalhou na IBM do Reino Unido de 1967 até 2004 eesteve envolvido com a história do modelo relacional.Entre 1978 e 1982 ele foi o arquiteto chefe do Business
System 12, um sistema de gerenciamento de dados queseguia fielmente os princípios do modelo relacional. Eletrabalhou próximo a Christopher J. Date e representou aIBM nos comites da ISO SQL até sua aposentadoria daIBM.
Hugh Darwen
1943 (69 anos)
Versão 2.2.3
Parte 7
www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218
3
7
Antes de iniciarmos, vamos conversar sobre os tópicos apresentados na capa desta parte. Isso é importante para que seu instrutor e seus colegas saibam como está seu conhecimento sobre o assunto e se você precisa ou pode fornecer ajuda aos colegas e instrutor.
O que você já sabe ?
O que você não sabe ?
Porque é importante conhecer estes tópicos ?
Quais são os seus temores ?
O que você considera difícil ?
Depois de falar sobre o assunto com seus colegas e instrutor, escreva,
desenhe, rabisque, diga algo sobre o que você vai fazer para dominar esses tópicos. Comprometa-se!
Preparation
Trocando Ideias É agora que você fala !!
Reflexão É aqui que você se compromete !!
Parte 7
www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218
4
Vamos agora colocar tudo junto. Escreveremos um programa que vai Inserir,
Excluir, Alterar e Consultar dados em uma tabela, tudo em um mesmo programa.
É a oportunidade de ver os quatro comandos da SQL DML funcionando junto,
testando seus SQLCODEs específicos, utilizando as variáveis hospedeiras (de
tabelas) com variáveis espelho (de arquivos) e ainda verificando pelos INDICATORs
se os dados lidos das tabelas estão corretos.
Mas antes, é importante entender como é o processo de transformar um
programa COBOL com SQL em programa executável (LOAD MODULE). Trata-se do
processo de Pré-Compilação, Compilação, Link-edição e Bind. Entenda bem esse
processo, pois sempre que você diz a alguém mais experiente que sabe programar
COBOL com SQL ele vai logo perguntando: — Você sabe o que é BIND?
Então vamos por tudo junto, ou em inglês Let´s put it all together.
Presentation
História Let´s put it all together
Parte 7
www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218
5
7
Programas COBOL com comandos SQL estáticos passam por um processo de
compilação formado por quarto passos: Pré-compilação, Compilação, Link-edição e Bind. A
figura abaixo ilustra esses passos:
Teoria Compilando Cobol + sql(DB2)
Programa Fonte
COBOL
+
SQL
1º. Passo
PRE-COMPILE
Programa fonte
modificadosó COBOL
DBRM
Acessos DB2só SQL
2º. Passo
COMPILE
4º. Passo
BIND
BOOKs
LIBRARY
3º. Passo
LINK-EDIT
LOAD MODULEPACKAGE
COLLECTION
PLAN
PROGRAMA
OBJETO
GP.GPXXNN.COBLIB(GPXXNND1)
GP.GPXXNN.JOBLIB(COMPBDB2)
TIMESTAMP TIMESTAMP
TIMESTAMPGP.GERAL.LOADLIB(GPXXNND1)
p
d
s
SD.ST? JOBIDS SYSPRINT
SPOOL
A
TIMESTAMP
GP.GPXXNN.BOOKLIB(GPXXNND1)
i
k
SYS2.DB2.DBRMLIB.DATA(GPXXNND1)
SYSIBM.SYSPACKAGES
Parte 7
www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218
6
1º Passo – Processo de Pré-Compilação
a) Primeiro ele verifica se há erros (análise sintática) nos comandos SQL.
b) Segundo ele faz o INCLUDE das áreas (book de variáveis), valida as variáveis
hospedeiras (host variables) e adiciona variáveis de trabalho (para uso interno)
na WORKING-STORAGE SECTION. Uma dessas variáveis contém a literal
“Timestamp” chamada Token de Consistência.
c) Terceiro ele insere código fonte compatível com o COBOL, usado para evocar
o DB2, convertendo as instruções EXEC SQL...END-EXEC em comentário,
substituindo-as por CALL.
d) Quarto ele extrai todos os comandos SQL do programa fonte, colocando-os
em um membro com o mesmo nome do programa no arquivo particionado em
SYS2.DB2.DBRMLIB.DATA. Esse membro contém o DBRM (Data Base
Request Module) com o mesmo Token de Consistência.
2º Passo – Compilação
O Programa fonte modificado pelo pré-compilador é então compilado. O
código é verificado em busca de erros e uma versão compilada (Programa Objeto) é
criada.
3º Passo – Link-edição
O programa objeto é link-editado junto com os calls estáticos do programa
fonte e os módulos run-time (em tempo de execução) do DB2 para criar o programa
executável LOAD MODULE (Módulo de Carga). Este LOAD MODULE contém o
mesmo Token de Consistência que foi gerado na Pré-Compilação.
4º Passo – BIND DB2 (Vinculo com DB2)
O processo de BIND lê o DBRM que foi criado e prepara um caminho de
acesso (access path) aos dados. Esse caminho de acesso, junto com o Token de
Consistência, é armazenado no catalogo do DB2 (SYSIBM.SYSPACKAGES) como
um PACKAGE (pacote). Cada pacote está ligado a uma lista de pacotes ou Collection
(coleção).
O nome da coleção é especificado pelo parâmetro PACKAGE.
Uma coleção é um grupo de pacotes que são inseridos em um ou mais planos.
O parâmetro qualifies (qualificador) do BIND é usado para direcionar o SQL para um
conjunto especifico de objetos DB2 (Table, View, Alias etc.) identificados por este
nome.
O plano ou pacote de aplicação é gerado pelo BIND para definir caminhos de
acesso.
O plano DB2 é uma forma executável de comandos SQL (DBRM). Podemos
definir o plano DB2 como um conjunto de ponteiros para pacotes, e pacotes contém
código de máquina dos melhores caminhos de acesso. O plano é criado
separadamente e não tem relação com a compilação.
Parte 7
www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218
7
7
Abaixo temos o job de compilação COMPBDB2 seguido de instruções de uso.
1 – substitua GPXXNNPP pelo nome do programa que deseja compilar
2 – Substitua GPXXNN pelo seu usuário
3 – Esta é a instalação do DB2 que será usada para definir o plano de acesso
1
2
3
Quando eu criei o
primeiro compilador
as coisas eram mais
simples...
Essa IBM !
Grace Hopper e
a traca (BUG),
Amiga !
Parte 7
www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218
8
Após a compilação, vá ao SPOOL (SD.ST) para analisar o resultado, conforme tela
abaixo:
1 – Quando aparecer somente esses três arquivos JES2, significa que há erro de
JCL e o JOB deve ser corrigido.
2 – Quando aparecer os arquivos PC (precompiler), significa que há erros nos
comandos SQL e o arquivo SYSPRINT COMPDB2B PC deve ser aberto em busca dos erros.
Atenção, a mensagem de notificação será JCL ERROR, mas não se engane, é erro de SQL.
3 – Quando aparecer o COB e der MAXCC > 0, há erros no COBOL. Esse arquivo
deve ser aberto e os erros corrigidos.
4 – Quando aparece o arquivo LKED, significa que o programa objeto (Load Module)
foi criado e pode ser executado.
5 – Quando aparece o arquivo BIND, significa que o plano de acesso foi criado com
sucesso, desde que MAXCC = 0.
1
2
34
5
Parte 7
www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218
9
7
O JOB de execução também deve apontar para a instalação de DB2 correta, usada
para compilar os programas, como mostra a tela abaixo.
1 – substitua GPXXNNPP pelo número do programa que deseja executar
2 – Substitua GPXXNN pelo seu usuário
3 – Esta é a instalação do DB2 que será usada para definir o plano de acesso
Quando um programa COBOL+DB2 executa, o plano e o pacote devem ser
especificados no JOB. Quando o primeiro comando SQL do programa é executado, o
DB2 pesquisa na coleção e no Token de Consistência do plano e do pacote
informado. Se o Token de Consistência não bater, o DB2 dá um SQLCODE = -805.
13
2
Teoria EXECUTANDO COBOL + DB2
Parte 7
www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218
10
Para se ler dados de uma tabela em um programa COBOL o comando básico
usado é o SELECT visto anteriormente. O SELECT precisa somente ser ampliado
para definir as HOST VARIABLES que devem receber os dados.
Existem dois processos de leitura no DB2:
o primeiro aplica-se quando o SELECT devolve somente uma linha da
tabela
o segundo processo quando a tabela resultado do SELECT contém mais de
uma linha.
ACESSANDO 1 LINHA DA TABELA
Quando a tabela resultado do SELECT contém somente uma linha, o
parâmetro INTO acrescentado ao SELECT é suficiente para definir as HOST
VARIABLES de leitura. A sintaxe deste SELECT é:
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
PROCEDURE DIVISION.
......
EXEC SQL
SELECT coluna1 , coluna2 , ...
INTO :variavel1, :variavel2, ...
FROM tabela
WHERE restricao
END-EXEC
A variável do parâmetro INTO deve ser uma HOST VARIABLE (portanto
precedida por dois pontos). Além disso, se a coluna pesquisa for do tipo VARCHAR ou
a sua definição permitir valores NULL, é necessério acrescentar um INDICATOR na
HOST VARIABLE respectiva.
Se o comando SELECT estiver selecionando todas as colunas da tabela
(SELECT *), o argumento INTO pode apontar para o nivel 01 das HOST VARIABLES
como no exemplo:
Teoria Acessando tabelas com cobol
Parte 7
www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218
11
7
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
PROCEDURE DIVISION.
.......
EXEC SQL
SELECT *
INTO :DCLPRODUTO
FROM PRODUTO
WHERE CODPROD = ‘0001’
END-EXEC
IF SQLCODE = 0
ADD 1 TO WS-CTENCONTRADO
ELSE
IF SQLCODE = 100
ADD 1 TO WS-CTNAOENCONTRADO
ELSE
MOVE “ERRO NO SELECT” TO WS-MSG
MOVE SQLCODE TO WS-SQLCODE
PERFORM 9000-ERRO-DB2
END-IF
END-IF
ACESSANDO MAIS DE UMA LINHA DA TABELA
Quando o SELECT seleciona mais de uma linha, essa RESULT TABLE não
pode ser carregada na HOST VARIABLE apontada pela claúsula INTO, que comporta
apenas uma linha.
Se a lógica da aplicação estiver interessada apenas na primeira linha desta
RESULT TABLE, o parâmetro FETCH FIRST ROW ONLY (pegue apenas a primeira
linha) seleciona esta linha. A seguir a sintaxe deste SELECT
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
PROCEDURE DIVISION.
.......
EXEC SQL
SELECT coluna1 , coluna2, ...
INTO :variavel, :variavel2, ....
FROM tabela
WHERE restricao
FETCH FIRST ROW ONLY
END-EXEC
Exemplo:
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
PROCEDURE DIVISION.
.......
MOVE “000100” TO CODEMP
EXEC SQL
SELECT NOMEEMP, SALARIO
INTO :NOMEEMP, :SALARIO
FROM EMPREGADOS
WHERE CODEMP > :CODEMP
FETCH FIRST ROW ONLY
END-EXEC
Parte 7
www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218
12
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
IF SQLCODE = 0
ADD 1 TO WS-CTENCONTRADO
ELSE
IF SQLCODE = 100
ADD 1 TO WS-CTNAOENCONTRADO
ELSE
MOVE “ERRO NO SELECT” TO WS-MSG
MOVE SQLCODE TO WS-SQLCODE
PERFORM 9000-ERRO-DB2
END-IF
END-IF
ATUALIZANDO LINHAS DA TABELA
A síntaxe do comando para atualizar linhas em uma tabela é a mesma vista no
comando UPDATE de SQL, somente acrescentando que os argumentos informados
em SET podem ser constantes ou HOST VARIABLES.
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
PROCEDURE DIVISION.
.......
EXEC SQL
UPDATE tabela
SET coluna1 = :VARIAVEL1,
coluna2 = :variavel2,
......
WHERE condicao
END-EXEC
Se alguma das colunas do comando UPDATE for do tipo VARCHAR, o
INDICATOR precisa ser carregado com o comprimento real do valor da coluna.
Exemplo:
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
PROCEDURE DIVISION.
.......
MOVE 10 TO DESCRICAO-LEN
MOVE WS-DESCPROD TO DESCRICAO-TEXT
EXEC SQL
UPDATE PRODUTO
SET DESCRICAO = :DESCRICAO
WHERE CODIGO = :CODIGO
END-EXEC
IF SQLCODE = 0
ADD 1 TO WS-CTATUALIZADO
ELSE
IF SQL CODE = -545
ADD 1 TO WS-CTINVALIDO
ELSE
IF SQLCODE = +100
ADD 1 TO WS-CTNAOENCONTRADO
ELSE
MOVE “ERRO NO UPDATE” TO WS-MSG
MOVE SQLCODE TO WS-SQLCODE
PERFORM 9000-ERRO-DB2
END-IF
END-IF
END-IF
Parte 7
www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218
13
7
EXCLUINDO LINHAS DA TABELA
A sintaxe do comando para excluir linhas em uma tabela é a mesma vista no
comando DELETE de SQL. A Sintaxe para o comando é:
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
PROCEDURE DIVISION.
.......
EXEC SQL
DELETE FROM tabela
WHERE restricao
END-EXEC
Exemplo:
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
PROCEDURE DIVISION.
.......
MOVE WS-CODPROD TO CODIGO
EXEC SQL
DELETE FROM PRODUTO
WHERE CODIGO = :CODIGO
END-EXEC
IF SQLCODE = 0
ADD 1 TO WS-CTEXCLUIDO
ELSE
IF SQLCODE = 100
ADD 1 TO WS-CTNAOENCONTRADO
ELSE
MOVE “ERRO NO DELETE” TO WS-MSG
MOVE SQLCODE TO WS-SQLCODE
PERFORM 9000-ERRO-DB2
END-IF
END-IF
Parte 7
www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218
14
INDICATORS são variáveis do programa COBOL usadas nos comandos SQL
para:
Informar o comprimento real dos valores contidos em colunas VARCHAR.
Informar se uma coluna contém NULL.
Informar erros de conversão entre o valor das colunas e as HOST VARIABLES.
Este INDICATOR receberá um dos seguintes valores após a execução de um
SELECT:
INDICATOR = -1 Coluna contém NULL
INDICATOR = -2
Erro na conversão de valores. -2 significa nulo porque um
comando aritmético não funcionou, também causa SQLCODE =
+802
INDICATOR = 0 Coluna contém valores normais
INDICATOR > 0
Comprimento original dos dados que foram truncados no
momento da carga na HOST VARIABLE ou comprimento de um
VARCHAR
Teoria INDICATORS
INSERT DELETE UPDATE SELECT FETCH
**
* Precisam de INDICATORS
COBOL (VARIÁVEL HOSPERDEIRA)
DB2 (SQL FIELDS - COLUNAS)
Parte 7
www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218
15
7
Os INDICATORS devem ser variáveis com formato PIC S9(4) COMP (lembre-
se que é o formato binário e ocupa 2 bytes na RAM), e quando necessário deve haver
um INDICATOR para cada coluna da tabela.
O DCLGEN cria automaticamente um INDICATOR para toda coluna VARCHAR.
No exemplo anterior para a coluna DESCPROD foram criadas as variáveis
hospedeiras DESCPROD–LEN (INDICATOR) e DESCPROD–TEXT.
Para solicitar ao DCLGEN a criação de INDICATOR para todas as colunas de
uma tabela, basta colocar YES no campo 12 (INDICATOR VAR), como mostra a figura
abaixo:
Parte 7
www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218
16
Na declaração da tabela PRODUTO é criado um vetor IPRODUTO
(Inome_da_tabela) com seus elementos INDSTRUC(n) onde n varia de 1 até a
quantidade de colunas da tabela, em nosso exemplo 10.
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
******************************************************************
* DCLGEN TABLE(PRODUTO) *
* LIBRARY(GP.GPAZ99.BOOKLIB(PRODUTO)) *
* LANGUAGE(COBOL) *
* QUOTE *
* INDVAR(YES) *
* ... IS THE DCLGEN COMMAND THAT MADE THE FOLLOWING STATEMENTS *
******************************************************************
EXEC SQL DECLARE PRODUTO TABLE
( CODPROD CHAR(4) NOT NULL,
DESCPROD VARCHAR(20) NOT NULL,
UNIDPROD CHAR(5),
LOCALPROD CHAR(5),
QTDEST DECIMAL(5, 0),
QTDMAX DECIMAL(5, 0),
QTDMIN DECIMAL(5, 0),
PRECOCOMPRA DECIMAL(8, 2),
PRECOVENDA DECIMAL(8, 2),
PERCOMIS DECIMAL(4, 2)
) END-EXEC.
******************************************************************
* COBOL DECLARATION FOR TABLE PRODUTO *
******************************************************************
01 DCLPRODUTO.
10 CODPROD PIC X(4).
10 DESCPROD.
49 DESCPROD-LEN PIC S9(4) USAGE COMP.
49 DESCPROD-TEXT PIC X(20).
10 UNIDPROD PIC X(5).
10 LOCALPROD PIC X(5).
10 QTDEST PIC S9(5)V USAGE COMP-3.
10 QTDMAX PIC S9(5)V USAGE COMP-3.
10 QTDMIN PIC S9(5)V USAGE COMP-3.
10 PRECOCOMPRA PIC S9(6)V9(2) USAGE COMP-3.
10 PRECOVENDA PIC S9(6)V9(2) USAGE COMP-3.
10 PERCOMIS PIC S9(2)V9(2) USAGE COMP-3.
******************************************************************
* INDICATOR VARIABLE STRUCTURE *
******************************************************************
01 IPRODUTO.
10 INDSTRUC PIC S9(4) USAGE COMP OCCURS 10 TIMES.
******************************************************************
* THE NUMBER OF COLUMNS DESCRIBED BY THIS DECLARATION IS 10 *
******************************************************************
INDICATOR COLUNA
INDSTRUC(1) CODPROD
INDSTRUC(2) DESCPROD
INDSTRUC(3) UNIDPROD
INDSTRUC(4) LOCALPROD
INDSTRUC(5) QTDEST
INDSTRUC(6) QTDMAX
INDSTRUC(7) QTDMIN
INDSTRUC(8) PRECOCOMPRA
INDSTRUC(9) PRECOVENDA
INDSTRUC(10) PERCOMIS
Parte 7
www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218
17
7
Para se codificar o INDICATOR, basta colocá-lo após a HOST VARIABLE,
precedido ou não pela palavra INDICATOR.
Sintaxes:
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
:variavel1 :indicator1, ...
ou
:variavel1 INDICATOR :indicator1, ...
Exemplo:
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
WORKING-STORAGE SECTION.
01 WS-INDICADORES.
05 INDNOMEEMP PIC 9S(4) COMP.
05 INDSALARIO PIC 9S(4) COMP.
PROCEDURE DIVISION.
MOVE “000001” TO CODEMP
EXEC SQL
SELECT CODEMP, NOMEEMP, SALARIO
INTO :CODEMP,
:NOMEEMP INDICATOR :INDNOMEEMP,
:SALARIO INDICATOR :INDSALARIO
FROM EMPREGADOS
WHERE CODEMP = :CODEMP
END-EXEC
Este exemplo lê o nome e salário do empregado 000001. Note que as variáveis
NOMEEMP, SALARIO e CODEMP que estão precedidas por (:) são as HOST
VARIABLES, e devem estar incluídas na área do INCLUDE da declaração da tabela
EMPREGADO na WORKING-STORAGE SECTION. Também a HOST VARIABLE
NOMEEMP esta acompanhada pelo seu INDICATOR INDNOMEEMP.
Se na definição da HOST VARIABLE, houver um sub-nível da variável para
servir como INDICATOR, o INDICATOR pode ser omitido na cláusula INTO. Exemplo:
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
WORKING-STORAGE SECTION.
.......
10 NOMEEMP.
49 NOMEEMP-TEXT PIC X(20).
49 NOMEEMP-LEN PIC S9(4) COMP.
PROCEDURE DIVISION.
.......
EXEC SQL
SELECT NOMEEMP, SALARIO
INTO :NOMEEMP, :SALARIO
FROM EMPREGADOS
WHERE CODDEP = :DEPTO
END-EXEC
Atenção, não pode haver vírgula entre a HOST VARIABLE e o seu INDICATOR.
Parte 7
www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218
18
Qual coluna usar o indicator
Verifique no Declaration da tabela as colunas sem o NOT NULL. Elas podem
então assumir valores nulos, o que obriga o uso de INDICATOR. Aquelas com NOT
NULL têm a garantia do DB2 que jamais receberão valores nulos e, portanto, não
precisam de indicator.
Por exemplo, na declaration abaixo, apenas as colunas CODPROD e
DESCPROD não precisam de indicator:
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
******************************************************************
* DCLGEN TABLE(PRODUTO) *
* LIBRARY(GP.GPAZ99.BOOKLIB(PRODUTO)) *
* LANGUAGE(COBOL) *
* QUOTE *
* INDVAR(YES) *
* ... IS THE DCLGEN COMMAND THAT MADE THE FOLLOWING STATEMENTS *
******************************************************************
EXEC SQL DECLARE PRODUTO TABLE
( CODPROD CHAR(4) NOT NULL,
DESCPROD VARCHAR(20) NOT NULL,
UNIDPROD CHAR(5),
LOCALPROD CHAR(5),
QTDEST DECIMAL(5, 0),
QTDMAX DECIMAL(5, 0),
QTDMIN DECIMAL(5, 0),
PRECOCOMPRA DECIMAL(8, 2),
PRECOVENDA DECIMAL(8, 2),
PERCOMIS DECIMAL(4, 2)
) END-EXEC.
Mas, nada impede que você defina e use indicadores para essas colunas,
assim poderá tratar os valores positivos do INDICATOR. Por questão de organização,
coloque as variáveis indicadoras na WORKING-STORAGE, próximo dos DCLGENs.
No programa COBOL abaixo, temos um exemplo de uso dos INDICATORS
definidos pelo programador e pelo DCLGEN.
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
*----------------------------------------------------------------*
IDENTIFICATION DIVISION.
*----------------------------------------------------------------*
PROGRAM-ID. TESTEIND.
*----------------------------------------------------------------*
DATA DIVISION.
*----------------------------------------------------------------*
WORKING-STORAGE SECTION.
*----------------------------------------------------------------*
* BOOK COM A DECLARATION DA TABELA TBPRODUTO COM OS INDICATORS
* GERADOS VIA DCLGEN
EXEC SQL
INCLUDE BKTBPROD
END-EXEC
EXEC SQL
INCLUDE SQLCA
END-EXEC
Achei, são esses
em vermelho!
Parte 7
www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218
19
7
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
* INDICATORS DEFINIDOS PELO PROGRAMADOR
01 WS-INDICADORES.
03 ICODPROD PIC S9(04) COMP.
03 IDESCPROD PIC S9(04) COMP.
03 IUNIDPROD PIC S9(04) COMP.
03 ILOCALPROD PIC S9(04) COMP.
03 IQTDEST PIC S9(04) COMP.
03 IQTDMIN PIC S9(04) COMP.
03 IQTDMAX PIC S9(04) COMP.
03 IPRECOCOMPRA PIC S9(04) COMP.
03 IPRECOVENDA PIC S9(04) COMP.
03 IPERCOMIS PIC S9(04) COMP.
77 WS-SQLCODE PIC +9(9).
77 WS-MSG PIC X(60).
PROCEDURE DIVISION.
......
* EXEMPLO DO USO DOS INDICATORS DEFINIDOS PELO PROGRAMADOR
EXEC SQL
SELECT CODPROD
,DESCPROD
,UNIDPROD
,LOCALPROD
,QTDEST
,QTDMIN
,QTDMAX
,PRECOCOMPRA
,PRECOVENDA
,PERCOMIS
INTO :CODPROD :ICODPROD
,:DESCPROD :IDESCPROD
,:UNIDPROD :IUNIDPROD
,:LOCALPROD :ILOCALPROD
,:QTDEST :IQTDEST
,:QTDMIN :IQTDMIN
,:QTDMAX :IQTDMAX
,:PRECOCOMPRA :IPRECOCOMPRA
,:PRECOVENDA :IPRECOVENDA
,:PERCOMIS :IPERCOMIS
FROM TBPRODUTO
WHERE CODPROD = '0300'
END-EXEC
MOVE SQLCODE TO WS-SQLCODE
DISPLAY "VALOR DO SQLCODE = " WS-SQLCODE
* DISPLAY DOS INDICATORS DEFINIDOS PELO PROGRAMADOR
DISPLAY "ICODPROD = " ICODPROD,
DISPLAY "IDESCPROD = " IDESCPROD,
DISPLAY "IUNIDPROD = " IUNIDPROD,
DISPLAY "ILOCALPROD = " ILOCALPROD,
DISPLAY "IQTDEST = " IQTDEST,
DISPLAY "IQTDMIN = " IQTDMIN,
DISPLAY "IQTDMAX = " IQTDMAX,
DISPLAY "IPRECOCOMPRA = " IPRECOCOMPRA,
DISPLAY "IPRECOVENDA = " IPRECOVENDA,
DISPLAY "IPERCOMIS = " IPERCOMIS,
DISPLAY "*---------------------------------------------*"
Parte 7
www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218
20
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
* EXEMPLO DO USO DOS INDICATORS GERADOS VIA DCLGEN
EXEC SQL
SELECT *
INTO :DCLTBPRODUTO :INDSTRUC
FROM TBPRODUTO
WHERE CODPROD = '0300'
END-EXEC
MOVE SQLCODE TO WS-SQLCODE
DISPLAY "VALOR DO SQLCODE = " WS-SQLCODE
* DISPLAY DOS INDICATORS DDEFINIDOS PELO PROGRAMADOR
DISPLAY "INDSTRUC(01) = " INDSTRUC(01)
DISPLAY "INDSTRUC(02) = " INDSTRUC(02)
DISPLAY "INDSTRUC(03) = " INDSTRUC(03)
DISPLAY "INDSTRUC(04) = " INDSTRUC(04)
DISPLAY "INDSTRUC(05) = " INDSTRUC(05)
DISPLAY "INDSTRUC(06) = " INDSTRUC(06)
DISPLAY "INDSTRUC(07) = " INDSTRUC(07)
DISPLAY "INDSTRUC(08) = " INDSTRUC(08)
DISPLAY "INDSTRUC(09) = " INDSTRUC(09)
DISPLAY "INDSTRUC(10) = " INDSTRUC(10)
STOP RUN
.
Este é o resultado do código compilado e executado exibido na SYSOUT:
O valor 000J significa:
EBCDIC 000J
HEXADECIMAL FFFD
0001
Observe que o comando DISPLAY converte o conteúdo da variável binária
(USAGE COMP) para zonado. O número hexadecimal D, no primeiro byte indica que é
um número negativo. Temos então o resultado -1 para o INDICATOR, mostrando que
a respectiva coluna contém nulo.
Parte 7
www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218
21
7
Objetivo do Programa
Atualizar a tabela TBCLIENTE com base na movimentação registrada no
arquivo sequencial MOVCLIDB.
Macro-Fluxo
Observação
No arquivo MOVCLIDB há o campo TIPOMOVTO-DB que indica o tipo de
movimento, conforme abaixo:
I inclusão de novo cliente
E exclusão de cliente
A alteração dos dados do cliente
C consulta clientes, exibindo na SYSOUT
outro erro de movimento, ignorar registro
Exemplo manutencão,
TBCLIENTE
MOVCLIDB
EXEMANUT
Parte 7
www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218
22
Layout da SYSOUT
1 2 3 4 5 6
12345678901234567890123456789012345678901234567890123456789012
==============================================================
== CONSULTA DE CLIENTE ==
==============================================================
CODIGO....: XXXX
NOME......: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
ENDERECO .: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
TELEFONE..: XXXXXXXXX
EMAIL.....: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
CPF.......: XXX.XXX.XXX-XX
SALDO.....: R$ 99.999,99
==============================================================
1 2 3 4 5
12345678901234567890123456789012345678901234567890
**************************************************
* DATA GREGORIANA 1 - 99/99/2099 *
* DATA GREGORIANA 2 - 99 DE XXXXXXXXX DE 2099 *
* DATA JULIANA – 999 DE 2099 *
* DIA DA SEMANA – XXXXXXXXXXXXX *
**************************************************
1 2 3 4 5
12345678901234567890123456789012345678901234567890
==================================================
== ESTATISTICA FINAL DE PROCESSAMENTO ==
==================================================
QTDE. MOVIMENTOS LIDOS MOVCLIDB........: ZZ.ZZ9
QTDE. CLIENTES INSERIDOS TBCLIENTE.....: ZZ.ZZ9
QTDE. CLIENTES EXCLUIDOS TBCLIENTE.....: ZZ.ZZ9
QTDE. CLIENTES ALTERADOS TBCLIENTE.....: ZZ.ZZ9
QTDE. CLIENTES CONSULTADOS TBCLIENTE...: ZZ.ZZ9
QTDE. MOVIMENTOS INVALIDOS.............: ZZ.ZZ9
==================================================
TEMPO TOTAL DE PROCESSAMENTO.........: HH:MM:SS:CC
==================================================
== TERMINO NORMAL DO PROGRAMA EXEMANUT ==
==================================================
Parte 7
www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218
23
7
Layout do Arquivo
Layout da Tabela
Nome do Arquivo MOVCLIDB
Nome do Registro REG-MOVCLIDB
Nome do Campo Tipo e Tamanho
Descrição
CODCLI-DB PIC X(04) Código do cliente
NOMECLI-DB PIC X(30) Nome do cliente
ENDCLI-DB PIC X(40) Endereço do cliente
FONECLI-DB PIC X(09) Telefone do cliente
EMAILCLI-DB PIC X(50) E-mail do cliente
CPFCLI-DB PIC X(11) CPF do cliente
SALDOCLI-DB PIC 9(05)V99 Saldo do cliente
TIPOMOVTO-DB PIC X(01) Tipo da movimentação
Nome do Tabela TBCLIENTE
Nome da Coluna Tipo e Tamanho Complemento
CODCLI CHAR(04) UNIQUE NOT NULL
NOMECLI VARCHAR(30) NOT NULL
ENDCLI VARCHAR(40)
FONECLI CHAR(09)
EMAILCLI VARCHAR(50)
CPFCLI CHAR(11)
SALDOCLI DECIMAL(7,2)
Parte 7
www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218
24
BOOK BKEXEMC
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
******************************************************************
* BOOK DO ARQUIVO - MOVIMENTO DE CLIENTE *
* NOME DA BOOK - BKEXEMC *
* NOME DO PDS - GP.GPXXNN.BOOKLIB *
* NOME DO ARQUIVO - MOVCLIDB *
* TAMANHO DO REGISTRO - 152 BYTES *
******************************************************************
01 ::REG-MOVCLIDB.
03 ::CODCLI-DB PIC X(04).
03 ::NOMECLI-DB PIC X(30).
03 ::ENDCLI-DB PIC X(40).
03 ::FONECLI-DB PIC X(09).
03 ::EMAILCLI-DB PIC X(50).
03 ::CPFCLI-DB PIC X(11).
03 ::SALDOCLI-DB PIC 9(05)V99.
03 ::TIPOMOV-DB PIC X(01).
Programa COBOL
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
*----------------------------------------------------------------*
IDENTIFICATION DIVISION.
*----------------------------------------------------------------*
PROGRAM-ID. EXEMANUT.
*----------------------------------------------------------------*
ENVIRONMENT DIVISION.
*----------------------------------------------------------------*
CONFIGURATION SECTION.
SPECIAL-NAMES.
DECIMAL-POINT IS COMMA.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT MOVCLIDB ASSIGN TO UT-S-MOVCLIDB
FILE STATUS IS FS-MOVCLIDB
.
*----------------------------------------------------------------*
DATA DIVISION.
*----------------------------------------------------------------*
FILE SECTION.
*----------------------------------------------------------------*
FD MOVCLIDB
RECORDING MODE IS F.
COPY BKEXEMC REPLACING ==::== BY ====.
*----------------------------------------------------------------*
WORKING-STORAGE SECTION.
*----------------------------------------------------------------*
* BOOK DA VARIAVEL ESPELHO
COPY BKEXEMC REPLACING ==::== BY ==WS-==.
Parte 7
www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218
25
7
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
* BOOK DAS VARIAVEIS PARA CALCULO DO TEMPO
COPY VARDATA.
COPY VARTEMPO.
* BOOK DAS VARIAVEIS HOSPEDEIRAS DA TABELA TBCLIENTE
EXEC SQL
INCLUDE BKEXETC
END-EXEC
* INDICADORES DA TABELA TBCLIENTE
01 INDICADORES.
05 ICODCLI PIC S9(4) COMP.
05 INOMECLI PIC S9(4) COMP.
05 IENDCLI PIC S9(4) COMP.
05 IFONECLI PIC S9(4) COMP.
05 IEMAILCLI PIC S9(4) COMP.
05 ICPFCLI PIC S9(4) COMP.
05 ISALDOCLI PIC S9(4) COMP.
* AREA DE VARIAVEIS PARA O DB2
EXEC SQL
INCLUDE SQLCA
END-EXEC
01 WS-CONTADORES-COMP.
05 WS-CTLIDO PIC 9(05) COMP.
05 WS-CTINS PIC 9(05) COMP.
05 WS-CTEXC PIC 9(05) COMP.
05 WS-CTINV PIC 9(05) COMP.
05 WS-CTALT PIC 9(05) COMP.
05 WS-CTCON PIC 9(05) COMP.
01 WS-CONTADORES-FORMATADOS.
05 WS-CTLIDO-F PIC ZZ.ZZ9.
05 WS-CTINS-F PIC ZZ.ZZ9.
05 WS-CTEXC-F PIC ZZ.ZZ9.
05 WS-CTINV-F PIC ZZ.ZZ9.
05 WS-CTALT-F PIC ZZ.ZZ9.
05 WS-CTCON-F PIC ZZ.ZZ9.
01 FS-MOVCLIDB PIC X(02).
88 SUCESSO-MOVCLIDB VALUE "00".
88 FIM-ARQ-MOVCLIDB VALUE "10".
77 WS-SALDOCLI-F PIC ZZ.ZZ9,99.
77 WS-SQLCODE PIC +9(9).
77 WS-MSG PIC X(60).
77 WS-FS PIC X(02).
*----------------------------------------------------------------*
PROCEDURE DIVISION.
*----------------------------------------------------------------*
0000-EXEMANUT.
PERFORM 1000-INICIALIZAR
PERFORM 2000-PROCESSAR
UNTIL FS-MOVCLIDB = '10'
PERFORM 3000-TERMINO
STOP RUN
.
Parte 7
www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218
26
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
1000-INICIALIZAR.
ACCEPT WS-HORARIO-INICIAL FROM TIME
INITIALIZE WS-CONTADORES-COMP
OPEN INPUT MOVCLIDB
IF NOT SUCESSO-MOVCLIDB
MOVE "ERRO ABERTURA MOVCLIDB"
TO WS-MSG
MOVE FS-MOVCLIDB TO WS-FS
PERFORM 9000-ERRO
END-IF
PERFORM 1500-LER-MOVCLIDB
.
1500-LER-MOVCLIDB.
READ MOVCLIDB INTO WS-REG-MOVCLIDB
IF SUCESSO-MOVCLIDB
ADD 1 TO WS-CTLIDO
ELSE
IF NOT FIM-ARQ-MOVCLIDB
MOVE "ERRO LEITURA MOVCLIDB"
TO WS-MSG
MOVE FS-MOVCLIDB TO WS-FS
PERFORM 9000-ERRO
END-IF
END-IF
.
2000-PROCESSAR.
EVALUATE WS-TIPOMOVTO-DB
WHEN "I" PERFORM 2100-INCLUSAO
WHEN "E" PERFORM 2200-EXCLUSAO
WHEN "A" PERFORM 2300-ALTERACAO
WHEN "C" PERFORM 2400-CONSULTAR
WHEN OTHER
ADD 1 TO WS-CTINV
END-EVALUATE
PERFORM 1500-LER-MOVCLIDB
.
Parte 7
www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218
27
7
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
2100-INCLUSAO.
MOVE WS-CODCLI-DB TO CODCLI
MOVE +30 TO NOMECLI-LEN
MOVE WS-NOMECLI-DB TO NOMECLI-TEXT
MOVE +40 TO ENDCLI-LEN
MOVE WS-ENDCLI-DB TO ENDCLI-TEXT
MOVE WS-FONECLI-DB TO FONECLI
MOVE +50 TO EMAILCLI-LEN
MOVE WS-EMAILCLI-DB TO EMAILCLI-TEXT
MOVE WS-CPFCLI-DB TO CPFCLI
MOVE WS-SALDOCLI-DB TO SALDOCLI
EXEC SQL
INSERT INTO TBCLIENTE
( CODCLI
, NOMECLI
, ENDCLI
, FONECLI
, EMAILCLI
, CPFCLI
, SALDOCLI
)
VALUES
( :CODCLI
, :NOMECLI
, :ENDCLI
, :FONECLI
, :EMAILCLI
, :CPFCLI
, :SALDOCLI
)
END-EXEC
EVALUATE SQLCODE
WHEN 0 ADD 1 TO WS-CTINS
WHEN -803 ADD 1 TO WS-CTINV
WHEN -545 ADD 1 TO WS-CTINV
WHEN OTHER
MOVE "ERRO INSERT NA TABELA TBCLIENTE"
TO WS-MSG
MOVE SQLCODE TO WS-SQLCODE
PERFORM 9000-ERRO-DB2
END-EVALUATE
.
2200-EXCLUSAO.
MOVE WS-CODCLI-DB TO CODCLI
EXEC SQL
DELETE FROM TBCLIENTE
WHERE CODCLI = :CODCLI
END-EXEC
EVALUATE SQLCODE
WHEN 0 ADD 1 TO WS-CTEXC
WHEN +100 ADD 1 TO WS-CTINV
WHEN OTHER
MOVE "ERRO DELETE NA TABELA TBCLIENTE"
TO WS-MSG
MOVE SQLCODE TO WS-SQLCODE
PERFORM 9000-ERRO-DB2
END-EVALUATE
.
Parte 7
www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218
28
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
2300-ALTERACAO.
MOVE WS-CODCLI-DB TO CODCLI
EXEC SQL
SELECT CODCLI
, NOMECLI
, ENDCLI
, FONECLI
, EMAILCLI
, CPFCLI
, SALDOCLI
INTO :CODCLI
,:NOMECLI
,:ENDCLI :IENDCLI
,:FONECLI :IFONECLI
,:EMAILCLI :IEMAILCLI
,:CPFCLI :ICPFCLI
,:SALDOCLI :ISALDOCLI
FROM TBCLIENTE
WHERE CODCLI = :CODCLI
END-EXEC
EVALUATE SQLCODE
WHEN 0
PERFORM 9000-TRATA-INDICATOR
PERFORM 2310-UPDATE
WHEN +100
ADD 1 TO WS-CTINV
WHEN OTHER
MOVE "ERRO SELECT DO UPDATE NA TABELA TBCLIENTE"
TO WS-MSG
MOVE SQLCODE TO WS-SQLCODE
PERFORM 9000-ERRO-DB2
END-EVALUATE
.
Parte 7
www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218
29
7
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
2310-UPDATE.
* TESTE DA VARIAVEL ESPELHO
IF WS-NOMECLI-DB NOT = SPACES
MOVE +30 TO NOMECLI-LEN
MOVE WS-NOMECLI-DB TO NOMECLI-TEXT
END-IF
IF WS-ENDCLI-DB NOT = SPACES
MOVE +40 TO ENDCLI-LEN
MOVE WS-ENDCLI-DB TO ENDCLI-TEXT
END-IF
IF WS-FONECLI-DB NOT = SPACES
MOVE WS-FONECL-DB TO FONECLI
END-IF
IF WS-EMAILCLI-DB NOT = SPACES
MOVE +50 TO EMAILCLI-LEN
MOVE WS-EMAILCLI-DB TO EMAILCLI-TEXT
END-IF
IF WS-CPFCLI-DB NOT = SPACES
MOVE WS-CPFCLI-DB TO CPFCLI
END-IF
IF WS-SALDOCLI-DB IS NUMERIC
MOVE WS-SALDOCLI-DB TO SALDOCLI
END-IF
EXEC SQL
UPDATE TBCLIENTE
SET NOMECLI = :NOMECLI
,ENDCLI = :ENDCLI
,FONECLI = :FONECLI
,EMAILCLI = :EMAILCLI
,CPFCLI = :CPFCLI
,SALDOCLI = :SALDOCLI
WHERE CODCLI = :CODCLI
END-EXEC
EVALUATE SQLCODE
WHEN 0 ADD 1 TO WS-CTALT
WHEN +100 ADD 1 TO WS-CTINV
WHEN -545 ADD 1 TO WS-CTINV
WHEN OTHER
MOVE "ERRO UPDATE NA TABELA TBCLIENTE"
TO WS-MSG
MOVE SQLCODE TO WS-SQLCODE
PERFORM 9000-ERRO-DB2
END-EVALUATE
.
Parte 7
www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218
30
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
2400-CONSULTAR.
MOVE WS-CODCLI-DB TO CODCLI
EXEC SQL
SELECT CODCLI
, NOMECLI
, ENDCLI
, FONECLI
, EMAILCLI
, CPFCLI
, SALDOCLI
INTO :CODCLI
,:NOMECLI
,:ENDCLI :IENDCLI
,:FONECLI :IFONECLI
,:EMAILCLI :IEMAILCLI
,:CPFCLI :ICPFCLI
,:SALDOCLI :ISALDOCLI
FROM TBCLIENTE
WHERE CODCLI = :CODCLI
END-EXEC
EVALUATE SQLCODE
WHEN 0 ADD 1 TO WS-CTCON
PERFORM 9000-TRATA-INDICATOR
PERFORM 9000-EXIBE-CONSULTA
WHEN +100 ADD 1 TO WS-CTINV
WHEN OTHER
MOVE "ERRO CONSULTA NA TABELA TBCLIENTE"
TO WS-MSG
MOVE SQLCODE TO WS-SQLCODE
PERFORM 9000-ERRO-DB2
END-EVALUATE
.
3000-TERMINO.
CLOSE MOVCLIDB
IF NOT SUCESSO-MOVCLIDB
MOVE "ERRO FECHAMENTO MOVCLIDB"
TO WS-MSG
MOVE FS-MOVCLIDB TO WS-FS
PERFORM 9000-ERRO
END-IF
ACCEPT WS-HORARIO-FINAL FROM TIME
PERFORM 9000-CALCULA-TEMPO-PROC
MOVE WS-CTLIDO TO WS-CTLIDO-F
MOVE WS-CTINS TO WS-CTINS-F
MOVE WS-CTEXC TO WS-CTEXC-F
MOVE WS-CTINV TO WS-CTINV-F
MOVE WS-CTCON TO WS-CTCON-F
MOVE WS-CTALT TO WS-CTALT-F
Parte 7
www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218
31
7
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
PERFORM 9000-IMPRIME-DATA
DISPLAY "=================================================="
DISPLAY "== ESTATISTICA FINAL DE PROCESSAMENTO =="
DISPLAY "=================================================="
DISPLAY "QTDE. MOVIMENTOS LIDOS MOVCLIDB.... .: " WS-CTLIDO-F
DISPLAY "QTDE. CLIENTES INSERIDOS TBCLIENTE. .: " WS-CTINS-F
DISPLAY "QTDE. CLIENTES EXCLUIDOS TBCLIENTE. .: " WS-CTEXC-F
DISPLAY "QTDE. CLIENTES ALTERADOS TBCLIENTE. .: " WS-CTALT-F
DISPLAY "QTDE. CLIENTES CONSULTADOS TBCLIENTE.: " WS-CTCON-F
DISPLAY "QTDE. MOVIMENTOS INVALIDOS...........: " WS-CTINV-F
DISPLAY "=================================================="
DISPLAY "TEMPO TOTAL DE PROCESSAMENTO.........: "
WS-TEMPO-PROCESSAMENTO
DISPLAY "=================================================="
DISPLAY "== TERMINO NORMAL DO PROGRAMA EXEMANUT =="
DISPLAY "=================================================="
.
9000-TRATA-INDICATOR.
* TESTE DOS INDICATORS
IF IENDCLI LESS ZERO
MOVE SPACES TO ENDCLI
END-IF
IF IFONECLI LESS ZERO
MOVE SPACES TO FONECLI
END-IF
IF IEMAILCLI LESS ZERO
MOVE SPACES TO EMAILCLI
END-IF
IF ICPFCLI LESS ZERO
MOVE SPACES TO CPFCLI
END-IF
IF ISALDOCLI LESS ZERO
MOVE ZEROS TO SALDOCLI
END-IF
.
9000-EXIBE-CONSULTA.
MOVE SALDOCLI TO WS-SALDOCLI-F
DISPLAY "=================================================="
DISPLAY "== CONSULTA DE CLIENTE =="
DISPLAY "=================================================="
DISPLAY "CODIGO....: " CODCLI
DISPLAY "NOME......: " NOMECLI-TEXT
DISPLAY "ENDERECO .: " ENDCLI-TEXT
DISPLAY "TELEFONE..: " FONECLI
DISPLAY "E-MAIL....: " EMAILCLI-TEXT
DISPLAY "CPF.......: " CPFCLI
DISPLAY "SALDO.....: R$ " WS-SALDOCLI-F
DISPLAY "=================================================="
.
9000-ERRO.
DISPLAY "=================================================="
DISPLAY "MENSAGEM....: " WS-MSG
DISPLAY "FILE STATUS.: " WS-FS
DISPLAY "=================================================="
DISPLAY "== TERMINO ANORMAL DO PROGRAMA EXEMANUT =="
DISPLAY "=================================================="
MOVE 12 TO RETURN-CODE
STOP RUN
.
Parte 7
www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218
32
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
9000-ERRO-DB2.
DISPLAY "=================================================="
DISPLAY "MESSAGE..: " WS-MSG
DISPLAY "SQLCODE..: " WS-SQLCODE
DISPLAY "SQLERRMC.: " SQLERRMC
DISPLAY "SQLCA....: " SQLCA
DISPLAY "=================================================="
DISPLAY "== TERMINO ANORMAL DO PROGRAMA EXEMANUT =="
DISPLAY "=================================================="
MOVE 16 TO RETURN-CODE
STOP RUN
.
* BOOK DA ROTINA PARA CALCULO DE PROCESSAMENTO
COPY CALCTEMP.
* ROTINA QUE EXIBE AS DATAS FORMATADAS
COPY IMPDATA.
Parte 7
www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218
33
7
Associe as etapas do processo de compilação
com as ações executadas.
a) Pré-Compilação
b) Compilação
c) Link-edição
d) Bind
( ) Extrair os comandos SQL do programa fonte e colocá-lo em um membro chamado DBRM ( Data Base Request Module).
( ) Verificar o programa em busca de erros de sintaxe e semântica.
( ) Fazer include das áreas (Book das Variáveis).
( ) Cria um caminho de acesso (Access Path) as tabelas do DB2, estabelecendo uma relação entre um programa de aplicações e seus dados relacionais.
( ) Verificar se há erros nos comandos SQL.
( ) Ligar o fonte compilado com as funções de acesso a arquivos (CALL) e módulos DB2 RUN-TIME para criar um programa objeto (LOAD MODULE).
( ) Inserir código fonte compatível com o COBOL para invocar o DB2.
Practice
Atividade Revisão aos pares
Parte 7
www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218
34
Marque com X os argumentos entre SQLCODE e
SQLDML onde o erro pode ocorrer.
SQL DML
SELECT INSERT UPDATE DELETE
0
+100
-803
-545
Atividade Revisão aos pares
Parte 7
www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218
35
7
Coloque entre os parênteses o valor do
INDICATOR para cada uma das ocorrências abaixo.
( ) Coluna com valores normais
( ) Comprimento do dado em um VARCHAR
( ) Erro na conversão de valores
( ) Coluna com valor NULL
( ) Comprimento original do dado que foi truncado no momento da carga na HOST Variable
Atividade Trabalho em dupla
Parte 7
www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218
36
Execute os passos abaixo (Lembre-se de que
XXNN é o seu prefixo de usuário):
1) Copie o membro COMPBDB2, da JOBLIB de seu instrutor, para a sua
JOBLIB.
2) Alterá-lo, substituindo XXNN pelo seu prefixo de usuário. Usá-lo para
compilar o programa GPXXNND1 até obter MAXCC = 0.
3) Copie o membro EXECOBD1, da JOBLIB de seu instrutor, para a sua
JOBLIB.
4) Alterar o JOB EXECOBD1, substituindo XXNN pelo seu prefixo de usuário.
5) Executar o JOB e comparar o resultado com os de seus colegas.
Anote abaixo os valores dos contadores que foram exibidos na SYSOUT
==================================================
== ESTATISTICA FINAL DE PROCESSAMENTO ==
==================================================
QTDE. PRODUTOS LIDOS CADPRDD1........: ___________
QTDE. PRODUTOS INSERIDOS TBPRODUTO...: ___________
QTDE. PRODUTOS DUPLICADOS............: ___________
QTDE. PRODUTOS INVALIDOS.............: ___________
==================================================
TEMPO TOTAL DE PROCESSAMENTO.........: ___________
==================================================
== TERMINO NORMAL DO PROGRAMA GPXXNND1 ==
==================================================
Atividade Prática de laboratório
Parte 7
www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218
37
7
Objetivo do Programa
A Metal Screws Inc. implantou um Sistema Gerenciador de banco de Dados DB2 e já migrou seus dados de produtos que estavam em arquivo sequencial para a tabela TBPRODUTO.
Precisamos agora escrever um programa para atualizar a tabela TBPRODUTO
com base na movimentação de estoque registrada no arquivo sequencial MOVPRDD2.
Macro-Fluxo
Performance
Atividade Projeto 2 - manutenção
TBPRODUTO
MOVPRDD2
GPXXNND2
Parte 7
www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218
38
Layout do Arquivo
Layout da Tabela
Nome do Arquivo MOVPRDD2
Nome do Registro REG-MOVPRDD2
Nome do Campo Tipo e Tamanho
Descrição
CODPROD-D2 X(04) Código
DESCPROD-D2 X(20) Descrição
UNIDPROD-D2 X(05) Unidade (caixa, litro, Kg, etc)
LOCALPROD-D2 X(05) Localização no estoque
QTDEST-D2 9(05) Quantidade em estoque
QTDMAX-D2 9(05) Qtde máxima em estoque
QTDMIN-D2 9(05) Qtde mínima em estoque
PRECOCOMPRA-D2 9(06)V99 Preço de Compra
PRECOVENDA-D2 9(06)V99 Preço de Venda
PERCOMIS-D2 9(02)V99 Percentual de comissão
TIPOMOVTO-D2 X(01) Tipo de movimento (I,E,A,C)
Nome da tabela TBPRODUTO
Nome da coluna Tipo e Tamanho
Complementos
CODPROD CHAR(4) UNIQUE NOT NULL
DESCPROD VARCHAR(20) NOT NULL
UNIDPROD CHAR(5)
LOCALPROD CHAR(5)
QTDEST DECIMAL(5,0)
QTDMAX DECIMAL(5,0) > QTDMIN
QTDMIN DECIMAL(5,0) < QTDMAX
PRECOCOMPRA DECIMAL(8,2) >=0
PRECOVENDA DECIMAL(8,2) >=0
PERCOMIS DECIMAL(4,2) >=0
Parte 7
www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218
39
7
Layout da SYSOUT
1 2 3 4 5
12345678901234567890123456789012345678901234567890
==================================================
== CONSULTA DE PRODUTOS ==
==================================================
CODIGO...................: 9999
DESCRICAO................: XXXXXXXXXXXXXXXXXXXX
UNIDADE DE VENDA.........: XXXXX
LOCALIZACAO NO ESTOQUE...: XXXXX
QTDE. EM ESTOQUE.........: ZZ.ZZ9
QTDE. MAXIMA ARMAZENADA..: ZZ.ZZ9
QTDE. MINIMA ARMAZENADA..: ZZ.ZZ9
PRECO DE COMPRA..........: ZZZ.ZZ9,99
PRECO DE VENDA...........: ZZZ.ZZ9,99
PERCENTUAL DE COMISSAO...: Z9,99
==================================================
1 2 3 4 5
12345678901234567890123456789012345678901234567890
**************************************************
* DATA GREGORIANA 1 - 99/99/2099 *
* DATA GREGORIANA 2 - 99 DE XXXXXXXXX DE 2099 *
* DATA JULIANA – 999 DE 2099 *
* DIA DA SEMANA – XXXXXXXXXXXXX *
**************************************************
1 2 3 4 5
12345678901234567890123456789012345678901234567890
==================================================
== ESTATISTICA FINAL DE PROCESSAMENTO ==
==================================================
QTDE. PRODUTOS LIDOS MOVPRDD2..........: ZZ.ZZ9
QTDE. PRODUTOS INSERIDOS TBPRODUTO...: ZZ.ZZ9
QTDE. PRODUTOS EXCLUIDOS TBPRODUTO...: ZZ.ZZ9
QTDE. PRODUTOS ALTERADOS TBPRODUTO...: ZZ.ZZ9
QTDE. PRODUTOS CONSULTADOS TBPRODUTO...: ZZ.ZZ9
QTDE. MOVIMENTOS INVALIDOS.............: ZZ.ZZ9
==================================================
TEMPO TOTAL DE PROCESSAMENTO.........: HH:MM:SS:CC
==================================================
== TERMINO NORMAL DO PROGRAMA GPXXNND2 ==
==================================================
Parte 7
www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218
40
Observação
No arquivo MOVPRDD2 há o campo TIPOMOVTO-D2 que indica o tipo de
movimento, conforme abaixo:
I inclusão de novo produto
E exclusão de produto
A alteração dos dados do produto
C consulta produtos, exibindo na SYSOUT
outro erro de movimento, ignorar registro
Fazer manutenção em tabelas com base em movimentos gravados em
arquivos sequenciais é um processamento comum nas empresas. Execute os
passos abaixo (Lembre-se de que XXNN é o seu prefixo de usuário):
1) Edite o membro BK002D2 em sua BOOKLIB com as variáveis espelho do
arquivo MOVPRDD2.
2) Edite o programa GPXXNND2 em sua COBLIB.
3) Altere o JOB COMPBDB2 para compilar o programa GPXXNND2 e
compilar até obter MAXCC = 0
4) Copiar para seu particionado JCLDATA o membro INSNULL, da JCLDATA
de seu instrutor. Execute-o via SPUFI (opção do TSO D;1). Isso fará o
INSERT de linhas com colunas NULL em sua tabela TBPRODUTO.
5) Copie o membro EXECOBD2, da JOBLIB de seu instrutor, para a sua
JOBLIB.
6) Alterar o JOB EXECOBD2, substituindo XXNN pelo seu prefixo de usuário.
7) Executar o JOB e comparar o resultado com os de seus colegas.
Parte 7
www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218
41
7
Anote abaixo os valores dos contadores que foram exibidos na SYSOUT
==================================================
== ESTATISTICA FINAL DE PROCESSAMENTO ==
==================================================
QTDE. PRODUTOS LIDOS MOVPRDD2..........: _________
QTDE. PRODUTOS INSERIDOS TBPRODUTO...: _________
QTDE. PRODUTOS EXCLUIDOS TBPRODUTO...: _________
QTDE. PRODUTOS ALTERADOS TBPRODUTO...: _________
QTDE. PRODUTOS CONSULTADOS TBPRODUTO...: _________
QTDE. MOVIMENTOS INVALIDOS.............: _________
==================================================
TEMPO TOTAL DE PROCESSAMENTO.........: ___________
==================================================
== TERMINO NORMAL DO PROGRAMA GPXXNND2 ==
==================================================
Parte 7
www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218
42
Orientação para processamento
Como já foi visto, não pode haver um parágrafo principal.
Executa o parágrafo 1000-INICIALIZAR
Executa o parágrafo 3000-PROCESSAR
até que o file status do arquivo MOVPRDD2 seja “10”
Executar o parágrafo 4000-TERMINO
Encerrar o programa
Parágrafo 1000-INICIALIZAR
Receber o horário inicial de processamento
Mover zero para os contadores:
movimento lido
produto inserido
produto excluído
produto alterado
produto consultado
movimento inválido
Abrir para leitura o arquivo MOVPRDD2
Se file status for diferente de “00”
Mover mensagem de erro para variável da rotina de erro
Mover file status para variáveis da rotina de erro
Executar rotina de erro (9000-ERRO)
Ler o primeiro registro do arquivo MOVPRDD2 (2000-LER-MOVPRDD2)
Parágrafo 2000-LER-MOVPRDD2
Ler registro do arquivo MOVPRDD2 carregando variável espelho
Se file status for igual a “00” (sucesso)
Somar 1 ao contador de produto lido
Senão
Se file status for diferente de “10” (fim de arquivo)
Mover mensagem de erro para variável da rotina de erro
Mover file status para variáveis da rotina de erro
Executar rotina de erro (9000-ERRO)
Parte 7
www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218
43
7
Parágrafo 3000-PROCESSAR
Se WS-TIPOMOVTO-D2 = “I”
executar a rotina de inclusão (3100-INCLUSAO)
Se WS-TIPOMOVTO-D2 = “E”
executar a rotina de exclusão (3200-EXCLUSAO)
Se WS-TIPOMOVTO-D2 = “A”
executar a rotina de alteração (3300-ALTERACAO)
Se WS-TIPOMOVTO-D2 = “C”
executar a rotina de consulta (3400-CONSULTAR)
Senão
Somar 1 ao contador de movimento inválido
Ler o próximo registro do arquivo MOVPRDD2 (2000-LER-MOVPRDD2)
Parágrafo 3100-INCLUSAO
Mover os dados da variável espelho para a hospedeira
Inserir a linha na tabela TBPRODUTO (INSERT) e testar SQLCODE:
se SQLCODE = 0
somar 1 ao contador de produto inserido
se SQLCODE = -803
somar 1 ao contador de produto inválido
se SQLCODE = -545
somar 1 ao contador de produto inválido
senão
mover SQLCODE para variável formatada
Mover mensagem de erro para variável da rotina de erro DB2
executar a rotina de erro para DB2 (9000-ERRO-DB2)
Parágrafo 3200-EXCLUSAO
Mover o código do produto da variável espelho para a hospedeira
Excluir a linha na tabela TBPRODUTO (DELETE) e testar SQLCODE:
se SQLCODE = 0
somar 1 ao contador de produto excluído
se SQLCODE = +100
somar 1 ao contador de movimento inválido
senão
mover SQLCODE para variável formatada
Mover mensagem de erro para variável da rotina de erro DB2
executar a rotina de erro para DB2 (9000-ERRO-DB2)
Parte 7
www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218
44
Parágrafo 3300-ALTERACAO
Mover o código do produto da variável espelho para a hospedeira
Consultar a linha da tabela TBPRODUTO (SELECT) carregando a
variável hospedeira e testar SQLCODE:
se SQLCODE = 0
executar a rotina 9000-TRATA-INDICATOR
executar a rotina 3310-UPDATE
se SQLCODE = +100
somar 1 ao contador de movimento inválido
senão
mover SQLCODE para variável formatada
Mover mensagem de erro para variável da rotina de erro DB2
executar a rotina de erro para DB2 (9000-ERRO-DB2)
Parágrafo 3310-UPDATE
Mover os dados da variável espelho WS-REG-MOVPRDD2 com
conteúdo válido para as respectivas variáveis hospedeiras. Um campo é
considerado com conteúdo válido se for alfanumérico e diferente de SPACES
ou se for numérico e tiver conteúdo numérico (IS NUMERIC).
Alterar a linha da tabela TBPRODUTO (UPDATE) e testar SQLCODE:
se SQLCODE = 0
somar 1 ao contador de produto alterado
se SQLCODE = +100
somar 1 ao contador de movimento inválido
se SQLCODE = -545
somar 1 ao contador de movimento inválido
senão
mover SQLCODE para variável formatada
Mover mensagem de erro para variável da rotina de erro DB2
executar a rotina de erro para DB2 (9000-ERRO-DB2)
Pode parecer conversa de
bêbado, mas se o produto
já foi localizado na rotina
3300-ALTERACAO, como ele
não seria mais encontrado
na 3310-UPDATE, dando
SQLCODE +100?
Parte 7
www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218
45
7
Parágrafo 3400-CONSULTAR
Mover o código do produto da variável espelho para a hospedeira
Consultar a linha da tabela TBPRODUTO (SELECT) carregando a
variável hospedeira e testar SQLCODE:
se SQLCODE = 0
somar 1 ao contador de produto consultado
executar a rotina 9000-TRATA-INDICATOR
executar a rotina 9000-EXIBE-PRODUTO
se SQLCODE = +100
somar 1 ao contador de movimento inválido
senão
mover SQLCODE para variável formatada
Mover mensagem de erro para variável da rotina de erro DB2
executar a rotina de erro para DB2 (9000-ERRO-DB2)
Parágrafo 4000-TERMINO
Fechar o arquivo MOVPRDD2
Se file status for diferente de “00”
Mover mensagem de erro para variável da rotina de erro
Mover file status para variáveis da rotina de erro
Executar rotina de erro (9000-ERRO)
Receber o horário final de processamento
Calcular o tempo de processamento
Exibir SYSOUT de acordo com LAYOUT
Exibir o contador de movimento lido
Exibir o contador de produto inserido
Exibir o contador de produto excluído
Exibir o contador de produto alterado
Exibir o contador de produto consultado
Exibir o contador de movimento inválido
Exibir o tempo total de processamento
Parágrafo 9000-TRATA-INDICATOR
Se INDICATOR < 0
Mover espaços quando a variável hospedeira for alfanumérica
ou zeros quando numérica
Parágrafo 9000-EXIBE-PRODUTO
EXIBIR (DISPLAY) as variáveis hospedeiras na SYSOUT conforme
layout.
Parágrafo 9000-ERRO
Exibir mensagem de erro
Exibir file status
Abendar o programa com RETURN-CODE = 12
Parte 7
www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218
46
Parágrafo 9000-ERRO-DB2
Exibir mensagem de erro
Exibir SQLCODE formatado
Exibir SQLERRMC (mensagem de erro do SQLCODE)
Abendar o programa com RETURN-CODE = 16
ENTRE AS ROTINAS
3300-ALTERACAO E
3310-UPDATE UM tempo se
passou, suficiente para
alguém ou um aplicativo ter
excluido o produto.
Espera você chegar em
casa que eu te explico
melhor!
Parte 7
www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218
47
7
Parte 7
www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218
48
Avaliação Então...Como foi ?!?
Estou fera!
Fiz Certo!
Muito Bom Bom regular ruim Muito ruim
Parte
Charles William Backman foi um cientistada computação particularmente conhecido porseu trabalho na área de banco de dados.Desenvolveu o IDS (Integrated Data Store), um
dos primeiros SGBD que, após aperfeiçoá-lo,permitia à múltiplos programas acesso ao SGBDsimultaneamente. O IDS evoluiu para o IDMS(Integrated Database Management Systems),suportando mainframes IBM.
Charles William Backman1924 (88 anos)
Versão 2.2.3
Parte 8
www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218
3
8
Antes de iniciarmos, vamos conversar sobre os tópicos apresentados na capa desta parte. Isso é importante para que seu instrutor e seus colegas saibam como está seu conhecimento sobre o assunto e se você precisa ou pode fornecer ajuda aos colegas e instrutor.
O que você já sabe ?
O que você não sabe ?
Porque é importante conhecer estes tópicos ?
Quais são os seus temores ?
O que você considera difícil ?
Depois de falar sobre o assunto com seus colegas e instrutor, escreva,
desenhe, rabisque, diga algo sobre o que você vai fazer para dominar esses tópicos. Comprometa-se!
Preparation
Trocando Ideias É agora que você fala !!
Reflexão É aqui que você se compromete !!
Parte 8
www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218
4
Sim, novamente veremos como escrever programa COBOL para a gravação de
relatório. Porém agora, os dados serão oriundos de uma tabela.
É bom poder relembrar das rotinas de impressão de cabeçalho, detalhe e
impressão de rodapé, dos contadores de linha (que já “nasce” estourado) e de página,
da WORKING-STORAGE SECTION enorme com as definições desses mesmos
cabeçalhos, detalhes e rodapés.
Os cursores permitem emular arquivos sequenciais a partir de tabelas, então
são usados principalmente em relatórios, mas também para Balance Line, Merge, etc.
Presentation
História RELATÓRIOS, DE NOVO!
80 ou 132 colunas
de 1/10 de polegada
66 li
nhas
de 1 / 6
de p
oleg
ada
serrilha oumicro serrilha
remalina
Anatomia de um
Formulário contínuo
de novo de novo
Parte 8
www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218
5
8
A linguagem SQL trabalha com tabelas e linhas. É uma linguagem
desenvolvida para manipular conjuntos. Já as linguagens tradicionais trabalham com
arquivos e registros e não conseguem reconhecer tabelas e linhas.
Para simularmos um arquivo com seus registros, trabalha-se com o conceito de
cursor. Assim o programa pode acessar linhas de uma tabela para uma manipulação
qualquer.
O CURSOR é criado dentro do programa COBOL através do comando
DECLARE, contendo a definição da result table (SELECT). É usado para armazenar o
resultado de um SELECT para em seguida ler cada uma dessas linhas.
Um programa pode construir vários CURSORES, porém cada um deles deve
ter um nome diferente. O roteiro para manipular um cursor é:
Declarar o CURSOR, definindo seu nome e o comando SELECT.
(Na WORKING-STORAGE SECTION ou na PROCEDURE DIVISION)
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
PROCEDURE DIVISION.
.......
*----------------------------------------------------------------*
* NAO CARREGA SQLCODE *
*----------------------------------------------------------------*
EXEC SQL
DECLARE nome_do_cursor CURSOR FOR
Commando SELECT
END-EXEC
Abrir o cursor com o comando OPEN. Neste instante o SELECT é executado.
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
PROCEDURE DIVISION.
.......
*----------------------------------------------------------------*
* CARREGA SQLCODE *
* 0 – SUCESSO *
* OUTRO - ERRO *
*----------------------------------------------------------------*
EXEC SQL
OPEN nome_do_cursor
END-EXEC
Teoria cursor
Parte 8
www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218
6
Executar uma série de comandos FETCH para ler cada uma das linhas da RESULT TABLE.
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
PROCEDURE DIVISION.
.......
*----------------------------------------------------------------*
* CARREGA SQLCODE *
* 0 – SUCESSO *
* +100 – FIM DO CURSOR *
* OUTRO - ERRO *
*----------------------------------------------------------------*
EXEC SQL
FETCH nome_do_cursor
INTO :variavel1,: variavel2, ...
END-EXEC
Fechar o CURSOR, para o DB2 liberar a RESULT TABLE.
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
PROCEDURE DIVISION.
.......
*----------------------------------------------------------------*
* CARREGA SQLCODE *
* 0 – SUCESSO *
* OUTRO - ERRO *
*----------------------------------------------------------------*
EXEC SQL
CLOSE nome_do_cursor
END-EXEC
Parte 8
www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218
7
8
Exemplo de um trecho de programa usando CURSOR:
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
PROCEDURE DIVISION.
PERFORM 010-INICIALIZAR
PERFORM 030-PROCESSAR UNTIL SQLCODE = +100
PERFORM 040-TERMINO
STOP RUN
.
010-INICIALIZAR.
MOVE 0 TO WS-CTLIDO
* 1- DECLARACAO DO CURSOR
EXEC SQL
DECLARE LEREMP CURSOR FOR
SELECT CODEMP, NOMEMP
FROM FUNCIONARIOS
WHERE CODDEPTO = ‘P10’
END-EXEC
* 2- ABERTURA DO CURSOR E TESTE DO SQLCODE
EXEC SQL
OPEN LEREMP
END-EXEC
IF SQLCODE NOT = 0
MOVE “ERRO ABERTURA CURSOR LEREMP”
TO WS-MSG
MOVE SQLCODE TO WS-SQLCODE
GO TO 999-ERRO-SQL
END-IF
PERFORM 020-LER-CURSOR
.
020-LER-CURSOR.
* 3- LEITURA DO CURSOR COM FETCH E TESTE DO SQLCODE
EXEC SQL
FETCH LEREMP
INTO :CODEMP, :NOMEEMP INDICATOR :INDNOMEMP
END-EXEC
IF SQLCODE = 0
ADD 1 TO WS-CTLIDO
ELSE
IF SQLCODE NOT = +100
MOVE “ERRO LEITURA CURSOR LEREMP”
TO WS-MSG
MOVE SQLCODE TO WS-SQLCODE
GO TO 999-ERRO-DB2
END-IF
END-IF
.
030-PROCESSAR.
IF INDNOMEMP < 0
MOVE “NOME INVALIDO” TO NOMEMP
END-IF
DISPLAY “FUNCIONARIO......: “ CODEMP
DISPLAY “NOME.............: “ NOMEMP
PERFORM 020-LER-CURSOR
.
Parte 8
www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218
8
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
040-TERMINO.
DISPLAY “TOTAL DE LINHAS LIDAS NO CURSOR = “ WS-CTLIDO
* 4 - FECHAR O CURSOR E TESTAR SQLCODE
EXEC SQL
CLOSE LEREMP
END-EXEC
IF SQLCODE NOT = 0
MOVE “ERRO FECHAMENTO CURSOR LEREMP”
TO WS-MSG
MOVE SQLCODE TO WS-SQLCODE
GO TO 999-ERRO-SQL
END-IF
DISPLAY “TERMINO NORMAL DO PROGRAMA”
.
999-ERRO-DB2.
DISPLAY “MENSAGEM…....: “ WS-MSG
DISPLAY “SQLCODE .....: “ WS-SQLCODE
DISPLAY “TERMINO ANORMAL DO PROGRAMA”
MOVE +16 TO RETURN-CODE
STOP RUN
.
Parte 8
www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218
9
8
Objetivo do Programa
Gravar o relatório CLIRELAT com os cliente da tabela TBCLIENTE que não
tenham e-mail.
Macro-Fluxo
Exemplo RELATÓRIO com cursor
TBCLIENTE
EXERELAT
CLIRELAT
Parte 8
www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218
10
Layout do Relatório
1 2 3 4 5 6 7 8 9 0 1 2 3
123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012
01 DD/MM/AAAA HH:MM:SS RELACAO DE CLIENTES SEM E-MAIL PAG. ZZ9
02 ------------------------------------------------------------------------------------------------------------------------------------
03 CODIGO NOME ENDERECO TELEFONE CPF SALDO
04 ------ ------------------------------ ---------------------------------------- --------- ----------- ---------
05 XXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 999999999 99999999999 ZZ.ZZ9,99
06 XXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 999999999 99999999999 ZZ.ZZ9,99
07 XXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 999999999 99999999999 ZZ.ZZ9,99
08 XXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 999999999 99999999999 ZZ.ZZ9,99
09 XXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 999999999 99999999999 ZZ.ZZ9,99
.. XXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 999999999 99999999999 ZZ.ZZ9,99
57 XXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 999999999 99999999999 ZZ.ZZ9,99
58 XXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 999999999 99999999999 ZZ.ZZ9,99
59 ------------------------------------------------------------------------------------------------------------------------------------
60 APOS O USO REUTILIZE ESSE RELATORIO COMO RASCUNHO - RECLICLE SUAS IDEIAS INDUSTRIAS JOAQUIM NABUCO LTDA.
Parte 8
www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218
11
8
Layout do Arquivo
Nome do Arquivo CLIRELAT
Nome do Registro Tipo e Tamanho Descrição
REG-CLIRELAT X(132) Relatório de 132 colunas
Layout da Tabela
Nome do Tabela TBCLIENTE
Nome do Campo Tipo e Tamanho Complemento
CODCLI CHAR(04) UNIQUE NOT NULL
NOMECLI VARCHAR(30) NOT NULL
ENDCLI VARCHAR(40)
FONECLI CHAR(09)
EMAILCLI VARCHAR(50)
CPFCLI CHAR(11)
SALDOCLI DECIMAL(9,2)
Parte 8
www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218
12
Layout da SYSOUT
1 2 3 4 5
12345678901234567890123456789012345678901234567890
**************************************************
* DATA GREGORIANA 1 - 99/99/2099 *
* DATA GREGORIANA 2 - 99 DE XXXXXXXXX DE 2099 *
* DATA JULIANA – 999 DE 2099 *
* DIA DA SEMANA – XXXXXXXXXXXXX *
**************************************************
1 2 3 4 5
12345678901234567890123456789012345678901234567890
==================================================
== ESTATISTICA FINAL DE PROCESSAMENTO ==
==================================================
TOTAL DE CLIENTES LIDOS.......: ZZZ.ZZ9
TOTAL DE CLIENTES IMPRESSOS...: ZZZ.ZZ9
TOTAL DE PAGINAS IMPRESSAS....: ZZ9
==================================================
TEMPO TOTAL DE PROCESSAMENTO.........: HH:MM:SS:CC
==================================================
== TERMINO NORMAL DO PROGRAMA EXERELAT ==
==================================================
Parte 8
www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218
13
8
Programa COBOL
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
*----------------------------------------------------------------*
IDENTIFICATION DIVISION.
*----------------------------------------------------------------*
PROGRAM-ID. EXERELAT.
*----------------------------------------------------------------*
ENVIRONMENT DIVISION.
*----------------------------------------------------------------*
CONFIGURATION SECTION.
SPECIAL-NAMES.
DECIMAL-POINT IS COMMA.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT CLIRELAT ASSIGN TO UT-S-CLIRELAT
FILE STATUS FS-CLIRELAT.
*----------------------------------------------------------------*
DATA DIVISION.
*----------------------------------------------------------------*
FILE SECTION.
*----------------------------------------------------------------*
FD CLIRELAT
LABEL RECORD OMITTED
RECORDING MODE IS F
RECORD CONTAINS 132 CHARACTERS
DATA RECORD REG-CLIRELAT
.
01 REG-CLIRELAT PIC X(132).
*----------------------------------------------------------------*
WORKING-STORAGE SECTION.
*----------------------------------------------------------------*
* BOOK DAS VARIAVEIS HOSPEDEIRAS
EXEC SQL
INCLUDE BKEXETC
END-EXEC
* BOOK DA SQLCODE
EXEC SQL
INCLUDE SQLCA
END-EXEC
* BOOK DAS VARIAVEIS PARA CALCULO DO TEMPO DE PROCESSAMENTO
COPY VARTEMPO.
COPY VARDATA.
* CONTADORES COMP
01 WS-CONTADORES-COMP.
03 WS-CTLIDO PIC 9(06) COMP.
03 WS-CTIMP PIC 9(06) COMP.
03 WS-CTPAG PIC 9(03) COMP.
03 WS-CTLINHA PIC 9(02) COMP.
03 WS-PULA PIC 9(02) COMP.
* CONTADORES FORMATADOS
01 WS-CONTADORES-FORMATADOS.
03 WS-CTLIDO-F PIC ZZZ.ZZ9.
03 WS-CTIMP-F PIC ZZZ.ZZ9.
03 WS-CTPAG-F PIC ZZ9.
Parte 8
www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218
14
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
*----------------------------------------------------------------*
* LAY-OUT DO RELATORIO CLIRELAT
*----------------------------------------------------------------*
* CABECALHO 1
01 WS-CABEC1.
03 WS-DATA-CABEC1 PIC X(10).
03 FILLER PIC X(01)
VALUE SPACES.
03 WS-HORA-CABEC1 PIC X(08).
03 FILLER PIC X(40)
VALUE SPACES.
03 FILLER PIC X(30)
VALUE
"RELACAO DE CLIENTES SEM E-MAIL".
03 FILLER PIC X(35)
VALUE SPACES.
03 FILLER PIC X(05)
VALUE "PAG. ".
03 WS-PAG-CABEC1 PIC ZZ9.
* CABECALHO 2
01 WS-CABEC2 PIC X(132)
VALUE ALL "-".
* CABECALHO 3
01 WS-CABEC3.
03 FILLER PIC X(33)
VALUE
" CODIGO NOME ".
03 FILLER PIC X(33)
VALUE
" ENDERECO ".
03 FILLER PIC X(33)
VALUE
" ".
03 FILLER PIC X(33)
VALUE
" TELEFONE CPF ".
* CABECALHO 4
01 WS-CABEC4.
03 FILLER PIC X(33)
VALUE
" ------ -----------------".
03 FILLER PIC X(33)
VALUE
"------------- ------------".
03 FILLER PIC X(33)
VALUE
"---------------------------- ".
03 FILLER PIC X(33)
VALUE
" --------- ----------- ".
Parte 8
www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218
15
8
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
* LINHA DE DETALHE
01 WS-LINDET.
03 FILLER PIC X(02)
VALUE SPACES.
03 LD-CODCLI PIC X(04).
03 FILLER PIC X(06)
VALUE SPACES.
03 LD-NOMECLI PIC X(30).
03 FILLER PIC X(05)
VALUE SPACES.
03 LD-ENDCLI PIC X(40).
03 FILLER PIC X(05)
VALUE SPACES.
03 LD-FONECLI PIC X(09).
03 FILLER PIC X(05)
VALUE SPACES.
03 LD-CPFCLI PIC X(11).
03 FILLER PIC X(05)
VALUE SPACES.
03 LD-SALDOCLI PIC ZZ.ZZ9,99
BLANK WHEN ZERO.
03 FILLER PIC X(01)
VALUE SPACES.
* RODAPE 1
01 WS-RODAPE1 PIC X(132)
VALUE ALL "-".
* RODAPE 2
01 WS-RODAPE2.
03 FILLER PIC X(33)
VALUE
"APOS O USO REUTILIZE ESSE RELATOR".
03 FILLER PIC X(33)
VALUE
"IO COMO RASCUNHO - RECLICLE SUAS ".
03 FILLER PIC X(33)
VALUE
"IDEIAS ".
03 FILLER PIC X(33)
VALUE
" INDUSTRIAS JOAQUIM NABUCO LTDA.".
*----------------------------------------------------------------*
* DATA E HORA PARA O RELATORIO
*----------------------------------------------------------------*
01 WS-DATA-SYS.
03 WS-ANO PIC 9(02).
03 WS-MES PIC 9(02).
03 WS-DIA PIC 9(02).
01 WS-DATA-FORMATADA.
03 WS-DIA PIC 9(02).
03 FILLER PIC X(01)
VALUE "/".
03 WS-MES PIC 9(02).
03 FILLER PIC X(03)
VALUE "/20".
03 WS-ANO PIC 9(02).
01 WS-HORA-SYS.
03 WS-HORA PIC 9(02).
03 WS-MINUTO PIC 9(02).
03 WS-SEGUNDO PIC 9(02).
Parte 8
www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218
16
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
01 WS-HORA-FORMATADA.
03 WS-HORA PIC 9(02).
03 FILLER PIC X(01)
VALUE ":".
03 WS-MINUTO PIC 9(02).
03 FILLER PIC X(01)
VALUE ":".
03 WS-SEGUNDO PIC 9(02).
* INDICADORES PARA TBCLIENTE
01 WS-INDICADORES.
03 IENDCLI PIC S9(04) COMP.
03 IFONECLI PIC S9(04) COMP.
03 ICPFCLI PIC S9(04) COMP.
03 ISALDOCLI PIC S9(04) COMP.
01 FS-CLIRELAT PIC X(02).
88 SUCESSO-CLIRELAT VALUE "00".
77 WS-FS PIC X(02).
77 WS-MSG PIC X(60).
77 WS-SQLCODE PIC +9(09).
*----------------------------------------------------------------*
PROCEDURE DIVISION.
*----------------------------------------------------------------*
0000-EXERELAT.
PERFORM 1000-INICIALIZAR
PERFORM 2000-PROCESSAR
UNTIL SQLCODE = +100
PERFORM 3000-TERMINO
STOP RUN
.
1000-INICIALIZAR.
* CARREGAR VARIAVEIS PARA CALCULO DO TEMPO DE PROCESSAMENTO
ACCEPT WS-HORARIO-INICIAL FROM TIME
* INICIALIZACAO DOS CONTADORES
INITIALIZE WS-CONTADORES-COMP
MOVE 99 TO WS-CTLINHA
* LEITURA DA DATA E HORA PARA O CABECALHO DO RELATORIO
ACCEPT WS-DATA-SYS FROM DATE
ACCEPT WS-HORA-SYS FROM TIME
MOVE CORRESPONDING WS-DATA-SYS TO WS-DATA-FORMATADA
MOVE CORRESPONDING WS-HORA-SYS TO WS-HORA-FORMATADA
* DECLARACAO DO CURSOR PARA SELECIONAR CLIENTES SEM EMAIL
EXEC SQL
DECLARE CLISEMEMAIL CURSOR FOR
SELECT CODCLI
,NOMECLI
,ENDCLI
,FONECLI
,CPFCLI
,SALDOCLI
FROM TBCLIENTE
WHERE EMAILCLI IS NULL
END-EXEC
Parte 8
www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218
17
8
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
* ABERTURA DO CURSOR
EXEC SQL
OPEN CLISEMEMAIL
END-EXEC
IF SQLCODE NOT EQUAL 0
MOVE "ERRO AO FECHAR CURSOR"
TO WS-MSG
MOVE SQLCODE TO WS-SQLCODE
GO TO 9000-ERRO-DB2
END-IF
* ABERTURA DO ARQUIVO DE RELATORIO
OPEN OUTPUT CLIRELAT
IF NOT SUCESSO-CLIRELAT
MOVE "ERRO ABERTURA CLIRELAT"
TO WS-MSG
MOVE FS-CLIRELAT TO WS-FS
GO TO 9000-ERRO
END-IF
* LEITURA DA PRIMEIRA LINHA DO CURSOR
PERFORM 1500-LER-CLISEMEMAIL
.
1500-LER-CLISEMEMAIL.
EXEC SQL
FETCH CLISEMEMAIL
INTO :CODCLI
,:NOMECLI
,:ENDCLI :IENDCLI
,:FONECLI :IFONECLI
,:CPFCLI :ICPFCLI
,:SALDOCLI :ISALDOCLI
END-EXEC
IF SQLCODE = 0
ADD 1 TO WS-CTLIDO
PERFORM 1600-TRATA-INDICATOR
ELSE
IF SQLCODE NOT = +100
MOVE "ERRO LEITURA CURSOR CLISEMEMAIL"
TO WS-MSG
MOVE SQLCODE TO WS-SQLCODE
GO TO 9000-ERRO-DB2
END-IF
END-IF
.
1600-TRATA-INDICATOR.
IF IENDCLI < 0
MOVE ALL "*" TO ENDCLI-TEXT
END-IF
IF IFONECLI < 0
MOVE ALL "*" TO FONECLI
END-IF
IF ICPFCLI < 0
MOVE ALL "*" TO CPFCLI
END-IF
IF ISALDOCLI < 0
MOVE ZEROS TO SALDOCLI
END-IF
.
Parte 8
www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218
18
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
2000-PROCESSAR.
IF WS-CTLINHA > 59
PERFORM 2100-IMPRIME-CABECALHO
END-IF
PERFORM 2200-IMPRIME-DETALHE
IF WS-CTLINHA = 58
PERFORM 2300-IMPRIME-RODAPE
END-IF
PERFORM 1500-LER-CLISEMEMAIL
.
2100-IMPRIME-CABECALHO.
MOVE WS-DATA-FORMATADA TO WS-DATA-CABEC1
MOVE WS-HORA-FORMATADA TO WS-HORA-CABEC1
ADD 1 TO WS-CTPAG
MOVE WS-CTPAG TO WS-PAG-CABEC1
WRITE REG-CLIRELAT FROM WS-CABEC1 AFTER PAGE
IF NOT SUCESSO-CLIRELAT
MOVE "ERRO IMPRESSAO CABECALHO 1"
TO WS-MSG
MOVE FS-CLIRELAT TO WS-FS
GO TO 9000-ERRO
END-IF
WRITE REG-CLIRELAT FROM WS-CABEC2
IF NOT SUCESSO-CLIRELAT
MOVE "ERRO IMPRESSAO CABECALHO 2"
TO WS-MSG
MOVE FS-CLIRELAT TO WS-FS
GO TO 9000-ERRO
END-IF
WRITE REG-CLIRELAT FROM WS-CABEC3
IF NOT SUCESSO-CLIRELAT
MOVE "ERRO IMPRESSAO CABECALHO 3"
TO WS-MSG
MOVE FS-CLIRELAT TO WS-FS
GO TO 9000-ERRO
END-IF
WRITE REG-CLIRELAT FROM WS-CABEC4
IF NOT SUCESSO-CLIRELAT
MOVE "ERRO IMPRESSAO CABECALHO 4"
TO WS-MSG
MOVE FS-CLIRELAT TO WS-FS
GO TO 9000-ERRO
END-IF
MOVE 4 TO WS-CTLINHA
.
Parte 8
www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218
19
8
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
2200-IMPRIME-DETALHE.
MOVE CODCLI TO LD-CODCLI
MOVE NOMECLI-TEXT TO LD-NOMECLI
MOVE ENDCLI-TEXT TO LD-ENDCLI
MOVE FONECLI TO LD-FONECLI
MOVE CPFCLI TO LD-CPFCLI
MOVE SALDOCLI TO LD-SALDOCLI
WRITE REG-CLIRELAT FROM WS-LINDET
IF NOT SUCESSO-CLIRELAT
MOVE "ERRO NA IMPRESSAO DO DETALHE."
TO WS-MSG
MOVE FS-CLIRELAT TO WS-FS
GO TO 9000-ERRO
END-IF
ADD 1 TO WS-CTLINHA
ADD 1 TO WS-CTIMP
.
2300-IMPRIME-RODAPE.
COMPUTE WS-PULA = 59 - WS-CTLINHA
WRITE REG-CLIRELAT FROM WS-RODAPE1 AFTER WS-PULA LINES
IF NOT SUCESSO-CLIRELAT
MOVE "ERRO NA IMPRESSAO DO RODAPE 1"
TO WS-MSG
MOVE FS-CLIRELAT TO WS-FS
GO TO 9000-ERRO
END-IF
WRITE REG-CLIRELAT FROM WS-RODAPE2
IF NOT SUCESSO-CLIRELAT
MOVE "ERRO NA IMPRESSAO DO RODAPE 2"
TO WS-MSG
MOVE FS-CLIRELAT TO WS-FS
GO TO 9000-ERRO
END-IF
MOVE 60 TO WS-CTLINHA
.
Parte 8
www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218
20
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
3000-TERMINO.
* VERIFICANDO A NECESSIDADE DE IMPRESSAO DE
* RODAPE NA ULTIMA PAGINA
IF WS-CTLINHA < 60
PERFORM 2300-IMPRIME-RODAPE
END-IF
MOVE WS-CTLIDO TO WS-CTLIDO-F
MOVE WS-CTIMP TO WS-CTIMP-F
MOVE WS-CTPAG TO WS-CTPAG-F
EXEC SQL
CLOSE CLISEMEMAIL
END-EXEC
IF SQLCODE NOT EQUAL 0
MOVE "ERRO AO FECHAR CURSOR"
TO WS-MSG
MOVE SQLCODE TO WS-SQLCODE
GO TO 9000-ERRO-DB2
END-IF
CLOSE CLIRELAT
IF NOT SUCESSO-CLIRELAT
MOVE "ERRO AO FECHAR CLIRELAT"
TO WS-MSG
MOVE FS-CLIRELAT TO WS-FS
GO TO 9000-ERRO
END-IF
ACCEPT WS-HORARIO-FINAL FROM TIME
PERFORM 9000-CALCULA-TEMPO-PROC
PERFORM 9000-IMPRIME-DATA
DISPLAY " "
DISPLAY "================================================="
DISPLAY "== ESTATISTICA FINAL DE PROCESSAMENTO =="
DISPLAY "================================================="
DISPLAY "TOTAL DE CLIENTES LIDOS.......: " WS-CTLIDO-F
DISPLAY "TOTAL DE CLIENTES IMPRESSOS...: " WS-CTIMP-F
DISPLAY "TOTAL DE PAGINAS IMPRESSAS....: " WS-CTPAG-F
DISPLAY "================================================="
DISPLAY "TEMPO TOTAL DE PROCESSAMENTO.........: "
WS-TEMPO-PROCESSAMENTO
DISPLAY "================================================="
DISPLAY "== TERMINO NORMAL DO PROGRAMA EXERELAT =="
DISPLAY "================================================="
.
Parte 8
www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218
21
8
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
9000-ERRO.
DISPLAY "*------------------------------------------------*"
DISPLAY " MENSAGEM......: " WS-MSG
DISPLAY " FILE STATUS...: " WS-FS
DISPLAY "*------------------------------------------------*"
DISPLAY " TERMINO ANORMAL DO PROCESSAMENTO EXERELAT "
DISPLAY "*------------------------------------------------*"
STOP RUN
.
9000-ERRO-DB2.
DISPLAY "*------------------------------------------------*"
DISPLAY " MENSAGEM......: " WS-MSG
DISPLAY " SQLCODE.......: " WS-SQLCODE
DISPLAY "*------------------------------------------------*"
DISPLAY " TERMINO ANORMAL DO PROCESSAMENTO EXERELAT "
DISPLAY "*------------------------------------------------*"
STOP RUN
.
* ROTINA QUE EXIBE AS DATAS FORMATADAS
COPY IMPDATA.
* ROTINA QUE CALCULA TEMPO DE PROCESSAMENTO
COPY CALCTEMP.
Parte 8
www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218
22
Dado o M.E.R abaixo, monte os cursores
solicitados:
a) Cursor CVETERANO com o código, nome dos funcionários e o nome do
departamento que trabalham a mais de 10 anos na empresa, ordenado pelo
nome do departamento.
Atividade Trabalho em dupla
TABFUNC
codfunc(PK)nomefuncdataadminfuncdatademissaofunccoddepto(FK)
TABDEPTO
coddepto(PK)nomedeptocodgerente(FK)
Parte 8
www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218
23
8
b) Cursor CGERENTE com o código e o nome do departamento, código, nome e
data de admissão do gerente do departamento.
Parte 8
www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218
24
Criar as variáveis hospedeiras para receber o
conteúdo dos cursores criados na atividade anterior.
a) CVETERANO
b) CGERENTE
TABFUNC
codfunc(PK) CHAR(4) nomefunc VARCHAR(30)dataadminfunc DATEdatademissaofunc DATEcoddepto(FK) CHAR(3)
TABDEPTO
coddepto(PK) CHAR(3)nomedepto VARCHAR(20)codgerente(FK) CHAR(4)
Atividade Revisão aos pares
Parte 8
www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218
25
8
Impressão de relatório via CURSOR
Objetivo do Programa
A Metal Screws Inc. precisa de um programa que imprima um relatório de
reposição de estoque, para poder fazer os pedidos aos seus fornecedores.
Escrever um programa selecionando da tabela TBPRODUTO aqueles cuja
quantidade em estoque é menor que o limite mínimo em ordem crescente de
descrição. Ler o CURSOR e imprimir o relatório RELREPO, com 60 linhas por página,
contendo cabeçalho, detalhe e rodapé, conforme layout.
Macro-Fluxo
Performance
Atividade Projeto 3 - Relatório
TBPRODUTO
GPXXNND3
RELREPO
Parte 8
www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218
26
Layout do Arquivo
Nome do Arquivo RELREPO
Nome do Registro Tipo e Tamanho Descrição
REG-RELREPO X(80) Relatório de 80 colunas
Layout da Tabela
Nome da tabela TBPRODUTO
Nome da coluna Tipo e Tamanho Complementos
CODPROD CHAR(4) UNIQUE NOT NULL
DESCPROD VARCHAR(20) NOT NULL
UNIDPROD CHAR(5)
LOCALPROD CHAR(5)
QTDEST DECIMAL(5,0)
QTDMAX DECIMAL(5,0) > QTDMIN
QTDMIN DECIMAL(5,0) < QTDMAX
PRECOCOMPRA DECIMAL(8,2) >=0
PRECOVENDA DECIMAL(8,2) >=0
PERCOMIS DECIMAL(4,2) >=0
Layout do Relatório
1 12345678911234567892123456789312345678941234567895123456789612345678971234567898
2 12345678901234567890123456789012345678901234567890123456789012345678901234567890
01 DD/MM/20AAXXHH:MM:SSXXXXXXXXXXX XXREPOSICAO DE ESTOQUEXXXXXXXX PAG.XZ.ZZ9
02 --------------------------------------------------------------------------------
03 CODIGO DESCRICAO PRECO %LUCRO ESTOQUE REPOSICAO
04 --------------------------------------------------------------------------------
05 XXXX XXXXXXXXXXXXXXXXXXXX R$ ***.**9,99 ZZ9,99+ ZZ.ZZ9 ZZ.ZZ9
06 XXXX XXXXXXXXXXXXXXXXXXXX R$ ***.**9,99 ZZ9,99+ ZZ.ZZ9 ZZ.ZZ9
.. XXXX XXXXXXXXXXXXXXXXXXXX R$ ***.**9,99 ZZ9,99+ ZZ.ZZ9 ZZ.ZZ9
57 XXXX XXXXXXXXXXXXXXXXXXXX R$ ***.**9,99 ZZ9,99+ ZZ.ZZ9 ZZ.ZZ9
58 XXXX XXXXXXXXXXXXXXXXXXXX R$ ***.**9,99 ZZ9,99+ ZZ.ZZ9 ZZ.ZZ9
59 --------------------------------------------------------------------------------
60 INDUSTRIAS SEUNOME S/A. SERVIMOS BEM PARA SERVIR SEMPRE.
Parte 8
www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218
27
8
Layout da SYSOUT
1 2 3 4 5
12345678901234567890123456789012345678901234567890
**************************************************
* DATA GREGORIANA 1 - 99/99/2099 *
* DATA GREGORIANA 2 - 99 DE XXXXXXXXX DE 2099 *
* DATA JULIANA – 999 DE 2099 *
* DIA DA SEMANA – XXXXXXXXXXXXX *
**************************************************
1 2 3 4 5
12345678901234567890123456789012345678901234567890
==================================================
== ESTATISTICA FINAL DE PROCESSAMENTO ==
==================================================
QTDE. PRODUTOS LIDOS ................: ZZ.ZZ9
QTDE. PRODUTOS IMPRESSOS.............: ZZ.ZZ9
QTDE. PAGINAS........................: ZZ.ZZ9
==================================================
TEMPO TOTAL DE PROCESSAMENTO.........: HH:MM:SS:CC
==================================================
== TERMINO NORMAL DO PROGRAMA GPXXNND3 ==
==================================================
Parte 8
www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218
28
Observação
Detalhamento do Relatório
O RELREPO tem 4 linhas de cabeçalho, a saber:
01 WS-CABEC1, que contém as variáveis
WS-DATA-CABEC1
WS-PAG-CABEC1
WS-HORA-CABEC1
02 WS-CABEC2, que contém 80 traços “-“
03 WS-CABEC3, que contém os títulos das colunas
04 WS-CABEC4, que contém 80 traços “-“ sobre as colunas
Tem também 1 linha de detalhe, WS-LINDET, com as variáveis:
LD-CODPROD
LD-DESCPROD
LD-PRECOVENDA
LD-LUCRO
LD-QTDEST
LD-QTDREP
Finalmente tem 2 linhas de rodapé
59 WS-RODAPE1, que contém 80 traços
60 WS-RODAPE2, que contém uma frase
Ao carregar data e hora pela rotina de inicialização, garantimos que em todas
as páginas do relatório teremos a mesma data e hora. Isso é crítico quando os
relatórios são longos e impressos próximos à meia-noite.
DD/MM/20AAXXHH:MM:SSXXXXXXXXXXX XXREPOSICAO DE ESTOQUEXXXXXXXX PAG.XZ.ZZ9
05 XXXX XXXXXXXXXXXXXXXXXXXX R$ ***.**9,99 ZZ9,99+ ZZ.ZZ9 ZZ.ZZ9
06 XXXX XXXXXXXXXXXXXXXXXXXX R$ ***.**9,99 ZZ9,99+ ZZ.ZZ9 ZZ.ZZ9
.. XXXX XXXXXXXXXXXXXXXXXXXX R$ ***.**9,99 ZZ9,99+ ZZ.ZZ9 ZZ.ZZ9
57 XXXX XXXXXXXXXXXXXXXXXXXX R$ ***.**9,99 ZZ9,99+ ZZ.ZZ9 ZZ.ZZ9
58 XXXX XXXXXXXXXXXXXXXXXXXX R$ ***.**9,99 ZZ9,99+ ZZ.ZZ9 ZZ.ZZ9
Parte 8
www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218
29
8
O lucro é calculado usando a seguinte fórmula:
COMPUTE WS-LUCRO = (PRECOVENDA / PRECOCOMPRA – 1) * 100
e a variável WS-LUCRO deve ser declarada como PIC S9(3)V9(6).
A quantidade de reposição é calculada usando a seguinte fórmula:
COMPUTE WS-QTDREP = QTDMAX - QTDEST
e a variável WS-QTDREP deve ser declarada como PIC 9(05).
Imprimir relatórios a partir de cursores é uma atividade muito comum e precisa
ser perfeitamente dominada. Execute os passos abaixo (lembre-se de que XXNN é o
seu prefixo de usuário):
1) Edite o programa GPXXNND3 na sua COBLIB
2) Altere o JOB COMPBDB2 para compilar o programa GPXXNND3 e compile até obter MAXCC=0.
3) Copiar o membro EXECOBD3, da JOBLIB de seu instrutor, para sua JOBLIB.
4) Alterar o JOB EXECOBD3, substituindo XXNN pelo seu prefixo de usuário
5) Executar o JOB e comparar o resultado com os de seus colegas
Parte 8
www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218
30
Orientação para processamento
Como já foi visto, não pode haver um parágrafo principal. Executar o parágrafo 1000-INICIALIZAR Executar o parágrafo 2000-PROCESSAR
até que o SQLCODE do cursor seja +100 Executar o parágrafo 3000-TERMINO Encerrar o programa Parágrafo 1000-INICIALIZAR Receber o horário inicial de processamento
Mover zero para os contadores: produtos lidos linhas de detalhes impressas páginas impressas
Mover 99 para o contador de linha (ele começa estourado) Abrir para gravação o arquivo RELREPO Se file status for diferente de “00” Mover mensagem de erro para variável da rotina de erro Mover file status para variável da rotina de erro Executar a rotina de erro (9000-ERRO) Definir o cursor REPOSICAO Abrir o cursor REPOSICAO Se SQLCODE for diferente de zero Mover mensagem de erro para variável da rotina de erro DB2 Mover SQLCODE para a variável formatada Executar a rotina de erro DB2 (9000-ERRO-DB2) Executar o parágrafo 9100-FORMATA-DATA-HORA Executar o parágrafo 1500-LER-REPOSICAO
Parágrafo 1500-LER-REPOSICAO Pegar a próxima linha do cursor REPOSICAO (FETCH) Se SQLCODE for igual a zero Executar o parágrafo 9000-TRATA-INDICATOR Somar 1 ao contador de produtos lidos Senão Se SQLCODE for diferente de 100 Mover mensagem de erro para variável da rotina de erro DB2 Mover SQLCODE para variável formatada Executar a rotina de erro para DB2 (9000-ERRO-DB2) Parágrafo 2000-PROCESSAR
Se contador de linha for maior que 59
Executar a rotina 2100-IMPRIME-CABECALHO
Executar a rotina 2200-IMPRIME-DETALHE
Se contador de linha = 58
Executar a rotina 2300-IMPRIME-RODAPE
Executar o parágrafo 1500-LER-REPOSICAO
Parte 8
www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218
31
8
Parágrafo 2100-IMPRIME-CABECALHO Somar 1 ao contador de páginas impressas Mover o contador de páginas impressas para variável do WS-CABEC1 Mover a data e a hora formatada para variável do WS-CABEC1 Gravar registro do RELREPO com base no WS-CABEC1
pulando uma página e testar file status Gravar registro do RELREPO com base no WS-CABEC2 e testar file status Gravar registro do RELREPO com base no WS-CABEC3 e testar file status Gravar registro do RELREPO com base no WS-CABEC4 e testar file status Mover 4 para o contador de linha Parágrafo 2200-IMPRIME-DETALHE Mover os dados da variável hospedeira para as variáveis na WS-LINDET Calcular o lucro e movê-lo para a variável na WS-LINDET Calcular a quantidade de reposição e movê-la para a variável na WS-LINDET Gravar registro do RELREPO com base na WS-LINDET e testar file status Somar 1 ao contador de linhas de detalhes impressas Somar 1 ao contador de linha Parágrafo 2300-IMPRIME-RODAPE Calcular quantas linhas precisam ser puladas para chegar na linha 59 Gravar registro do RELREPO com base no WS-RODAPE1
pulando linhas para chegar na linha 59 e testar file status Gravar registro do RELREPO com base no WS-RODAPE2 e testar file status Mover 60 para o contador de linha Parágrafo 3000-TERMINO Se contador de linha for menor que 60 Executar a rotina 2300-IMPRIME-RODAPE fim-se
Fechar o arquivo RELREPO
Se file status for diferente de “00” Mover mensagem de erro para variável da rotina de erro Mover file status para variável da rotina de erro Executar a rotina de erro (9000-ERRO) Fechar o cursor REPOSICAO
Se SQLCODE for diferente de zero Mover mensagem de erro para variável da rotina de erro DB2 Mover SQLCODE para a variável formatada Executar a rotina de erro DB2 (9000-ERRO-DB2)
Receber o horário final de processamento
Calcular o tempo de processamento
Exibir SYSOUT de acordo com LAYOUT
Exibir o contador de produtos lidos
Exibir o contador de linhas impressas
Exibir o contador de páginas impressas
Exibir o tempo de processamento
Exibir mensagem de termino normal do programa
Parte 8
www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218
32
Parágrafo 9000-TRATA-INDICATOR
Se o indicator para uma variável hospedeira numérica for negativo
Mover zeros para a variável hospedeira
Se o indicator para uma variável hospedeira alfanumérica for negativo
Mover asteriscos para a variável hospedeira
Parágrafo 9000-ERRO
Exibir mensagem de erro
Exibir file status
Abendar o programa com RETURN-CODE = 12
Parágrafo 9000-ERRO-DB2
Exibir mensagem de erro
Exibir SQLCODE formatado
Exibir SQLERRMC (mensagem de erro do SQLCODE)
Abendar o programa com RETURN-CODE = 16
Parágrafo 9100-FORMATA-DATA-HORA
Receber a data do sistema
Receber a hora do sistema
Mover correspondentemente a data do sistema para variável formatada
Mover correspondentemente a hora do sistema para variável formatada
Parte 8
www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218
33
8
Parte 8
www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218
34
Avaliação Então...Como foi ?!?
Estou fera!
Fiz Certo!
Muito Bom Bom regular ruim Muito ruim
Parte
É um dos precursores dos conceitos dedata warehouse e sistemas de análise de dadostransacionais. Ele é conhecido por suasconvicções de que o data warehouse deve ser
desenhado para ser compreensível e rápido.
Ralph Kimball1944 (68 anos)
Versão 2.2.3
Parte 9
www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218
3
9
Antes de iniciarmos, vamos conversar sobre os tópicos apresentados na capa desta parte. Isso é importante para que seu instrutor e seus colegas saibam como está seu conhecimento sobre o assunto e se você precisa ou pode fornecer ajuda aos colegas e instrutor.
O que você já sabe ?
O que você não sabe ?
Porque é importante conhecer estes tópicos ?
Quais são os seus temores ?
O que você considera difícil ?
Depois de falar sobre o assunto com seus colegas e instrutor, escreva,
desenhe, rabisque, diga algo sobre o que você vai fazer para dominar esses tópicos. Comprometa-se!
Preparation
Trocando Ideias É agora que você fala !!
Reflexão É aqui que você se compromete !!
Parte 9
www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218
4
Chegamos a parte final de nosso treinamento com DB2, aqui aprenderemos os
“macetes” utilizados nos programas batch com DB2, tais como a definição de unidades
lógicas de trabalho, a utilização de cursor para atualização e exclusão posicionada e a
utilização de cursor com JOIN.
Continue praticando em sua casa, criando e dando manutenção em tabelas,
desenvolvendo programas batch, fazendo experiências, etc.
Vamos então à parte final de nosso treinamento.
Presentation
História Finalizando...
Parte 9
www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218
5
9
Este tipo de atualização ocorre quando a atualização é feita em uma linha da
RESULT TABLE que foi posicionada por um comando FETCH de um CURSOR. Neste
caso a cláusula WHERE do UPDATE não define a condição de seleção da linha, mas
declara que está usando a posição corrente do CURSOR (CURRENT OF).
Para usar uma atualização posicionada, a declaração do CURSOR precisa
definir que ele será usado para atualizações, citando as colunas que serão atualizadas
com a seguinte sintaxe:
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
PROCEDURE DIVISION.
.......
EXEC SQL
DECLARE nome_do_cursor CURSOR FOR
SELECT coluna1, coluna2, ......
FROM tabela
WHERE restricao
FOR UPDATE OF coluna1, coluna2, ...
END-EXEC
Critérios para a declaração de cursor com atualização pocisionada:
a) O SELECT deve buscar dados em apenas uma tabela, não é permitido o uso
de JOINs.
b) Não pode ter a cláusula ORDER BY
c) Não pode ter a palavra chave DISTINCT
d) Não pode ter a cláusula GROUP BY ou HAVING
e) Não pode ter subqueries em que busquem seus dados na mesma tabela
Quando o cursor for declarado para atualização com a sintaxe acima, após
cada FETCH o programa pode atualizar a linha lida com a sintaxe abaixo:
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
PROCEDURE DIVISION.
.......
EXEC SQL
UPDATE tabela
SET coluna1 = :valor1,
coluna2 = :valor2,
.......
WHERE CURRENT OF nome_do_cursor
END-EXEC
Teoria Atualização posicionada
Parte 9
www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218
6
Este tipo de atualização ocorre quando é feita a exclusão de uma linha da
RESULT TABLE que foi posicionada por um comando FETCH de um CURSOR. Neste
caso a cláusula WHERE do DELETE não define a condição de seleção da linha, mas
declara que está usando a posição corrente do CURSOR (CURRENT OF).
Para usar uma exclusão posicionada, a declaração do CURSOR precisa definir
que ele será usado para atualizações com a seguinte sintaxe:
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
PROCEDURE DIVISION.
.......
EXEC SQL
DECLARE nome_do_cursor CURSOR FOR
SELECT coluna1, coluna2, ......
FROM tabela
WHERE restricao
FOR UPDATE OF coluna1, coluna2, ...
END-EXEC
Valem os mesmos critérios para a declaração de cursor com atualização
pocisionada, visto anteriormente. Quando o cursor foi declarado para atualização com
a sintaxe acima, após cada FETCH o programa pode excluir a linha lida com a sÍntaxe
abaixo:
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
PROCEDURE DIVISION.
.......
EXEC SQL
DELETE FROM tabela
WHERE CURRENT OF nome_do_cursor
END-EXEC
Teoria Exclusão posicionada
Parte 9
www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218
7
9
Uma Logical Unit of Work (LUW) também conhecida como UNIT OF WORK ou
UNIT OF RECOVERY, é uma sequência de comandos SQL que o DB2 entende como
uma unidade de consistência e recuperação. Este conceito é importante para que o
DB2 possa garantir a integridade do banco de dados. Ele faz isso tendo certeza de
que toda ou nenhuma das atualizações em uma Logical Unit of Work seja feita. Uma
grande responsabilidade de qualquer programa BATCH é agrupar seus comandos
SQL em LUWs.
Alguns processamentos podem ser divididos em pontos nas quais os dados
estão “consistentes”. Por exemplo:
Suponha que todo cliente alterado para inativo, deve ter seus pedidos
excluídos da base. Assim, uma LUW é formada pelo UPDATE do cliente e pelo
DELETE de seus pedidos.
Se o UPDATE ou o DELETE derem SQLCODE < 0, a LUW não está completa
e deve ser emitido um ROLLBACK. Assim, é inaceitável que um processamento seja
interrompido durante uma LUW.
Para o DB2, o final de uma LUW é chamada de COMMIT POINT. Esta situação
é estabelecida ao término normal do programa ou com execução de uma instrução
COMMIT.
Com a instrução COMMIT:
Todas as atualizações feitas até então são validadas
Atualizações são registradas no LOG do DB2
Liberação de páginas e/ou tablespaces presos (lock) podem ocorrer
Indica-se que uma LUW chegou ao seu final com sucesso
Todos os cursores abertos sem a opção WITH HOLD são fechados
Teoria Logical unit of work
COMMIT
linha do
tempo
ponto de
consistência
início da
LUW
novo ponto de
consistência
UPDATE DELETE
término da
LUW
COMMIT
novo ponto de
consistência
UPDATE DELETE
término da
LUW
Parte 9
www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218
8
Uma LUW incompleta deve ser desfeita até o último COMMIT POINT. Este
processamento é conhecido com ROLLBACK. O ROLLBACK é disparado ao término
anormal do programa ou com execução de uma instrução ROLLBACK.
Com a instrução ROLLBACK:
A LUW corrente é abandonada
Todas as atualizações feitas a partir do último COMMIT são desfeitas
Liberação de páginas e/ou tablespaces presos (lock) podem ocorrer
Todos os cursores abertos sem a opção WITH HOLD são fechados
Em geral, nos sistemas Batch que atualizam tabelas do DB2, deve-se estabelecer
as LUW e executar COMMIT e ROLLBACK nos momentos apropriados.
Um programa pode ter vários cursores abertos ao mesmo tempo. Porém
procure sempre manter o menor número de cursores abertos simultaneamente, para
otimizar a performance.
Para programas que irão emitir COMMIT e necessitam reposicionar o cursor,
defina o cursor com cláusula WITH HOLD.
Exemplo:
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
PROCEDURE DIVISION.
.......
EXEC SQL
DECLARE nome_do_cursor CURSOR WITH HOLD FOR
SELECT coluna1, coluna2, ......
FROM tabela
WHERE restricao
FOR UPDATE OF coluna1, coluna2, ...
END-EXEC
Um CLOSE nome_do_cursor não implica no fim de uma Logical Unit of Work
(LUW) e portanto não gera um COMMIT.
Uma instrução COMMIT fecha todos os cursores sem opção WITH HOLD e
valida todas as atualizações efetuadas, encerrando a LUW.
Teoria CURSORES E COMMIT
Parte 9
www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218
9
9
Manutenção no GPAZNND2. Definir no
parágrafo 3000-PROCESSAR uma Logical Unit of
Work (LUW), para executar um COMMIT ou
ROLLBACK.
No parágrafo 3000-PROCESSAR, após a verificação do tipo de movimento,
fazer:
Se WS-TIPOMOVTO-D2 for “I” ou “E” ou “A” ou “C”
Se SQLCODE for igual a zero
COMMIT
Senão
ROLLBACK
Fim-se
Fim-se
Executar os passos abaixo, (lembre-se que XXNN é o prefixo de seu usuário).
1- Fazer uma cópia de segurança do programa GPXXNND2 copiando-o para a
COBLIB com o nome BKPPGMD2.
2- Editar o programa GPXXNND2 fazendo a manutenção solicitada.
3- Altere o JOB COMPBDB2 para compilar o programa GPXXNND2 e submeter o
JOB até obter MAXCC = 0
4- Executar o JOB EXECOBD2 e comparar o resultado com os seus colegas e
com a primeira execução do programa.
Practice
Atividade Prática de laboratório
Parte 9
www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218
10
Anote abaixo os valores dos contadores que foram exibidos na SYSOUT
==================================================
== ESTATISTICA FINAL DE PROCESSAMENTO ==
==================================================
QTDE. PRODUTOS LIDOS MOVPRDD2..........: _________
QTDE. PRODUTOS INSERIDOS TBPRODUTO...: _________
QTDE. PRODUTOS EXCLUIDOS TBPRODUTO...: _________
QTDE. PRODUTOS ALTERADOS TBPRODUTO...: _________
QTDE. PRODUTOS CONSULTADOS TBPRODUTO...: _________
QTDE. MOVIMENTOS INVALIDOS.............: _________
==================================================
TEMPO TOTAL DE PROCESSAMENTO.........: ___________
==================================================
== TERMINO NORMAL DO PROGRAMA GPXXNND2 ==
==================================================
Parte 9
www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218
11
9
Atualização da Tabela TBPRODUTO pelo CURSOR, com base no arquivo de movimentos MOVPRDD4.
Objetivo do Programa
A Metal Screws Inc. precisa fazer outra manutenção em sua tabela de
produtos. Desta vez as alterações e exclusões estão gravadas no arquivo
MOVPRDD4.
Precisamos então escrever o programa GPXXNND4 para ler esse movimento e
atualizar a tabela produto usando a técnica da atualização e exclusão posicionada via
cursor.
Macro-Fluxo
Performance
Atividade PROJETO 4 - ATUALIZACÃO,
TBPRODUTO
MOVPRDD4
GPXXNND4
Parte 9
www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218
12
Layout do Arquivo
Nome do Arquivo MOVPRDD4
Nome do Registro REG-MOVPRDD4
Nome do Campo Tipo e Tamanho
Descrição
CODPROD-D4 X(04) Código
DESCPROD-D4 X(20) Descrição
UNIDPROD-D4 X(05) Unidade (caixa, litro, Kg, etc)
LOCALPROD-D4 X(05) Localização no estoque
QTDEST-D4 9(05) Quantidade em estoque
QTDMAX-D4 9(05) Qtde máxima em estoque
QTDMIN-D4 9(05) Qtde mínima em estoque
PRECOCOMPRA-D4 9(06)V99 Preço de Compra
PRECOVENDA-D4 9(06)V99 Preço de Venda
PERCOMIS-D4 9(02)V99 Percentual de comissão
TIPOMOVTO-D4 X(01) Tipo de movimento (E,A)
Layout da Tabela
Nome da tabela TBPRODUTO
Nome da coluna Tipo e Tamanho
Complementos
CODPROD CHAR(4) UNIQUE NOT NULL
DESCPROD VARCHAR(20) NOT NULL
UNIDPROD CHAR(5)
LOCALPROD CHAR(5)
QTDEST DECIMAL(5,0)
QTDMAX DECIMAL(5,0) > QTDMIN
QTDMIN DECIMAL(5,0) < QTDMAX
PRECOCOMPRA DECIMAL(8,2) >= 0
PRECOVENDA DECIMAL(8,2) >= 0
PERCOMIS DECIMAL(4,2) >= 0
Parte 9
www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218
13
9
Layout da SYSOUT
1 2 3 4 5
12345678901234567890123456789012345678901234567890
**************************************************
* DATA GREGORIANA 1 - 99/99/2099 *
* DATA GREGORIANA 2 - 99 DE XXXXXXXXX DE 2099 *
* DATA JULIANA – 999 DE 2099 *
* DIA DA SEMANA – XXXXXXXXXXXXX *
**************************************************
1 2 3 4 5
12345678901234567890123456789012345678901234567890
==================================================
== ESTATISTICA FINAL DE PROCESSAMENTO ==
==================================================
QTDE. MOVIMENTOS LIDOS MOVPRDD4......: ZZ.ZZ9
QTDE. PRODUTOS LIDOS NO CURSOR.......: ZZ.ZZ9
QTDE. PRODUTOS EXCLUIDOS.............: ZZ.ZZ9
QTDE. PRODUTOS ALTERADOS.............: ZZ.ZZ9
QTDE. MOVIMENTOS INVALIDOS...........: ZZ.ZZ9
==================================================
TEMPO TOTAL DE PROCESSAMENTO.........: HH:MM:SS:CC
==================================================
== TERMINO NORMAL DO PROGRAMA GPXXNND4 ==
==================================================
Parte 9
www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218
14
Observação
Montar um cursor (MANUTENCAO) selecionando da tabela TBPRODUTO
aqueles cuja quantidade em estoque é menor que o limite mínimo. Com base no
cursor MANUTENCAO e no arquivo MOVPRDD4, fazer exclusões e atualizações
posicionadas na tabela PRODUTO via cursor.
O campo TIPOMOVTO-M indica o tipo de movimento:
E – exclusão de produto (exclusão posicionada)
A – alteração dos dados do produto (alteração posicionada)
outro – erro de movimento, ignorar registro
1) Edite o membro BK002D4 em sua BOOKLIB com as variáveis espelho do
arquivo MOVPRDD4.
2) Edite o programa GPXXNND4 em sua COBLIB.
3) Altere o JOB COMPBDB2 para compilar o programa GPXXNND4 e
compilar até obter MAXCC = 0
4) Copie o membro EXECOBD4, da JOBLIB de seu instrutor, para a sua
JOBLIB.
5) Alterar o JOB EXECOBD4, substituindo XXNN pelo seu prefixo de usuário.
6) Executar o JOB e comparar o resultado com os de seus colegas.
Anote abaixo os valores dos contadores que foram exibidos na SYSOUT
==================================================
== ESTATISTICA FINAL DE PROCESSAMENTO ==
==================================================
QTDE. MOVIMENTOS LIDOS MOVPRDD4......: _________
QTDE. PRODUTOS LIDOS NO CURSOR.......: _________
QTDE. PRODUTOS EXCLUIDOS.............: _________
QTDE. PRODUTOS ALTERADOS.............: _________
QTDE. MOVIMENTOS INVALIDOS...........: _________
==================================================
TEMPO TOTAL DE PROCESSAMENTO.........: _________
==================================================
== TERMINO NORMAL DO PROGRAMA GPXXNND4 ==
==================================================
Parte 9
www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218
15
9
Orientação para processamento
Como já foi visto, não pode haver um parágrafo principal. Executar o parágrafo 1000-INICIALIZAR Executar o parágrafo 2000-PROCESSAR
até que o file status do arquivo MOVPRDD4 seja “10” Executar o parágrafo 3000-TERMINO Encerrar o programa Parágrafo 1000-INICIALIZAR Receber o horário inicial de processamento
Mover zero para os contadores: registros lidos no arquivo de movimento produtos lidos no cursor por produto produtos lidos no cursor em geral produtos excluídos da tabela produtos alterados da tabela movimento inválido no arquivo
Abrir para leitura o arquivo MOVPRDD4 Se file status for diferente de “00” Mover mensagem de erro para variável da rotina de erro Mover file status para variável da rotina de erro Executar a rotina de erro (9000-ERRO) Definir o cursor MANUTENCAO com a opção WITH HOLD para atualização e
exclusão pocisionada Executar o parágrafo 1500-LER-MOVPRDD4
Parágrafo 1500-LER-MOVPRDD4
Ler registro do arquivo MOVPRDD4 carregando a variável espelho
Se file status for igual a “00” (sucesso)
Somar 1 ao contador de registros lidos no arquivo de movimento
Senão
Se file status for diferente de “10” (fim de arquivo)
Mover mensagem de erro para variável da rotina de erro
Mover file status para variáveis da rotina de erro
Executar rotina de erro (9000-ERRO)
Parte 9
www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218
16
Parágrafo 2000-PROCESSAR
Se WS-TIPOMOVTO-D4 = “A” OR “E”
Abrir o cursor MANUTENCAO Se SQLCODE for diferente de zero
Mover mensagem de erro para variável da rotina de erro DB2 Mover SQLCODE para a variável formatada Executar a rotina de erro DB2 (9000-ERRO-DB2)
Executar o parágrafo 2100-LER- MANUTENCAO (WITH TEST AFTER)
até que WS-CODPROD-D4 = CODPROD ou SQLCODE = +100
Se SQLCODE = 0 (achou o produto no cursor)
exibir mensagem:
“Para localizar produto XXXX foram necessários ler 9999 registros do cursor”
zerar o contador de registros lidos no cursor por produto
se WS-TIPOMOVTO-D4 = “E”
executar o parágrafo 2200-EXCLUSAO
se WS-TIPOMOVTO-D4 = “A”
executar o parágrafo 2300-ALTERACAO
Senão
Somar 1 ao contador de movimento inválido
Fechar o cursor MANUTENCAO Se SQLCODE for diferente de zero
Mover mensagem de erro para variável da rotina de erro DB2 Mover SQLCODE para a variável formatada Executar a rotina de erro DB2 (9000-ERRO-DB2) Senão
Somar 1 ao contador de movimento inválido
Ler o próximo registro do arquivo MOVPRDD4 (1500-LER-MOVPRDD4)
Parágrafo 2100-LER-MANUTENCAO Pegar a próxima linha do cursor MANUTENCAO (FETCH) Se SQLCODE for igual a zero
Executar a rotina 9000-TRATA-INDICATOR Somar 1 ao contador de produtos lidos pelo cursor em geral Somar 1 ao contador de produtos lidos pelo cursor por produto Senão Se SQLCODE for diferente de 100 Mover mensagem de erro para variável da rotina de erro DB2 Mover SQLCODE para variável formatada Executar a rotina de erro para DB2 (9000-ERRO-DB2)
Parte 9
www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218
17
9
Parágrafo 2200-EXCLUSAO
Excluir a posição corrente do cursor (DELETE) Se SQLCODE = 0
Somar 1 ao contador produtos excluídos COMMIT
senão Se SQLCODE = +100
Somar 1 ao contador movimento inválido Senão
Mover mensagem de erro para variável da rotina de erro DB2 Mover SQLCODE para variável formatada Executar a rotina de erro para DB2 (9000-ERRO-DB2)
Parágrafo 2300-ALTERACAO
Mover os dados da variável espelho WS-REG-MOVPRDD4 com conteúdo válido para as respectivas variáveis hospedeiras. Um campo é considerado com conteúdo válido se for alfanumérico e for diferente de SPACES ou se for numérico e tiver conteúdo numérico (IS NUMERIC). Alterar a posição corrente do cursor (UPDATE) Se SQLCODE = 0
somar 1 ao contador WS-CTALT COMMIT
Senão Se SQLCODE = +100 or -545 somar 1 ao contador WS-CTINV Senão
Mover mensagem de erro para variável da rotina de erro DB2 Mover SQLCODE para variável formatada
executar a rotina 999-ERRO-DB2
Parágrafo 3000-TERMINO
Fechar o arquivo MOVPRDD4
Se file status for diferente de “00” Mover mensagem de erro para variável da rotina de erro Mover file status para variável da rotina de erro Executar a rotina de erro (9000-ERRO)
Receber o horário final de processamento
Calcular o tempo de processamento
Exibir SYSOUT de acordo com LAYOUT
Exibir registros lidos no arquivo de movimento Exibir produtos lidos no cursor em geral Exibir produtos excluídos da tabela Exibir produtos alterados da tabela Exibir movimento inválido no arquivo
Exibir o tempo de processamento
Exibir mensagem de termino normal do programa
Parte 9
www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218
18
Parágrafo 9000-TRATA-INDICATOR
Se o indicator para uma variável hospedeira numérica for negativo
Mover zeros para a variável hospedeira
Se o indicator para uma variável hospedeira alfanumérica for negativo
Mover asteriscos para a variável hospedeira
Parágrafo 9000-ERRO
Exibir mensagem de erro
Exibir file status
Abendar o programa com RETURN-CODE = 12
Parágrafo 9000-ERRO-DB2
Exibir mensagem de erro
Exibir SQLCODE formatado
Exibir SQLERRMC (mensagem de erro do SQLCODE)
Abendar o programa com RETURN-CODE = 16
Parte 9
www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218
19
9
Parte 9
www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218
20
Avaliação Então...Como foi ?!?
Estou fera!
Fiz Certo!
Muito Bom Bom regular ruim Muito ruim
Parte
ANEXOS
Versão 2.2.3
Parte 10
www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218
3
Successful Execution SQLCODE
0 SUCCESSFUL EXECUTION
Warning SQLCODE
12 THE UNQUALIFIED COLUMN NAME column-name WAS INTERPRETED AS A CORRELATED REFERENCE
98 A DYNAMIC SQL STATEMENT ENDS WITH A SEMICOLON
100
ROW NOT FOUND FOR FETCH, UPDATE OR DELETE, OR THE RESULT OF A QUERY IS AN EMPTY
TABLE
110 SQL UPDATE TO A DATA CAPTURE TABLE NOT SIGNALED TO ORIGINATING SUBSYSTEM
111 THE SUBPAGES OPTION IS NOT SUPPORTED FOR TYPE 2 INDEXES
117 THE NUMBER OF INSERT VALUES IS NOT THE SAME AS THE NUMBER OF OBJECT COLUMNS
162 TABLESPACE database-name.tablespace-name HAS BEEN PLACED IN CHECK PENDING
203
THE QUALIFIED COLUMN NAME column-name WAS RESOLVED USING A NON-UNIQUE OR UNEXPOSED
NAME
204 name IS AN UNDEFINED NAME
206
column-name IS NOT A COLUMN OF AN INSERTED TABLE, UPDATED TABLE, OR ANY TABLE
IDENTIFIED IN A FROM CLAUSE
218 THE SQL STATEMENT REFERENCING A REMOTE OBJECT CANNOT BE EXPLAINED
219 THE REQUIRED EXPLANATION TABLE table-name DOES NOT EXIST
220 THE COLUMN column-name IN EXPLANATION TABLE table-name IS NOT DEFINED PROPERLY
304
A VALUE WITH DATA TYPE data-type1 CANNOT BE ASSIGNED TO A HOST VARIABLE BECAUSE THE
VALUE IS NOT WITHIN THE RANGE OF THE HOST VARIABLE IN POSITION position-number WITH DATA
TYPE data-type2
331
THE NULL VALUE HAS BEEN ASSIGNED TO A HOST VARIABLE BECAUSE THE STRING CANNOT BE
TRANSLATED. REASON reason-code, CHARACTER code-point, HOST VARIABLE position-number
339
THE SQL STATEMENT HAS BEEN SUCCESSFULLY EXECUTED, BUT THERE MAY BE SOME
CHARACTER CONVERSION INCONSISTENCIES
402 LOCATION location IS UNKNOWN
403 THE LOCAL OBJECT REFERENCED BY THE CREATE ALIAS STATEMENT DOES NOT EXIST
535 THE RESULT OF THE POSITIONED UPDATE OR DELETE MAY DEPEND ON THE ORDER OF THE ROWS.
541 THE REFERENTIAL OR UNIQUE CONSTRAINT name HAS BEEN IGNORED BECAUSE IT IS A DUPLICATE
551 auth-id DOES NOT HAVE THE PRIVILEGE TO PERFORM OPERATION operation ON OBJECT object-name
552 auth-id DOES NOT HAVE THE PRIVILEGE TO PERFORM OPERATION operation
558 THE WITH GRANT OPTION IS IGNORED
561
THE ALTER, INDEX, AND REFERENCES PRIVILEGES CANNOT BE GRANTED TO PUBLIC AT ALL
LOCATIONS
562
A GRANT OF A PRIVILEGE WAS IGNORED BECAUSE THE GRANTEE ALREADY HAS THE PRIVILEGE
FROM THE GRANTOR
Teoria Sqlcode table
Parte 10
www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218
4
610
INDEX index-name HAS BEEN PLACED IN RECOVER PENDING
625 THE DEFINITION OF TABLE table-name HAS BEEN CHANGED TO INCOMPLETE
626
DROPPING THE INDEX TERMINATES ENFORCEMENT OF THE UNIQUENESS OF A KEY THAT WAS
DEFINED WHEN THE TABLE WAS CREATED
645 WHERE NOT NULL IS IGNORED BECAUSE THE INDEX KEY CANNOT CONTAIN NULL VALUES
650 THE TABLE BEING CREATED OR ALTERED CANNOT BECOME A DEPENDENT TABLE
653
TABLE table-name IN PARTITIONED TABLESPACE tspace-name IS NOT AVAILABLE BECAUSE ITS
PARTITIONED INDEX HAS NOT BEEN CREATED
658 THE SUBPAGES VALUE IS IGNORED FOR THE CATALOG INDEX index-name
664
THE INTERNAL LENGTH OF THE LIMIT-KEY FIELDS FOR THE PARTITIONED INDEX index-name
EXCEEDS THE LENGTH IMPOSED BY THE INDEX MANAGER
738
DEFINITION CHANGE OF object object_name MAY REQUIRE SIMILAR CHANGE ON READ-ONLY
SYSTEMS
802
EXCEPTION ERROR exception-type HAS OCCURRED DURING operation-type OPERATION ON data-type
DATA, POSITION position-number
806
BIND ISOLATION LEVEL RR CONFLICTS WITH TABLESPACE LOCKSIZE PAGE OR LOCKSIZE ROW
AND LOCKMAX 0
807 THE RESULT OF DECIMAL MULTIPLICATION MAY CAUSE OVERFLOW
863 THE CONNECTION WAS SUCCESSFUL BUT ONLY SBCS WILL BE SUPPORTED
2000
TYPE 1 INDEXES WITH SUBPAGES GREATER THAN 1 CANNOT BECOME GROUP BUFFER POOL
DEPENDENT IN A DATA SHARING ENVIRONMENT
30100
OPERATION COMPLETED SUCCESSFULLY BUT A DISTRIBUTION PROTOCOL VIOLATION HAS BEEN
DETECTED. ORIGINAL SQLCODE=original-sqlcode AND ORIGINAL SQLSTATE=original-sqlstate
Error SQLCODE
-7 STATEMENT CONTAINS THE ILLEGAL CHARACTER character
-10 THE STRING CONSTANT BEGINNING string IS NOT TERMINATED
-29 INTO CLAUSE REQUIRED
-60 INVALID type SPECIFICATION : spec
-84 UNACCEPTABLE SQL STATEMENT
-101 THE STATEMENT IS TOO LONG OR TOO COMPLEX
-102 LITERAL STRING IS TOO LONG. STRING BEGINS string
-103 literal IS AN INVALID NUMERIC LITERAL
-104 ILLEGAL SYMBOL "token". SOME SYMBOLS THAT MIGHT BE LEGAL ARE: token-list
-105 INVALID STRING
-107 THE NAME name IS TOO LONG. MAXIMUM ALLOWABLE SIZE IS size
-109 clause CLAUSE IS NOT PERMITTED
-110 INVALID HEXADECIMAL LITERAL BEGINNING string
-111 A COLUMN FUNCTION DOES NOT INCLUDE A COLUMN NAME
-112 THE OPERAND OF A COLUMN FUNCTION IS ANOTHER COLUMN FUNCTION
-113 INVALID CHARACTER FOUND IN string, REASON CODE - nnn
-114 THE LOCATION NAME location DOES NOT MATCH THE CURRENT SERVER
-115
A PREDICATE IS INVALID BECAUSE THE COMPARISON OPERATOR operator IS FOLLOWED BY A
PARENTHESIZED LIST OR BY ANY OR ALL WITHOUT A SUBQUERY
-117 THE NUMBER OF INSERT VALUES IS NOT THE SAME AS THE NUMBER OF OBJECT COLUMNS
Parte 10
www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218
5
-118
THE OBJECT TABLE OR VIEW OF THE INSERT, DELETE, OR UPDATE STATEMENT IS ALSO IDENTIFIED
IN A FROM CLAUSE
-119 A COLUMN IDENTIFIED IN A HAVING CLAUSE IS NOT INCLUDED IN THE GROUP BY CLAUSE
-120 A WHERE CLAUSE OR SET CLAUSE INCLUDES A COLUMN FUNCTION
-121 THE COLUMN name IS IDENTIFIED MORE THAN ONCE IN THE INSERT OR UPDATE STATEMENT
-122
A SELECT STATEMENT WITH NO GROUP BY CLAUSE CONTAINS A COLUMN NAME AND A COLUMN
FUNCTION IN THE SELECT CLAUSE OR A COLUMN NAME IS CONTAINED IN THE SELECT CLAUSE
BUT NOT IN THE GROUP BY CLAUSE
-125 AN INTEGER IN THE ORDER BY CLAUSE DOES NOT IDENTIFY A COLUMN OF THE RESULT
-126 THE SELECT STATEMENT CONTAINS BOTH AN UPDATE CLAUSE AND AN ORDER BY CLAUSE
-127 DISTINCT IS SPECIFIED MORE THAN ONCE IN A SUBSELECT
-128 INVALID USE OF NULL IN A PREDICATE
-129 THE STATEMENT CONTAINS TOO MANY TABLE NAMES
-130
THE ESCAPE CLAUSE CONSISTS OF MORE THAN ONE CHARACTER, OR THE STRING PATTERN
CONTAINS AN INVALID OCCURRENCE OF THE ESCAPE CHARACTER
-131 STATEMENT WITH LIKE PREDICATE HAS INCOMPATIBLE DATA TYPES
-132 A LIKE PREDICATE IS INVALID BECAUSE THE SECOND OPERAND IS NOT A STRING
-133
A COLUMN FUNCTION IN A SUBQUERY OF A HAVING CLAUSE IS INVALID BECAUSE ALL COLUMN
REFERENCES IN ITS ARGUMENT ARE NOT CORRELATED TO THE GROUP BY RESULT THAT THE
HAVING CLAUSE IS APPLIED TO
-134
IMPROPER USE OF LONG STRING COLUMN column-name OR A HOST VARIABLE OF MAXIMUM
LENGTH GREATER THAN 254
-136 SORT CANNOT BE EXECUTED BECAUSE THE SORT KEY LENGTH IS GREATER THAN 4000 BYTES
-137 RESULT OF CONCATENATION TOO LONG
-138 THE SECOND OR THIRD ARGUMENT OF THE SUBSTR FUNCTION IS OUT OF RANGE
-144 INVALID SECTION NUMBER number
-150
THE OBJECT OF THE INSERT, DELETE, OR UPDATE STATEMENT IS A VIEW FOR WHICH THE
REQUESTED OPERATION IS NOT PERMITTED
-151
THE UPDATE STATEMENT IS INVALID BECAUSE THE CATALOG DESCRIPTION OF COLUMN column-
name INDICATES THAT IT CANNOT BE UPDATED
-152
THE DROP clause CLAUSE IN THE ALTER STATEMENT IS INVALID BECAUSE constraint-name IS A
constraint-type
-153 THE CREATE VIEW STATEMENT DOES NOT INCLUDE A REQUIRED COLUMN LIST
-154
THE CREATE VIEW FAILED BECAUSE THE VIEW DEFINITION CONTAINS A UNION, A UNION ALL, OR
A REMOTE OBJECT
-156 THE STATEMENT DOES NOT IDENTIFY A TABLE
-157
ONLY A TABLE NAME CAN BE SPECIFIED IN A FOREIGN KEY CLAUSE. object-name IS NOT THE NAME
OF A TABLE.
-158
THE NUMBER OF COLUMNS SPECIFIED FOR THE VIEW IS NOT THE SAME AS THE NUMBER OF
COLUMNS SPECIFIED BY THE SELECT CLAUSE
-159 DROP OR COMMENT ON token IDENTIFIES A(N) token RATHER THAN A(N) token
-160 THE WITH CHECK OPTION CANNOT BE USED FOR THE SPECIFIED VIEW
-161
THE INSERT OR UPDATE IS NOT ALLOWED BECAUSE A RESULTING ROW DOES NOT SATISFY THE
VIEW DEFINITION
-164 auth-id1 DOES NOT HAVE THE PRIVILEGE TO CREATE A VIEW WITH QUALIFICATION authorization ID
-170 THE NUMBER OF ARGUMENTS SPECIFIED FOR function-name IS INVALID
-171 THE DATA TYPE, LENGTH, OR VALUE OF ARGUMENT nn OF function-name IS INVALID
-173 UR IS SPECIFIED ON THE WITH CLAUSE BUT THE CURSOR IS NOT READ-ONLY
Parte 10
www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218
6
-180 THE STRING REPRESENTATION OF A DATETIME VALUE HAS INVALID SYNTAX
-181 THE STRING REPRESENTATION OF A DATETIME VALUE IS NOT A VALID DATETIME VALUE
-182 AN ARITHMETIC EXPRESSION WITH A DATETIME VALUE IS INVALID
-183
AN ARITHMETIC OPERATION ON A DATE OR TIMESTAMP HAS A RESULT THAT IS NOT WITHIN THE
VALID RANGE OF DATES
-184 AN ARITHMETIC EXPRESSION WITH A DATETIME VALUE CONTAINS A PARAMETER MARKER
-185
THE LOCAL FORMAT OPTION HAS BEEN USED WITH A DATE OR TIME AND NO LOCAL EXIT HAS
BEEN INSTALLED
-186
THE LOCAL DATE LENGTH OR LOCAL TIME LENGTH HAS BEEN INCREASED AND EXECUTING
PROGRAM RELIES ON THE OLD LENGTH
-187
A REFERENCE TO A CURRENT DATE/TIME SPECIAL REGISTER IS INVALID BECAUSE THE MVS TOD
CLOCK IS BAD OR THE MVS PARMTZ IS OUT OF RANGE
-188 THE STRING REPRESENTATION OF A NAME IS INVALID
-189 CCSID ccsid IS UNKNOWN OR INVALID FOR THE DATA TYPE OR SUBTYPE
-191 A STRING CANNOT BE USED BECAUSE IT IS INVALID MIXED DATA
-197
QUALIFIED COLUMN NAMES IN ORDER BY CLAUSE NOT PERMITTED WHEN UNION OR UNION ALL
SPECIFIED
-198 THE OPERAND OF THE PREPARE OR EXECUTE IMMEDIATE STATEMENT IS BLANK OR EMPTY
-199 ILLEGAL USE OF KEYWORD keyword. TOKEN token-list WAS EXPECTED
-203 A REFERENCE TO COLUMN column-name IS AMBIGUOUS
-204 name IS AN UNDEFINED NAME
-205 column-name IS NOT A COLUMN OF TABLE table-name
-206
column-name IS NOT A COLUMN OF AN INSERTED TABLE, UPDATED TABLE, OR ANY TABLE
IDENTIFIED IN A FROM CLAUSE
-208 THE ORDER BY CLAUSE IS INVALID BECAUSE COLUMN name IS NOT PART OF THE RESULT TABLE
-198 THE OPERAND OF THE PREPARE OR EXECUTE IMMEDIATE STATEMENT IS BLANK OR EMPTY
-199 ILLEGAL USE OF KEYWORD keyword. TOKEN token-list WAS EXPECTED
-203 A REFERENCE TO COLUMN column-name IS AMBIGUOUS
-204 name IS AN UNDEFINED NAME
-205 column-name IS NOT A COLUMN OF TABLE table-name
-206
column-name IS NOT A COLUMN OF AN INSERTED TABLE, UPDATED TABLE, OR ANY TABLE
IDENTIFIED IN A FROM CLAUSE
-208 THE ORDER BY CLAUSE IS INVALID BECAUSE COLUMN name IS NOT PART OF THE RESULT TABLE
-219 THE REQUIRED EXPLANATION TABLE table-name DOES NOT EXIST
-220 THE COLUMN column-name IN EXPLANATION TABLE table-name IS NOT DEFINED PROPERLY
-221
"SET OF OPTIONAL COLUMNS" IN EXPLANATION TABLE table-name IS INCOMPLETE. OPTIONAL
COLUMN column-name IS MISSING
-250 THE LOCAL LOCATION NAME IS NOT DEFINED WHEN PROCESSING A THREE-PART OBJECT NAME
-251 TOKEN name IS NOT VALID
-300
THE STRING CONTAINED IN HOST VARIABLE OR PARAMETER position-number IS NOT NUL-
TERMINATED
-301
THE VALUE OF INPUT HOST VARIABLE OR PARAMETER NUMBER position-number CANNOT BE USED
AS SPECIFIED BECAUSE OF ITS DATA TYPE
-302
THE VALUE OF INPUT VARIABLE OR PARAMETER NUMBER position-number IS INVALID OR TOO
LARGE FOR THE TARGET COLUMN OR THE TARGET VALUE
-303
A VALUE CANNOT BE ASSIGNED TO OUTPUT HOST VARIABLE NUMBER position-number BECAUSE
THE DATA TYPES ARE NOT COMPARABLE
Parte 10
www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218
7
-304
A VALUE WITH DATA TYPE data-type1 CANNOT BE ASSIGNED TO A HOST VARIABLE BECAUSE THE
VALUE IS NOT WITHIN THE RANGE OF THE HOST VARIABLE IN POSITION position-number WITH DATA
TYPE data-type2
-305
THE NULL VALUE CANNOT BE ASSIGNED TO OUTPUT HOST VARIABLE NUMBER position-number
BECAUSE NO INDICATOR VARIABLE IS SPECIFIED
-309 A PREDICATE IS INVALID BECAUSE A REFERENCED HOST VARIABLE HAS THE NULL VALUE
-310 DECIMAL HOST VARIABLE OR PARAMETER number CONTAINS NON DECIMAL DATA.
-311
THE LENGTH OF INPUT HOST VARIABLE NUMBER position-number IS NEGATIVE OR GREATER THAN
THE MAXIMUM
-312 UNDEFINED OR UNUSABLE HOST VARIABLE variable-name
-313
THE NUMBER OF HOST VARIABLES SPECIFIED IS NOT EQUAL TO THE NUMBER OF PARAMETER
MARKERS
-314 THE STATEMENT CONTAINS AN AMBIGUOUS HOST VARIABLE REFERENCE
-330
A STRING CANNOT BE USED BECAUSE IT CANNOT BE TRANSLATED. REASON reason-code,
CHARACTER code-point, HOST VARIABLE position-number
-331
A STRING CANNOT BE ASSIGNED TO A HOST VARIABLE BECAUSE IT CANNOT BE TRANSLATED.
REASON reason-code, CHARACTER code-point, POSITION position-number
-332 SYSSTRINGS DOES NOT DEFINE A TRANSLATION FROM CCSID ccsid TO ccsid
-333
THE SUBTYPE OF A STRING VARIABLE IS NOT THE SAME AS THE SUBTYPE KNOWN AT BIND TIME
AND THE DIFFERENCE CANNOT BE RESOLVED BY TRANSLATION
-338 AN ON CLAUSE IS INVALID
-339
THE SQL STATEMENT CANNOT BE EXECUTED FROM AN ASCII BASED DRDA APPLICATION
REQUESTOR TO A V2R2 DB2 SUBSYSTEM
-351
AN UNSUPPORTED SQLTYPE WAS ENCOUNTERED IN POSITION "" ON A PREPARE or DESCRIBE
OPERATION
-400 THE CATALOG HAS THE MAXIMUM NUMBER OF USER DEFINED INDEXES
-401 THE OPERANDS OF AN ARITHMETIC OR COMPARISON OPERATION ARE NOT COMPARABLE
-402 AN ARITHMETIC FUNCTION OR OPERATOR arith-fop IS APPLIED TO CHARACTER OR DATETIME DATA
-404 THE UPDATE OR INSERT STATEMENT SPECIFIES A STRING THAT IS TOO LONG column-name
-405 THE NUMERIC LITERAL literal CANNOT BE USED AS SPECIFIED BECAUSE IT IS OUT OF RANGE
-406 A CALCULATED OR DERIVED NUMERIC VALUE IS NOT WITHIN THE RANGE OF ITS OBJECT COLUMN
-407
AN UPDATE OR INSERT VALUE IS NULL, BUT THE OBJECT COLUMN column-name CANNOT CONTAIN
NULL VALUES
-408
AN UPDATE OR INSERT VALUE IS NOT COMPARABLE WITH THE DATA TYPE OF ITS OBJECT COLUMN
column-name
-409 INVALID OPERAND OF A COUNT FUNCTION
-410 THE FLOATING POINT LITERAL literal CONTAINS MORE THAN 30 CHARACTERS
-411 CURRENT SQLID CANNOT BE USED IN A STATEMENT THAT REFERENCES REMOTE OBJECTS
-412 THE SELECT CLAUSE OF A SUBQUERY SPECIFIES MULTIPLE COLUMNS
-414 A LIKE PREDICATE IS INVALID BECAUSE THE FIRST OPERAND IS NOT A STRING
-415
THE CORRESPONDING COLUMNS, column-number, OF THE OPERANDS OF A UNION OR A UNION ALL
DO NOT HAVE COMPARABLE COLUMN DESCRIPTIONS
-416 AN OPERAND OF A UNION CONTAINS A LONG STRING COLUMN
-417
A STATEMENT STRING TO BE PREPARED INCLUDES PARAMETER MARKERS AS THE OPERANDS OF
THE SAME OPERATOR
-418 A STATEMENT STRING TO BE PREPARED CONTAINS AN INVALID USE OF PARAMETER MARKERS
-419
THE DECIMAL DIVIDE OPERATION IS INVALID BECAUSE THE RESULT WOULD HAVE A NEGATIVE
SCALE
-420
THE VALUE OF A CHARACTER STRING ARGUMENT WAS NOT ACCEPTABLE TO THE function-name
FUNCTION
Parte 10
www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218
8
-421 THE OPERANDS OF A UNION OR UNION ALL DO NOT HAVE THE SAME NUMBER OF COLUMNS
-426 DYNAMIC COMMIT NOT VALID AT AN APPLICATION SERVER WHERE UPDATES ARE NOT ALLOWED
-427
DYNAMIC ROLLBACK NOT VALID AT AN APPLICATION SERVER WHERE UPDATES ARE NOT
ALLOWED
-440
THE NUMBER OF PARAMETERS IN THE PARAMETER LIST DOES NOT MATCH THE NUMBER OF
PARAMETERS EXPECTED FOR STORED PROCEDURE name, AUTHID authid, LUNAME luname. number
PARAMETERS WERE EXPECTED.
-444 USER PROGRAM name COULD NOT BE FOUND
-450
STORED PROCEDURE name, PARAMETER NUMBER number, OVERLAYED STORAGE BEYOND ITS
DECLARED LENGTH
-469 SQL CALL STATEMENT MUST SPECIFY AN OUTPUT HOST VARIABLE FOR PARAMETER number.
-470
SQL CALL STATEMENT SPECIFIED A NULL VALUE FOR INPUT PARAMETER number, BUT THE STORED
PROCEDURE DOES NOT SUPPORT NULL VALUES
-471 SQL CALL FOR STORED PROCEDURE name FAILED DUE TO REASON rc
-500 THE IDENTIFIED CURSOR WAS CLOSED WHEN THE CONNECTION WAS DESTROYED
-501 THE CURSOR IDENTIFIED IN A FETCH OR CLOSE STATEMENT IS NOT OPEN
-502 THE CURSOR IDENTIFIED IN AN OPEN STATEMENT IS ALREADY OPEN
-503
A COLUMN CANNOT BE UPDATED BECAUSE IT IS NOT IDENTIFIED IN THE UPDATE CLAUSE OF THE
SELECT STATEMENT OF THE CURSOR
-504 THE CURSOR NAME cursor-name IS NOT DEFINED
-507 THE CURSOR IDENTIFIED IN THE UPDATE OR DELETE STATEMENT IS NOT OPEN
-508 THE CURSOR IDENTIFIED IN THE UPDATE OR DELETE STATEMENT IS NOT POSITIONED ON A ROW
-509
THE TABLE IDENTIFIED IN THE UPDATE OR DELETE STATEMENT IS NOT THE SAME TABLE
DESIGNATED BY THE CURSOR
-510
THE TABLE DESIGNATED BY THE CURSOR OF THE UPDATE OR DELETE STATEMENT CANNOT BE
MODIFIED
-511
THE FOR UPDATE CLAUSE CANNOT BE SPECIFIED BECAUSE THE TABLE DESIGNATED BY THE
CURSOR CANNOT BE MODIFIED
-512 STATEMENT REFERENCE TO REMOTE OBJECT IS INVALID
-513 THE ALIAS alias-name MUST NOT BE DEFINED ON ANOTHER LOCAL OR REMOTE ALIAS
-514 THE CURSOR cursor-name IS NOT IN A PREPARED STATE
-516 THE DESCRIBE STATEMENT DOES NOT IDENTIFY A PREPARED STATEMENT
-517
CURSOR cursor-name CANNOT BE USED BECAUSE ITS STATEMENT NAME DOES NOT IDENTIFY A
PREPARED SELECT STATEMENT
-518 THE EXECUTE STATEMENT DOES NOT IDENTIFY A VALID PREPARED STATEMENT
-519
THE PREPARE STATEMENT IDENTIFIES THE SELECT STATEMENT OF THE OPENED CURSOR cursor-
name
-525
THE SQL STATEMENT CANNOT BE EXECUTED BECAUSE IT WAS IN ERROR AT BIND TIME FOR
SECTION = sectno PACKAGE = pkgname CONSISTENCY TOKEN = X'contoken'
-530 THE INSERT OR UPDATE VALUE OF FOREIGN KEY constraint-name IS INVALID
-531
THE PRIMARY KEY IN A PARENT ROW CANNOT BE UPDATED BECAUSE IT HAS ONE OR MORE
DEPENDENT ROWS IN RELATIONSHIP constraint-name
-532 THE RELATIONSHIP constraint-name RESTRICTS THE DELETION OF ROW WITH RID X'rid-number'
-533 INVALID MULTIPLE-ROW INSERT
-534 THE PRIMARY KEY CANNOT BE UPDATED BECAUSE OF MULTIPLE-ROW UPDATE
-536
THE DELETE STATEMENT IS INVALID BECAUSE TABLE table-name CAN BE AFFECTED BY THE
OPERATION
-537
THE PRIMARY KEY CLAUSE, A FOREIGN KEY CLAUSE, OR A UNIQUE CLAUSE IDENTIFIES COLUMN
column-name MORE THAN ONCE
Parte 10
www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218
9
-538
FOREIGN KEY name DOES NOT CONFORM TO THE DESCRIPTION OF THE PRIMARY KEY OF TABLE
table-name
-539 TABLE table-name DOES NOT HAVE A PRIMARY KEY
-540
THE DEFINITION OF TABLE table-name IS INCOMPLETE BECAUSE IT LACKS A PRIMARY INDEX OR A
REQUIRED UNIQUE INDEX
-542
column-name CANNOT BE A COLUMN OF A PRIMARY KEY OR A UNIQUE CONSTRAINT BECAUSE IT
CAN CONTAIN NULL VALUES
-543
A ROW IN A PARENT TABLE CANNOT BE DELETED BECAUSE THE CHECK CONSTRAINT check-
constraint RESTRICTS THE DELETION
-544
THE CHECK CONSTRAINT SPECIFIED IN THE ALTER TABLE STATEMENT CANNOT BE ADDED
BECAUSE AN EXISTING ROW VIOLATES THE CHECK CONSTRAINT
-545
THE REQUESTED OPERATION IS NOT ALLOWED BECAUSE A ROW DOES NOT SATISFY THE CHECK
CONSTRAINT check-constraint
-546 THE CHECK CONSTRAINT constraint-name IS INVALID
-548 A CHECK CONSTRAINT THAT IS DEFINED WITH column-name IS INVALID
-549
THE statement STATEMENT IS NOT ALLOWED FOR object_type1 object_name BECAUSE THE BIND OPTION
DYNAMICRULES(BIND) IN THE object_type2 IS IN EFFECT
-551 auth-id DOES NOT HAVE THE PRIVILEGE TO PERFORM OPERATION operation ON OBJECT object-name
-552 auth-id DOES NOT HAVE THE PRIVILEGE TO PERFORM OPERATION operation
-553 auth-id SPECIFIED IS NOT ONE OF THE VALID AUTHORIZATION IDS
-554 AN AUTHORIZATION ID CANNOT GRANT A PRIVILEGE TO ITSELF
-555 AN AUTHORIZATION ID CANNOT REVOKE A PRIVILEGE FROM ITSELF
-556
authid2 CANNOT HAVE THE privilege PRIVILEGE on_object REVOKED BY authid1 BECAUSE THE
REVOKEE DOES NOT POSSESS THE PRIVILEGE OR THE REVOKER DID NOT MAKE THE GRANT
-557 INCONSISTENT GRANT/REVOKE KEYWORD keyword. PERMITTED KEYWORDS ARE keyword-list
-558 INVALID CLAUSE OR COMBINATION OF CLAUSES ON A GRANT OR REVOKE
-559 ALL AUTHORIZATION FUNCTIONS HAVE BEEN DISABLED
-567
bind-type AUTHORIZATION ERROR USING auth-id AUTHORITY PACKAGE = package-name PRIVILEGE =
privilege
-571 THE STATEMENT WOULD RESULT IN A MULTIPLE SITE UPDATE
-574 THE SPECIFIED DEFAULT VALUE CONFLICTS WITH THE COLUMN DEFINITION.
-601
THE NAME OF THE OBJECT TO BE CREATED IS IDENTICAL TO THE EXISTING NAME name OF THE
OBJECT TYPE obj-type
-602 TOO MANY COLUMNS SPECIFIED IN A CREATE INDEX
-603
A UNIQUE INDEX CANNOT BE CREATED BECAUSE THE TABLE CONTAINS ROWS WHICH ARE
DUPLICATES WITH RESPECT TO THE VALUES OF THE IDENTIFIED COLUMNS
-604 A COLUMN DEFINITION SPECIFIES AN INVALID LENGTH, PRECISION, OR SCALE ATTRIBUTE
-607 OPERATION OR OPTION operation IS NOT DEFINED FOR THIS OBJECT
-611
ONLY LOCKMAX 0 CAN BE SPECIFIED WHEN THE LOCK SIZE OF THE TABLESPACE IS TABLESPACE
OR TABLE
-612 column-name IS A DUPLICATE COLUMN NAME
-613 THE PRIMARY KEY OR A UNIQUE CONSTRAINT IS TOO LONG OR HAS TOO MANY COLUMNS
-614
THE INDEX CANNOT BE CREATED BECAUSE THE SUM OF THE INTERNAL LENGTHS OF THE
IDENTIFIED COLUMNS IS GREATER THAN THE ALLOWABLE MAXIMUM
-615 operation-type IS NOT ALLOWED ON A PACKAGE IN USE
-616 obj-type1 obj-name1 CANNOT BE DROPPED BECAUSE IT IS REFERENCED BY obj-type2 obj-name2
-617 A TYPE 1 INDEX CANNOT BE DEFINED ON A TABLE IN A TABLE SPACE WITH LOCKSIZE ROW
-618 OPERATION operation IS NOT ALLOWED ON SYSTEM DATABASES
Parte 10
www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218
10
-619 OPERATION DISALLOWED BECAUSE THE WORK FILE DATABASE IS NOT STOPPED
-620
KEYWORD keyword IN stmt type STATEMENT IS NOT PERMITTED FOR A TABLE SPACE IN THE WORK
FILE DATABASE
-621 DUPLICATE DBID dbid WAS DETECTED AND PREVIOUSLY ASSIGNED TO database-name
-622 FOR MIXED DATA IS INVALID BECAUSE THE MIXED DATA INSTALL OPTION IS NO
-623 A CLUSTERING INDEX ALREADY EXISTS ON TABLE table-name
-624 TABLE table-name ALREADY HAS A PRIMARY KEY
-625 TABLE table-name DOES NOT HAVE AN INDEX TO ENFORCE THE UNIQUENESS OF THE PRIMARY KEY
-626 THE ALTER STATEMENT IS NOT EXECUTABLE BECAUSE THE PAGE SET IS NOT STOPPED
-627 THE ALTER STATEMENT IS INVALID BECAUSE THE PAGESET HAS USER-MANAGED DATA SETS
-628 THE CLAUSES ARE MUTUALLY EXCLUSIVE.
-629 SET NULL CANNOT BE SPECIFIED BECAUSE FOREIGN KEY name CANNOT CONTAIN NULL VALUES
-630 THE WHERE NOT NULL SPECIFICATION IS INVALID FOR TYPE 1 INDEXES
-631 FOREIGN KEY name IS TOO LONG OR HAS TOO MANY COLUMNS
-632
THE TABLE CANNOT BE DEFINED AS A DEPENDENT OF table-name BECAUSE OF DELETE RULE
RESTRICTIONS
-633 THE DELETE RULE MUST BE delete-rule
-634 THE DELETE RULE MUST NOT BE CASCADE
-635 THE DELETE RULES CANNOT BE DIFFERENT OR CANNOT BE SET NULL
-636 THE PARTITIONING KEYS ARE NOT SPECIFIED IN ASCENDING OR DESCENDING ORDER
-637 DUPLICATE keyword KEYWORD
-638 TABLE table-name CANNOT BE CREATED BECAUSE COLUMN DEFINITION IS MISSING
-639
A NULLABLE COLUMN OF A FOREIGN KEY WITH A DELETE RULE OF SET NULL CANNOT BE A
COLUMN OF THE KEY OF A PARTITIONED INDEX
-640 LOCKSIZE ROW CANNOT BE SPECIFIED BECAUSE TABLE IN THIS TABLESPACE HAS TYPE 1 INDEX
-642 TOO MANY COLUMNS IN UNIQUE CONSTRAINTS
-643 CHECK CONSTRAINT EXCEEDS MAXIMUM ALLOWABLE LENGTH
-644 INVALID VALUE SPECIFIED FOR KEYWORD keyword IN stmt-type TATEMENT
-646
TABLE table-name CANNOT BE CREATED IN PARTITIONED/DEFAULT TABLE SPACE tspace-name
BECAUSE IT ALREADY CONTAINS A TABLE
-647 BUFFERPOOL bp-name CANNOT BE SPECIFIED BECAUSE IT HAS NOT BEEN ACTIVATED
-650 THE ALTER INDEX CANNOT BE EXECUTED, REASON reason
-651 TABLE DESCRIPTION EXCEEDS MAXIMUM SIZE OF OBJECT DESCRIPTOR.
-652 VIOLATION OF INSTALLATION DEFINED EDIT OR VALIDATION PROCEDURE proc-name
-653
TABLE table-name IN PARTITIONED TABLE SPACE tspace-name IS NOT AVAILABLE BECAUSE ITS
PARTITIONED INDEX HAS NOT BEEN CREATED
-655
THE CREATE OR ALTER STOGROUP IS INVALID BECAUSE THE STORAGE GROUP WOULD HAVE BOTH
SPECIFIC AND NON-SPECIFIC VOLUME IDS
-660
INDEX index-name CANNOT BE CREATED ON PARTITIONED TABLE SPACE tspace-name BECAUSE KEY
LIMITS ARE NOT SPECIFIED
-661
INDEX index-name CANNOT BE CREATED ON PARTITIONED TABLE SPACE tspace-name BECAUSE THE
NUMBER OF PART SPECIFICATIONS IS NOT EQUAL TO THE NUMBER OF PARTITIONS OF THE TABLE
SPACE
-662 A PARTITIONED INDEX CANNOT BE CREATED ON A NON-PARTITIONED TABLE SPACE tspace-name
-663
THE NUMBER OF KEY LIMIT VALUES IS EITHER ZERO, OR GREATER THAN THE NUMBER OF
COLUMNS IN THE KEY OF INDEX index-name
Parte 10
www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218
11
-665 THE PART CLAUSE OF AN ALTER STATEMENT IS OMITTED OR INVALID
-666 stmt-verb object CANNOT BE EXECUTED BECAUSE function IS IN PROGRESS
-667 THE CLUSTERING INDEX FOR A PARTITIONED TABLE SPACE CANNOT BE EXPLICITLY DROPPED
-668 THE COLUMN CANNOT BE ADDED TO THE TABLE BECAUSE THE TABLE HAS AN EDIT PROCEDURE
-669 A TABLE IN A PARTITIONED TABLE SPACE CANNOT BE EXPLICITLY DROPPED
-670 THE RECORD LENGTH OF THE TABLE EXCEEDS THE PAGE SIZE LIMIT
-671
THE BUFFERPOOL ATTRIBUTE OF THE TABLE SPACE CANNOT BE ALTERED AS SPECIFIED BECAUSE
IT WOULD CHANGE THE PAGE SIZE OF THE TABLE SPACE
-672 OPERATION DROP NOT ALLOWED ON TABLE table_name
-676 A 32K PAGE BUFFERPOOL MAY NOT BE USED FOR AN INDEX
-677 INSUFFICIENT VIRTUAL STORAGE FOR BUFFERPOOL EXPANSION
-678
THE LITERAL literal SPECIFIED FOR THE INDEX LIMIT KEY MUST CONFORM TO THE DATA TYPE data-
type OF THE CORRESPONDING COLUMN column-name
-679 THE OBJECT name CANNOT BE CREATED BECAUSE A DROP IS PENDING ON THE OBJECT
-680 TOO MANY COLUMNS SPECIFIED FOR A TABLE
-681
COLUMN column-name IN VIOLATION OF INSTALLATION DEFINED FIELD PROCEDURE. RT: return-code,
RS: reason-code, MSG: message-token
-682 FIELD PROCEDURE procedure-name COULD NOT BE LOADED
-683
INVALID COLUMN TYPE FOR FIELDPROC, BIT DATA, SBCS DATA, OR MIXED DATA OPTION, column-
name
-684 THE LENGTH OF LITERAL LIST BEGINNING string IS TOO LONG
-685 INVALID FIELD TYPE, column-name
-686
COLUMN DEFINED WITH A FIELD PROCEDURE CAN NOT COMPARE WITH ANOTHER COLUMN WITH
DIFFERENT FIELD PROCEDURE
-687 FIELD TYPES INCOMPARABLE
-688 INCORRECT DATA RETURNED FROM FIELD PROCEDURE, column-name, msgno
-689 TOO MANY COLUMNS DEFINED FOR A DEPENDENT TABLE
-690 THE STATEMENT IS REJECTED BY DATA DEFINITION CONTROL SUPPORT. REASON reason-code
-691 THE REQUIRED REGISTRATION TABLE table-name DOES NOT EXIST
-692
THE REQUIRED UNIQUE INDEX index-name FOR DDL REGISTRATION TABLE table-name DOES NOT
EXIST
-693
THE COLUMN column-name IN DDL REGISTRATION TABLE OR INDEX table-name (index-name) IS NOT
DEFINED PROPERLY
-694
THE DDL STATEMENT CANNOT BE EXECUTED BECAUSE A DROP IS PENDING ON THE DDL
REGISTRATION TABLE table-name
-713 THE REPLACEMENT VALUE FOR special-register IS INVALID
-715
PROGRAM program-name WITH MARK release-dependency-mark FAILED BECAUSE IT DEPENDS ON
FUNCTIONS OF THE RELEASE FROM WHICH FALLBACK HAS OCCURRED
-716 PROGRAM program-name PRECOMPILED WITH INCORRECT LEVEL FOR THIS RELEASE.
-717
bind-type FOR object-type object-name WITH MARK release-dependency-mark FAILED BECAUSE object-type
DEPENDS ON FUNCTIONS OF THE RELEASE FROM WHICH FALLBACK HAS OCCURRED.
-718 REBIND FOR PACKAGE package-name FAILED BECAUSE IBMREQD OF ibmreqd IS INVALID
-719 BIND ADD ERROR USING auth-id AUTHORITY PACKAGE package-name ALREADY EXISTS
-720
BIND ERROR, ATTEMPTING TO REPLACE PACKAGE = package_name WITH VERSION = version2 BUT
THIS VERSION ALREADY EXISTS
-721
BIND ERROR FOR PACKAGE = pkg-id CONTOKEN = 'contoken'X IS NOT UNIQUE SO IT CANNOT BE
CREATED
Parte 10
www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218
12
-722 bind-type ERROR USING auth-id AUTHORITY PACKAGE package-name DOES NOT EXIST
-726
BIND ERROR ATTEMPTING TO REPLACE PACKAGE = . THERE ARE ENABLE OR DISABLE ENTRIES
CURRENTLY ASSOCIATED WITH THE PACKAGE
-730
THE PARENT OF A TABLE IN A READ-ONLY SHARED DATABASE MUST ALSO BE A TABLE IN A READ-
ONLY SHARED DATABASE
-731 USER-DEFINED DATASET dsname MUST BE DEFINED WITH SHAREOPTIONS(1,3)
-732
THE DATABASE IS DEFINED ON THIS SUBSYSTEM WITH THE ROSHARE READ ATTRIBUTE BUT THE
TABLE SPACE OR INDEX SPACE HAS NOT BEEN DEFINED ON THE OWNING SUBSYSTEM
-733
THE DESCRIPTION OF A TABLE SPACE, INDEX SPACE, OR TABLE IN A ROSHARE READ DATABASE
MUST BE CONSISTENT WITH ITS DESCRIPTION IN THE OWNER SYSTEM
-734 THE ROSHARE ATTRIBUTE OF A DATABASE CANNOT BE ALTERED FROM ROSHARE READ
-735 DATABASE dbid CANNOT BE ACCESSED BECAUSE IT IS NO LONGER A SHARED DATABASE
-736 INVALID OBID obid SPECIFIED
-737 IMPLICIT TABLE SPACE NOT ALLOWED
-741 A WORK FILE DATABASE IS ALREADY DEFINED FOR MEMBER member-name
-742 DSNDB07 IS THE IMPLICIT WORK FILE DATABASE
-751
A STORED PROCEDURE HAS BEEN PLACED IN MUST_ROLLBACK STATE DUE TO SQL OPERATION
name
-752
THE CONNECT STATEMENT IS INVALID BECAUSE THE PROCESS IS NOT IN THE CONNECTABLE
STATE
-802
EXCEPTION ERROR 'exception-type' HAS OCCURRED DURING 'operation-type' OPERATION ON 'data-type'
DATA, POSITION 'position-number'
-803
AN INSERTED OR UPDATED VALUE IS INVALID BECAUSE THE INDEX IN INDEX SPACE indexspace-
name CONSTRAINS COLUMNS OF THE TABLE SO NO TWO ROWS CAN CONTAIN DUPLICATE VALUES
IN THOSE COLUMNS. RID OF EXISTING ROW IS X'rid'
-804
AN ERROR WAS FOUND IN THE APPLICATION PROGRAM INPUT PARAMETERS FOR THE SQL
STATEMENT. REASON reason
-805
DBRM or PACKAGE NAME location-name.collection-id.dbrm-name.consistency -token NOT FOUND IN PLAN
plan-name. REASON reason
-807
ACCESS DENIED: PACKAGE package-name IS NOT ENABLED FOR ACCESS FROM connection-type
connection-name
-808 THE CONNECT STATEMENT IS NOT CONSISTENT WITH THE FIRST CONNECT STATEMENT
-811
THE RESULT OF AN EMBEDDED SELECT STATEMENT IS A TABLE OF MORE THAN ONE ROW, OR THE
RESULT OF THE SUBQUERY OF A BASIC PREDICATE IS MORE THAN ONE VALUE
-812
THE SQL STATEMENT CANNOT BE PROCESSED BECAUSE A BLANK COLLECTION-ID WAS FOUND IN
THE CURRENT PACKAGESET SPECIAL REGISTER WHILE TRYING TO FORM A QUALIFIED PACKAGE
NAME FOR PROGRAM program-name.consistency-token USING PLAN plan-name
-815
A GROUP BY OR HAVING CLAUSE IS IMPLICITLY OR EXPLICITLY SPECIFIED IN AN EMBEDDED
SELECT STATEMENT OR A SUBQUERY OF A BASIC PREDICATE
-817
THE SQL STATEMENT CANNOT BE EXECUTED BECAUSE THE STATEMENT WILL RESULT IN A
PROHIBITED UPDATE OPERATION
-818
THE PRECOMPILER-GENERATED TIMESTAMP x IN THE LOAD MODULE IS DIFFERENT FROM THE
BIND TIMESTAMP y BUILT FROM THE DBRM z
-819
THE VIEW CANNOT BE PROCESSED BECAUSE THE LENGTH OF ITS PARSE TREE IN THE CATALOG IS
ZERO
-820
THE SQL STATEMENT CANNOT BE PROCESSED BECAUSE catalog-table CONTAINS A VALUE THAT IS
NOT VALID IN THIS RELEASE
-822 THE SQLDA CONTAINS AN INVALID DATA ADDRESS OR INDICATOR VARIABLE ADDRESS
-840 TOO MANY ITEMS RETURNED IN A SELECT OR INSERT LIST
-842 A CONNECTION TO location-name ALREADY EXISTS
-843 THE SET CONNECTION OR RELEASE STATEMENT MUST SPECIFY AN EXISTING CONNECTION
-870
THE NUMBER OF HOST VARIABLES IN THE STATEMENT IS NOT EQUAL TO THE NUMBER OF
DESCRIPTORS
Parte 10
www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218
13
-900
THE SQL STATEMENT CANNOT BE EXECUTED BECAUSE THE APPLICATION PROCESS IS NOT
CONNECTED TO AN APPLICATION SERVER
-901
UNSUCCESSFUL EXECUTION CAUSED BY A SYSTEM ERROR THAT DOES NOT PRECLUDE THE
SUCCESSFUL EXECUTION OF SUBSEQUENT SQL STATEMENTS
-902 POINTER TO THE ESSENTIAL CONTROL BLOCK (CT/RDA) HAS VALUE 0, REBIND REQUIRED
-904
UNSUCCESSFUL EXECUTION CAUSED BY AN UNAVAILABLE RESOURCE. REASON reason-code, TYPE
OF RESOURCE resource-type, AND RESOURCE NAME resource-name
-905
UNSUCCESSFUL EXECUTION DUE TO RESOURCE LIMIT BEING EXCEEDED, RESOURCE NAME =
resource-name LIMIT = limit-amount1 CPU SECONDS (limit-amount2 SERVICE UNITS) DERIVED FROM limit-
source
-906
THE SQL STATEMENT CANNOT BE EXECUTED BECAUSE THIS FUNCTION IS DISABLED DUE TO A
PRIOR ERROR
-908
bind-type ERROR USING auth-id AUTHORITY BIND, REBIND OR AUTO-REBIND OPERATION IS NOT
ALLOWED
-909 THE OBJECT HAS BEEN DELETED
-910 THE SQL STATEMENT CANNOT ACCESS AN OBJECT ON WHICH A DROP OR ALTER IS PENDING
-911
THE CURRENT UNIT OF WORK HAS BEEN ROLLED BACK DUE TO DEADLOCK OR TIMEOUT. REASON
reason-code, TYPE OF RESOURCE resource-type, AND RESOURCE NAME resource-name
-913
UNSUCCESSFUL EXECUTION CAUSED BY DEADLOCK OR TIMEOUT. REASON CODE reason-code, TYPE
OF RESOURCE resource-type, AND RESOURCE NAME resource-name
-917 BIND PACKAGE FAILED
-918 THE SQL STATEMENT CANNOT BE EXECUTED BECAUSE A CONNECTION HAS BEEN LOST
-919 A ROLLBACK OPERATION IS REQUIRED
-922 AUTHORIZATION FAILURE: error-type ERROR. REASON reason-code
-923
CONNECTION NOT ESTABLISHED: DB2 condition REASON reason-code, TYPE resource-type, NAME resource-
name
-924 DB2 CONNECTION INTERNAL ERROR, function-code, return-code, reason-code
-925 COMMIT NOT VALID IN IMS/VS OR CICS ENVIRONMENT
-926 ROLLBACK NOT VALID IN IMS/VS OR CICS ENVIRONMENT
-927
THE LANGUAGE INTERFACE (LI) WAS CALLED WHEN THE CONNECTING ENVIRONMENT WAS NOT
ESTABLISHED. THE PROGRAM SHOULD BE INVOKED UNDER THE DSN COMMAND
-929 FAILURE IN A DATA CAPTURE EXIT: token
-939 ROLLBACK REQUIRED DUE TO UNREQUESTED ROLLBACK OF A REMOTE SERVER
-947
THE SQL STATEMENT FAILED BECAUSE IT WILL CHANGE A TABLE DEFINED WITH DATA CAPTURE
CHANGES, BUT THE DATA CANNOT BE PROPAGATED
-948 DISTRIBUTED OPERATION IS INVALID
-950
THE LOCATION NAME SPECIFIED IN THE CONNECT STATEMENT IS INVALID OR NOT LISTED IN THE
COMMUNICATIONS DATABASE
-965 STORED PROCEDURE procname TERMINATED ABNORMALLY
-2001
THE NUMBER OF HOST VARIABLE PARAMETERS FOR A STORED PROCEDURE IS NOT EQUAL TO THE
NUMBER OF EXPECTED HOST VARIABLE PARAMETERS. ACTUAL NUMBER sqldanum, EXPECTED
NUMBER opnum
-30000
EXECUTION FAILED DUE TO A DISTRIBUTION PROTOCOL ERROR THAT WILL NOT AFFECT THE
SUCCESSFUL EXECUTION OF SUBSEQUENT COMMANDS OR SQL STATEMENTS: REASON reason-code
(sub-code)
-30020
EXECUTION FAILED DUE TO A DISTRIBUTION PROTOCOL ERROR THAT CAUSED DEALLOCATION OF
THE CONVERSATION: REASON <reason-code (sub-code)>
Parte 10
www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218
14
-30021
EXECUTION FAILED DUE TO A DISTRIBUTION PROTOCOL ERROR THAT WILL AFFECT THE
SUCCESSFUL EXECUTION OF SUBSEQUENT COMMANDS OR SQL STATEMENTS: MANAGER manager
AT LEVEL level NOT SUPPORTED ERROR
-30030
COMMIT REQUEST WAS UNSUCCESSFUL, A DISTRIBUTION PROTOCOL VIOLATION HAS BEEN
DETECTED, THE CONVERSATION HAS BEEN DEALLOCATED. ORIGINAL SQLCODE=original-sqlcode
AND ORIGINAL SQLSTATE=original-sqlstate
-30040
EXECUTION FAILED DUE TO UNAVAILABLE RESOURCES THAT WILL NOT AFFECT THE SUCCESSFUL
EXECUTION OF SUBSEQUENT COMMANDS OR SQL STATEMENTS. REASON <reason-code> TYPE OF
RESOURCE <resource-type> RESOURCE NAME <resource-name> PRODUCT ID <pppvvrrm> RDBNAME
<rdbname>
-30041
EXECUTION FAILED DUE TO UNAVAILABLE RESOURCES THAT WILL AFFECT THE SUCCESSFUL
EXECUTION OF SUBSEQUENT COMMANDS AND SQL STATEMENTS REASON <reason-code> TYPE OF
RESOURCE <resource-type> RESOURCE NAME <resource-name> PRODUCT ID <pppvvrrm> RDBNAME
<rdbname>
-30050
<command-or-SQL-statement-type> COMMAND OR SQL STATEMENT INVALID WHILE BIND PROCESS IN
PROGRESS
-30051 BIND PROCESS WITH SPECIFIED PACKAGE NAME AND CONSISTENCY TOKEN NOT ACTIVE
-30052 PROGRAM PREPARATION ASSUMPTIONS ARE INCORRECT
-30053 OWNER AUTHORIZATION FAILURE
-30060 RDB AUTHORIZATION FAILURE
-30061 RDB NOT FOUND
-30070 <command> COMMAND NOT SUPPORTED ERROR
-30071 <object-type> OBJECT NOT SUPPORTED ERROR
-30072 <parameter>:<subcode> PARAMETER NOT SUPPORTED ERROR
-30073 <parameter>:<subcode> PARAMETER VALUE NOT SUPPORTED ERROR
-30074 REPLY MESSAGE WITH codepoint (svrcod) NOT SUPPORTED ERROR
-30080 COMMUNICATION ERROR code (subcode)
-30090 REMOTE OPERATION INVALID FOR APPLICATION EXECUTION ENVIRONMENT
Parte 10
www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218
15
Os ABENDs com a letra S são do sistema e os com a letra U são de usuários.
Os mais comuns estão em destaque.
S001-4 Wrong length record; Input file record length is not equal to the length stated in the DD or the FD.
IO error, damaged tape, device malfunction; With disk, reading a dataset that was allocated but never written to.
Writing to input file; Concatenation of files with different record lengths or record formats.
S001-5 Reading after the end of the file by non-COBOL program. COBOL intercepts this and displays "QSAM error,
status 92". Out of space on output disk file.
S002 With variable format files used for output.
The record is larger than the track size.
The record length is greater than allowed maximum 32,768.
The wrong record length is being used on output.
The 4-byte record length indicator is wrong.
Record greater than 32,768 bytes
S013-10 A dummy file with no blocksize.
S013-14 A library has run out of space in its directory. You have to backup, delete, and restore the library with
IEBCOPY. A dataset is sequential, but the JCL indicates that it is a library.
S013-18 A library member was specified in the JCL but was not found.
S013-20 The block size is not a multiple of record length.
Check record length in program, compare to actual record length of file
S013-34 The block size was found to be 0. A new file is being created but block size was not in the JCL.
S013-40 Reading a file whose JCL has SYSOUT=
S106 The program on the program library was unreadable. Recompile and link.
S122 The job was canceled because it violated some restriction. A dump was requested
S137 A tape has a bad trailer label. Copy the file with IEBGENER, ignoring the error. The copy will be good.
Using LABEL=2 when there's only one dataset on the tape.
S213 A disk dataset was not actually on the volume stated in the VOL=SER=.
A disk dataset was not actually on the volume indicated in the catalog.
S222 The job was cancelled because it violated some restriction. No dump was requested.
S237 The block count on a tape trailer label is wrong. Probably caused by hardware error. Copy the file with
IEBGENER, ignoring the error. The copy will be good. A problem with the second volume of tape or disk.
S313, 314 An Input/output error in the VTOC of a disk volume. Inform support staff.
S322 The job used more CPU time than it should have. Either the estimate is wrong or the program is in an
uncontrollable loop.
S413 A volume was needed that could not be mounted.
S422 Too many job steps.
S513 Two jobs or DDNAMES wanting same tape at same time.
S522 Job was waiting too long.
S613 A bad tape label.
S637 A bad concatenation, different types of devices were used. An unreadable tape mark or label.
S706 The program on the library was not executable. See linkage editor report that put the program on library.
S713 The tape was unexpired and the operator terminated the job.
S714 Labels on the tape were bad.
S722 Too many lines of print.
Teoria MVS abend code
Parte 10
www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218
16
S804 Region too small for the program.
S806 Program not on the library. May need a JOBLIB or STEPLIB.
S80A Region too small for the program.
S813 Right tape volume, wrong dataset name.
Right dataset name, wrong tape volume.
S913 Security violation.
SA13 Label=n states the wrong number.
SB14 No space in a library directory for this member's name.
SB37 Insufficient disk space.
SD37 Insufficient disk space.
SE37 Insufficient disk space. An E37 on tape datasets is most often caused when the number of requested volumes is
exceeded. The default is 5, therefore a request for the sixth volume will fail with a E37.
S0C1 (Operation Exception)
Executing a program with an unresolved external reference.
Calling a program and the program was not included during link edit.
An uncontrolled loop moved data on top of instructions.
Reading a file that is not open
Your SORTIN DCB was not correct
Mixing compile options RES and NORES in different modules
S0C2 Privileged Operation. Read/write to unopened file. An uncontrolled loop moved data on top of instructions.
S0C4 Protection. An uncontrolled loop moved data on top of instructions. referencing a field in a record of a closed file
referencing an item in Linkage-Section when there was no PARM= in the JCL.
Calling/called programs have different length for items passed in Linkage Section
with COBOL Sort, doing a STOP RUN or GOBACK while an input or output procedure is still running
S0C5 Addressing. Same reasons as for 0C4. Falling through into an ENTRY statement
Transferring control into the middle of a SORT procedure.
S0C6 Specification. Bad boundary alignment for binary data. See reasons for 0C4
S0C7 Data Exception. Program attempting to do math on illegal data. Data is not numeric, but should be.
Moving ZEROS to group item whose subordinate items are packed-decimal. Uninitialized packed-decimal
fields. Record description is wrong. Field starts or ends in the wrong place in the record.
Find record description of creating program.
S0CB Attempting to divide by 0 and not using ON SIZE ERROR
U1002 Conflicting file attributes. See S013.
U1005 Executing with modules compiled both with RES and NORES
U1006 Subscript out of range
U1017 Missing DD statement in JCL for DISPLAY or ACCEPT verb
U1020 Problem opening or processing a file.
Check the file status.
U1026 COBOL sort failed.
U1034 Same as SB37
U1035 Conflicting DCB parameters. Same as S013.
U1037 Program control falls through the last physical statement in program, which is not GOBACK/STOP RUN.
U1056 Program didn’t close a file before ending
U1066,
U1075
Conflicting DCB information for file defined as EXTERNAL
U1072,
U1073,
U1074
Illegal numbers in reference modification
U3000 COBOL LE intercepted the ABEND. Messages in SYSDBOUT.
U4038 COBOL LE intercepted the ABEND. Messages in CEEDUMP.
Parte 10
www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218
17
FILE STATUS SIGNIFICADO
'00' SUCCESSFUL COMPLETION
'02' DUPLICATE KEY, NON UNIQ. ALT INDX
'04' READ, WRONG LENGTH RECORD
'05' OPEN, FILE NOT PRESENT
'07' CLOSE OPTION INCOMPAT FILE DEVICE OPEN IMPLIES TAPE; TAPE NOT USED
'10' END OF FILE
'14' RRN > RELATIVE KEY DATA
'20' INVALID KEY VSAM KSDS OR RRDS
'21' SEQUENCE ERROR ON WRITE OR CHANGING KEY ON REWRITE'
'22' DUPLICATE KEY
'23' RECORD OR FILE NOT FOUND
'24' BOUNDARY VIOLATION. WRITE PAST END OF KSDS RECORD. COBOL 370: REL: REC#
TOO BIG. OUT OF SPACE ON KSDS/RRDS FILE
'30' PERMANENT DATA ERROR. DATA CHECK, PARITY CHK, HARDW
'34' BOUNDARY VIOLATION. WRITE PAST END OF ESDS RECORD OR NO SPACE TO ADD
KSDS/RRDS RECORD. OUT OF SPACE ON SEQUENTIAL FILE
'35' OPEN, FILE NOT PRESENT
'37' OPEN MODE INCOMPAT WITH DEVICE
'38' OPENING FILE CLOSED WITH LOCK
'39' OPEN, FILE ATTRIB CONFLICTING
'41' OPEN, FILE IS OPEN
'42' CLOSE, FILE IS CLOSED
'43' DELETE OR REWRITE & NO GOOD READ FIRST
'44' BOUNDARY VIOLATION/REWRITE REC TOO BIG
'46' SEQUENTIAL READ WITHOUT POSITIONING
'47' READING FILE NOT OPEN AS INPUT/IO/EXTEND
'48' WRITE WITHOUT OPEN IO
'49' DELETE OR REWRITE WITHOUT OPEN IO
'90' UNKNOWN
'91' VSAM - PASSWORD FAILURE
'92' LOGIC ERROR/OPENING AN OPEN FILE OR READING OUTPUT FILE OR WRITE INPUT
FILE OR DEL/REW BUT NO PRIOR READ
'93' VSAM - VIRTSTOR. RESOURCE NOT AVAILABLE
'94' VSAM - SEQUENTIAL READ AFTER END OF FILE OR NO CURRENT REC POINTER FOR
SEQ
'95' VSAM - INVALID FILE INFORMATION OR OPEN OUTPUT (LOAD) WITH FILE THAT NEVER
CONTAINED DATA
'96' VSAM - MISSING DD STATEMENT IN JCL
'97' VSAM - OPEN OK, FILE INTEGRITY VERIFIED FILE SHOULD BE OK
OTHER UNKNOWN REASON
Teoria Tabela de File status
Parte 10
www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218
18
ASCII e a sigla para American Standard Code for Information Interchange. Os
computadores só podem entender números, então o código ASCII é a representação
numérica de caracteres tais como @ A X $, que é usado quando se deseja colocar
dados em ordem. É utilizada nos micro computadores.
Teoria Tabela ascII
Dec Hex Dec Hex Char Dec Hex Char Dec Hex Char
0 0 NUL (null) 64 40 @ 128 80 Ç 192 C0 └
1 1 ☺ SOH (start of heading) 65 41 A 129 81 ü 193 C1 ┴
2 2 ☻ STX (start of text) 66 42 B 130 82 é 194 C2 ┬
3 3 ♥ ETX (end of text) 67 43 C 131 83 â 195 C3 ├
4 4 ♦ EOT (end of transmission) 68 44 D 132 84 ä 196 C4 ─
5 5 ♣ ENQ (enquiry) 69 45 E 133 85 à 197 C5 ┼
6 6 ♠ ACK (acknowledge) 70 46 F 134 86 å 198 C6
7 7 • BEL (bell) 71 47 G 135 87 ç 199 C7
8 8 ◘ BS (backspace) 72 48 H 136 88 ê 200 C8 ╚
9 9 ○ TAB (horizontal tab) 73 49 I 137 89 ë 201 C9 ╔
10 A ◙ LF (line feed) 74 4A J 138 8A è 202 CA ╩
11 B ♂ VT (vertical Tab) 75 4B K 139 8B ï 203 CB ╦
12 C ♀ FF (form feed) 76 4C L 140 8C î 204 CC ╠
13 D ♪ CR (carriage return) 77 4D M 141 8D ì 205 CD ═
14 E ♫ SO (shift out) 78 4E N 142 8E Ä 206 CE ╬
15 F ☼ SI (shift in) 79 4F O 143 8F Å 207 CF
16 10 ► DLE (data link escape) 80 50 P 144 90 É 208 D0
17 11 ◄ DC1 (device control 1) 81 51 Q 145 91 æ 209 D1
18 12 ↕ DC2 (device control 2) 82 52 R 146 92 Æ 210 D2
19 13 ‼ DC3 (device control 3) 83 53 S 147 93 ô 211 D3
20 14 ¶ DC4 (device control 4) 84 54 T 148 94 ö 212 D4
21 15 § NAK (negative acknowledge) 85 55 U 149 95 ò 213 D5
22 16 ▬ SYN (synchronous idle) 86 56 V 150 96 û 214 D6
23 17 ↨ ETB (end of transmission block) 87 57 W 151 97 ù 215 D7
24 18 ↑ CAN (cancel) 88 58 X 152 98 ÿ 216 D8
25 19 ↓ EM (end of medium) 89 59 Y 153 99 Ö 217 D9 ┘
26 1A → SUB (substitute) 90 5A Z 154 9A Ü 218 DA ┌
27 1B ← ESC (escape) 91 5B [ 155 9B ø 219 DB █
28 1C ∟ FS (file separator) 92 5C \ 156 9C £ 220 DC ▄
29 1D ↔ GS (group separator) 93 5D ] 157 9D ¥ 221 DD
30 1E ▲ RS (record separator) 94 5E ^ 158 9E × 222 DE
31 1F ▼ US (unit separator) 95 5F _ 159 9F ƒ 223 DF ▀
32 20 Space 96 60 ` 160 A0 á 224 E0 a
33 21 ! 97 61 a 161 A1 í 225 E1 b
34 22 " 98 62 b 162 A2 ó 226 E2 G
35 23 # 99 63 c 163 A3 ú 227 E3 p
36 24 $ 100 64 d 164 A4 ñ 228 E4 S
37 25 % 101 65 e 165 A5 Ñ 229 E5 s
38 26 & 102 66 f 166 A6 ª 230 E6 µ
39 27 ' 103 67 g 167 A7 º 231 E7 t
40 28 ( 104 68 h 168 A8 ¿ 232 E8 f
41 29 ) 105 69 i 169 A9 ® 233 E9 q
42 2A * 106 6A j 170 AA ¬ 234 EA W
43 2B + 107 6B k 171 AB ½ 235 EB d
44 2C , 108 6C l 172 AC ¼ 236 EC
45 2D - 109 6D m 173 AD ¡ 237 ED
46 2E . 110 6E n 174 AE « 238 EE
47 2F / 111 6F o 175 AF » 239 EF
48 30 0 112 70 p 176 B0 ░ 240 F0
49 31 1 113 71 q 177 B1 ▒ 241 F1 ±
50 32 2 114 72 r 178 B2 ▓ 242 F2
51 33 3 115 73 s 179 B3 │ 243 F3
52 34 4 116 74 t 180 B4 ┤ 244 F4
53 35 5 117 75 u 181 B5 245 F5
54 36 6 118 76 v 182 B6 246 F6
55 37 7 119 77 w 183 B7 247 F7
56 38 8 120 78 x 184 B8 248 F8
57 39 9 121 79 y 185 B9 ╣ 249 F9
58 3A : 122 7A z 186 BA ║ 250 FA
59 3B ; 123 7B { 187 BB ╗ 251 FB
60 3C < 124 7C | 188 BC ╝ 252 FC h
61 3D = 125 7D } 189 BD 253 FD 2
62 3E > 126 7E ~ 190 BE 254 FE þ
63 3F ? 127 7F del 191 BF ┐ 255 FF
char
Parte 10
www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218
19
EBCDIC e a sigla para Extended Binary Coded Decimal Interchange Code, desenvolvida para os Mainframes
no início dos anos de 1960 e são ainda usadas hoje em dia, principalmente nos Mainframes da IBM.
Dec Hex char Dec Hex Char Dec Hex Char Dec Hex Char
0 0 NUL (null) 64 40 SP (space) 128 80 192 C0 {
1 1 SOH (start of heading) 65 41 129 81 a 193 C1 A
2 2 STX (start of text) 66 42 130 82 b 194 C2 B
3 3 ETX (end of text) 67 43 131 83 c 195 C3 C
4 4 PF (punch off) 68 44 132 84 d 196 C4 D
5 5 HT (horizontal tab) 69 45 133 85 e 197 C5 E
6 6 LC (lower case) 70 46 134 86 f 198 C6 F
7 7 DEL (delete) 71 47 135 87 g 199 C7 G
8 8 GE 72 48 136 88 h 200 C8 H
9 9 RLF 73 49 137 89 i 201 C9 I
10 A SMM (start of manual message) 74 4A ¢ 138 8A 202 CA
11 B VT (vertical tab) 75 4B . 139 8B 203 CB
12 C FF (form feed) 76 4C < 140 8C 204 CC
13 D CR (carriage return) 77 4D ( 141 8D 205 CD
14 E SO (shift out) 78 4E + 142 8E 206 CE
15 F SI (shift in) 79 4F | 143 8F 207 CF
16 10 DLE (data link escape) 80 50 & 144 90 208 D0 }
17 11 DC1 (device control 1) 81 51 145 91 j 209 D1 J
18 12 DC2 (device control 2) 82 52 146 92 k 210 D2 K
19 13 TM (tape mark) 83 53 147 93 l 211 D3 L
20 14 RES (restore) 84 54 148 94 m 212 D4 M
21 15 NL (new line) 85 55 149 95 n 213 D5 N
22 16 BS (back space) 86 56 150 96 o 214 D6 O
23 17 IL (idle) 87 57 151 97 p 215 D7 P
24 18 CAN (cancel) 88 58 152 98 q 216 D8 Q
25 19 EM (end of medium) 89 59 153 99 r 217 D9 R
26 1A CC (cursor control) 90 5A ! 154 9A 218 DA
27 1B CU1 (customer use 1) 91 5B $ 155 9B 219 DB
28 1C IFS (interchange file separator) 92 5C * 156 9C 220 DC
29 1D IGS (interchange group separator) 93 5D ) 157 9D 221 DD
30 1E IRS (interchange record separator) 94 5E ; 158 9E 222 DE
31 1F IUS (interchange unit separator) 95 5F ¬ 159 9F ¤ 223 DF
32 20 DS (digit select) 96 60 - 160 A0 224 E0 \
33 21 SOS (start of significance) 97 61 / 161 A1 ~ 225 E1
34 22 FS (field separator) 98 62 162 A2 s 226 E2 S
35 23 99 63 163 A3 t 227 E3 T
36 24 BYP (bypass) 100 64 164 A4 u 228 E4 U
37 25 LF (line feed) 101 65 165 A5 v 229 E5 V
38 26 ETB (end of transmission block) 102 66 166 A6 w 230 E6 W
39 27 ESC (escape) 103 67 167 A7 x 231 E7 X
40 28 104 68 168 A8 y 232 E8 Y
41 29 105 69 169 A9 z 233 E9 Z
42 2A SM (set mode) 106 6A ¦ 170 AA 234 EA
43 2B CU2 (customer use 2) 107 6B , 171 AB 235 EB
44 2C 108 6C % 172 AC 236 EC
45 2D ENQ (enquiry) 109 6D _ 173 AD 237 ED
46 2E ACK (acknowledge) 110 6E > 174 AE 238 EE
47 2F BEL (bell) 111 6F ? 175 AF 239 EF
48 30 112 70 176 B0 240 F0 0
49 31 113 71 177 B1 241 F1 1
50 32 SYN (synchronous idle) 114 72 178 B2 242 F2 2
51 33 115 73 179 B3 243 F3 3
52 34 PN (punch on) 116 74 180 B4 244 F4 4
53 35 RS (reader stop) 117 75 181 B5 245 F5 5
54 36 UC (upper case) 118 76 182 B6 246 F6 6
55 37 EOT (end of transmission) 119 77 183 B7 247 F7 7
56 38 120 78 184 B8 248 F8 8
57 39 121 79 ` 185 B9 249 F9 9
58 3A 122 7A : 186 BA 250 FA
59 3B CU3 (customer use 3) 123 7B # 187 BB 251 FB
60 3C DC4 (device control 4) 124 7C @ 188 BC 252 FC
61 3D NAK (negative acknowledge) 125 7D ' 189 BD 253 FD
62 3E 126 7E = 190 BE 254 FE
63 3F SUB (substitute) 127 7F " 191 BF 255 FF
Teoria Tabela EBCDIC
Usados para
representar
números
negativos.
Usados para
representar
números
positivos.
LOW-VALUES
HIGH-VALUES
Usados para
representar
números sem
sinal.
Parte 10
www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218
20
Teoria POTÊNCIA DE 2
1 Byte
2 Bytes
3 Bytes
4 Bytes