,
Cientista da Computacão pelo IMES-SCS,
,
Especialista em Telecomunicacões pela
FAAP-SP, mestrando em ciência da
,
computacão pela UFAbc-sp.
1
Preparation
Presentation
No curso COBOL Level 2 você deverá escrever programas que irão manipular
dados armazenados em tabelas no DB2.
ç
Defini ão de 1
Teoria modelagem de dados
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.
Der – diagrama
Teoria Entidade - relacionamento
Atributo
Atributo identificador
Entidade
Relacionamento
Linha de ligação
Exemplo de um DER:
1
1:N
1 N
Cliente Faz Pedido
1 1
Teoria CArdinalidade
1:1
1 1
Cliente Exibe Fotografia
1 1
N:1
1 1
Cliente Classifica Classificação
N 1
N:N
1 N
Cliente Compra Produto
N 1
1
identificador de uma entidade na outra. Por exemplo, não podemos colocar o código
do Cliente na entidade Produto, porque um Produto pode ser comprado por N Clientes.
Da mesma forma não podemos colocar o código do produto no Cliente, porque um
Cliente pode comprar N Produtos.
1
Peça
N
N 1
Forma
N:N
N:N
1 N
Fornecedor Comercializa Material
N 1
1 N
Utiliza N:N
N 1
Projeto
1
entidades. Por exemplo, um Fornecedor comercializa Materiais que são utilizados em
Projetos específicos. Observe que temos 3 entidades e apenas 1 relacionamento com
grau 3 (ternário).
Fornecedor Material
N 1 N:N N 1
Utiliza
N:N N:N
1 N
Projeto
Lógica?
É comigo
Mesmo!
Teoria
Mer – modelo
entidade - relacionamento
1
É a representação do modelo lógico de dados. Neste modelo utilizamos os
seguintes símbolos:
Entidade
Um
Nenhum ou um
Nenhum ou muitos
Um ou muitos
Nenhum, um ou muitos
Eu pedi um
rabo de galo!
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.
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
TABVENDA TABVENDA 1
TABITEMVENDA
TABPRODUTO
TABPRODUTO
2º) colocar a entidade associativa entre elas e o N que estava nas pontas vai
para o meio invertendo a ordem: o de baixo sobe e o de cima desce.
Simples
assim ?
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
1. NSU
2. FK+NSU
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
3. FK+FK
Outra forma de montar uma chave primária concatenada é unir numvenda com
o codprod, como mostra a tabela abaixo. 1
tabitemvenda
(numvenda (FK) + codprod(FK)) (PK) qtdeitem
0000100004 3
0000100002 2
0000100001 3
0000200001 5
0000300001 4
0000300004 1
ENTREGADOR
PRODUTO
CLIENTE
1
PRECO
PEDIDO
ITEM
Produto
ATRIBUTO TIPO UNICIDADE PREENCHIMENTO RESTRICAO
CODPROD CHAR(4) UNIQUE NOT NULL
DESCPROD VARCHAR(40) NOT NULL
PRECOVENDA DECIMAL (8,2) >0
QTDEESTOQUE SMALLINT >= 0
Físico?
É comigo
Mesmo!
1
Practice
MER aí?
Vai um
Faça tabelas, com instâncias dos atributos para verificar se a modelagem está
1
correta.
VEICULO
CLIENTE
SERVICO
FUNCIONARIO
OS
SERVOS
PRECO
TÁ MEIO
APERTADO!
1
Performance
N:N N:1
1 N N 1
tabforpag Paga tabvenda Gera tabcliente
N 1 1 1
1 N 1 N
vende N:N
Vende N:N
N:N N1
N1
1 N
tabfornec Fornece tabproduto
N 1 tabservico
Faça tabelas, com instâncias dos atributos para verificar se a modelagem está
1
correta.
TABCLIENTE
TABSERVICO
TABPRODUTO
TABFORNEC
TABFORPAG
TABPAGAMENTO
TABFORNECIMENTO
TABPRODVENDIDO
TABSERVVENDIDO
Estou fera!
Fiz Certo!
Preparation 2
Presentation
Mesmo assim, é fundamental saber modelar usando essas regras para depois,
racionalmente, colocar redundância de dados, objetivando uma maior performance.
Teoria Normaliza ão ç
2
Após o levantamento dos dados (atributos) que darão suporte aos negócios de
um empreendimento é preciso organizá-los em entidades e relacioná-las entre si.
TUPLA ?
Você não
Neste exemplo, temos uma entidade com quis dizer
18 atributos, trata-se de uma Nota Fiscal (com SUPLA !
dados básicos) onde foram vendidos 3 produtos
para um mesmo Cliente e transportados pela
mesma Transportadora. Agora vamos aplicar as
regras de normalização à esse agrupamento de
dados não normalizado.
Eu sou a Norma!
Tenho algumas
normas para
você...
2
Primeira forma
Teoria normal (1fn)
C. J. Date
Norma
número um!
“Uma relação de variáveis está
em 1FN, se e somente se, em
todo valor válido dessa relação
de variáveis, cada tupla contém
exatamente um valor para cada
atributo”
segunda forma
Teoria normal (2fn)
Vamos analisar essas duas entidades e colocar setas a partir dos atributos não
chave em direção ao atributo que dependam funcionalmente.
Nota Fiscal
Número NF (PK) 1025
Data Emissão NF 25/10/2009
CNPJ Cliente 09.154.125/0001-10
Razão Social Cliente Chamex Inc Paper
Endereço Cliente Rua Davila, 34 - Centro - SP
Telefone Cliente 11-3221-8844
CNPJ Transportadora 07.458.478/0001-58
Razão Social Transportadora Zaz Traz Transportes
Endereço Transportadora Av. Angela, 22 - Centro - SBC
Telefone Transportadora 11-4432-8844
Valor total da NF 18252,56
2
chave estrangeirana entidade original. As novas entidades criadas são Cliente,
Transportadora e Produto. Após a aplicação da 2FN temos:
Nota Fiscal
Número NF (PK) 1025
Data Emissão NF 25/10/2009
CNPJ Cliente (FK) 09.154.125/0001-10
CNPJ Transportadora (FK) 07.458.478/0001-58
Valor total da NF 18252,56
C. J. Date
terceira forma
Teoria normal (3fn)
A mesma regra se aplica ao atributo Valor total da NF, que é a soma dos totais
dos itens da nota fiscal. Esse atributo também deve ser eliminado. Finalmente,
utilizando a notação do MER, temos:
Cliente E essa
CNPJ Cliente (PK) é a Norma
Razão Social Cliente número três!
Endereço Cliente
Telefone Cliente
C. J. Date
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.
Economia
do espaco
, Ganho de
em disco
Performance
Normalizar
Desnormalizar
Practice
2
do Projeto, Número de horas trabalhadas no projeto). Vale a pena notar que o
gerente é um empregado.
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.
2
disciplina, pertencente ao curso, quer cursar.
Performance 2
Lembre-se
Das três
Normas
Estou fera!
Fiz Certo!
Preparation
3
Trocando Ideias É agora que você fala !!
Presentation
Vamos para a Parte Prática do nosso curso de COBOL Level 2. Você começará
a usar o DB2 a princípio de forma interativa, depois via programa COBOL.
Para poder usar o DB2 em seu Hércules, você precisará se logar no TSO
usando a Procedure IKJJANIN e na tela do OS/390, você precisará subir o DB2 com o
seguinte comando:
Consegue ver
o hífen do início?
-DB2N START DB2
Teoria ç
Introdu ão ao db2
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.
É 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:
TABELAS
As TABELAS são estruturas lógicas mantidas pelo DB2 para representar uma
ENTIDADE. É formada por um conjunto de colunas. Exemplo:
3
Tabela FUNCIONARIOS
COLUNAS
Tabela FUNCIONARIOS
CODIGO
NOME
Colunas ENDERECO
DATAADMISSAO
SALARIO
LINHA
Uma LINHA é cada conjunto de valores das COLUNAS. Formam uma instância
da ENTIDADE. Exemplo:
Tabela FUNCIONARIOS
Colunas CODIGO NOME ENDERECO DATAADMISSAO SALARIO
Linha 1 000010 PEDRO ALVARES CABRAL RUA DAS FLORES, 117 01/10/2001 5600.00
Linha 2 000023 MARIA ANTONIETA RUA GUILHOTINA, 21 30/05/1987 4300.00
ÍNDICES
É uma lista ordenada de valores que apontam para os dados nas tabelas. É
utilizada para agilizar a leitura dos dados, pois realiza busca binária. Também pode ser
usada para forçar a unicidade dos dados (UNIQUE INDEX). Pode ser formado por
uma (simples) ou mais colunas (composto). Está armazenado em um VSAM LDS
conhecido como INDEXSPACE. Há 3 tipos de índices:
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.
É 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.
DATABASE X
VOLUME 1
TABLESPACE A TABLESPACE A
INDEXSPACE 1
VIEW A
TABELA1 INDEX 1
INDEX 1
VIEW B TABELA2 INDEX 2 INDEX 2
INDEXSPACE 2
VOLUME 2
STORAGE GROUP
TABLESPACE B TABLESPACE B
ÁLIAS
INDEXSPACE 3 VOLUME 3
TABELA3 INDEX 3
INDEX 3
SINÔNIMO
INDEX 4
INDEXSPACE 4 INDEX 4
Igualzinho
Lá em casa!
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:
PRIMARY KEY
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
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 REFERENCIAL
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.
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:
3
DEPENDENTE com uma FOREIGN KEY com este valor.
STRING
NUMERIC
DATETIME
FORMATO STRING
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)
FORMATOS NUMÉRICOS
INTEGER
Define colunas para conter números inteiros usando 31 bits mais sinal. Uma
coluna INTEGER pode conter valores na faixa de –2.147.483.648 até +2.147.483.647.
3
Exemplo:
QUANTIDADE INTEGER
SMALLINT
Define colunas para conter números inteiros usando 15 bits mais sinal. Uma
coluna SMALLINT pode conter valores na faixa de –32.768 até +32.767. Exemplo:
IDADE SMALLINT
DECIMAL
O tipo DECIMAL define colunas com números reais (contendo parte inteira e
decimal). O DB2 aceita colunas DECIMAL com até 31 algarismos. Exemplo: Para
definir a coluna PRECO para 6 algarismos inteiros e 2 decimais (valores até
999999,99). Exemplo:
PRECO DECIMAL(8,2)
REAL
Exemplo:
PESO REAL
Exemplo:
MEDIDA DOUBLE
Ops...
FORMATOS DATETIME
DATE
O tipo DATE define uma coluna com datas. O formato interno é um formato
3
binário próprio do DB2, mas o conteúdo da coluna conterá DIA, MES e ANO de uma
data. Exemplo:
DATANASCIMENTO DATE
TIME
O tipo TIME define uma coluna com o horário. O formato interno é um formato
binário próprio do DB2, mas o conteúdo da coluna conterá HORA, MINUTO e
SEGUNDOS.Exemplo:
HORAPARTIDA TIME
TIMESTAMP
O tipo TIMESTAMP define uma coluna com a data e hora do dia com precisão
até microssegundos. O formato interno é um formato binário próprio do DB2, mas a
coluna conterá ANO, MES, DIA, HORA, MINUTO, SEGUNDOS e
MICROSSEGUNDOS. Exemplo:
DATACRIACAO TIMESTAMP
Teoria constantes
3.14159
Practice
3
Atividade Revisão aos pares
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) Quando ocorrem “Crashes” (erros físicos no sistema) o DB2 permite que você
recupere e restaure rapidamente os dados originais.
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 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 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 ç
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
5 minutos
funcionario departamento
codfunc coddepto
nomefunc nomedepto
cpffunc
coddepto
chamado
numchamado
datahorachamado
codfunc
textofunc
Performance
3
Atividade Todos juntos
cliente
cnpjcliente (PK)
razaosocialcliente
enderecocliente
telefonecliente
notafiscal transportadora
numeronf(PK) cnpjtransportadora(PK)
dataemissaonf razaosocialtransportadora
cnpjcliente(FK) enderecotransportadora
cnpjtransportadora(FK) telefonetransportadora
itemnotafiscal produto
numeroitemnf(PK) codigoproduto(PK)
numeronf(FK) descricaoproduto
codigoproduto(FK) precounitarioproduto
qtdeitemnf qtdeestoque
Estou fera!
Fiz Certo!
Preparation
Presentation
A Linguagem sql
Teoria (Structured query language)
4
características originais do SQL foram inspiradas na álgebra relacional.
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.
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.
Neste primeiro grupo estão os comandos para criar e alterar a estrutura das
tabelas do DB2. Este grupo de comandos é usado geralmente pelo DBA ou pessoal de
suporte. (CREATE, DROP, ALTER)
4
DML – DATA MANIPULATION LANGUAGE
Neste terceiro grupo estão os comandos para dar ou tirar privilégios de acesso
aos objetos do DB2 (GRANT, REVOKE)
Sou DBA,
devo conhecer Sou programador,
SQL DDL e DCL devo conhecer
a fundo. SQL DML e DTL
a fundo.
NOMEANDO OBJETOS
Toda Tabela, Índice, Coluna, View, precisa de um nome. A regra para nomear
objetos no DB2 é a seguinte:
GPXXNN TBPROD
TBPROD DESCPROD
CRIANDO TABELAS
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:
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.
CHAR
Espaço em Branco
VARCHAR
INTEGER
SMALLINT
DECIMAL Zero
REAL
DOUBLE
DATE Data Corrente do Sistema
TIME Hora Corrente do Sistema
TIMESTAMP Data e Hora Corrente do Sistema
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:
Neste exemplo, a definição de Chave Primária foi dada no final com PRIMARY
KEY (NUMCHAMADO).
4
a) Os valores para os números do departamento devem estar entre 10 e 100
inclusive.
b) O cargo do empregado só pode ser um dos seguintes: ‘VENDAS’,
‘GERENTE’ ou ‘AUXILIAR’.
c) Cada empregado que foi admitido antes de 1986 deve ganhar mais de
R$ 40.000,00 de salário anual.
Exemplo:
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:
Índice Tabela
IDXDEPTO DEPTO
Neste exemplo como pode haver mais de um empregado com o mesmo nome,
a cláusula Unique não foi usada.
Tabela Índice
NOMEEMP
CODDEPTO NOMEEMP
AMBROSIO TEIXEIRA
002 BARNABE ATANASIO BARNABE ATANASIO
001 CARLOS MOURA BARNABE ATANASIO
004 AMBROSIO TEIXEIRA CARLOS MOURA
003 BARNABE ATANASIO
EMPREGADO IDXNOME
ALTERANDO TABELAS
4
ALTER TABLE PRODUTO
ADD PRIMARY KEY (CODIGO)
Toda vez que a tabela DEPARTAMENTO sofrer alterações, a VIEW irá refleti-
las. Não é possível inserir dados na VIEW (INSERT), mas podemos alterar (UPDATE)
e excluir (DELETE) dados, o que acarreta alteração e exclusão na tabela original.
departamento
cod_depto cod_gerente nome_depto centro_custo telefone
vdeptosel
cod_depto_sel nome_depto_sel
015 Produção
038 Marketing
HIRARQUIA DE EXCLUSÕES
EXCLUINDO ÍNDICES
EXCLUINDO VIEW
Olá Tabelas,
procuro a tabcliente
Alguém a viu?
CATALOGO DB2
SELECT *
FROM SYSIBM.SYSTABLES
SELECT *
FROM SYSIBM.SYSTABLES
WHERE CREATOR = ‘GPXXNN’
SELECT *
FROM SYSIBM.SYSCOLUMNS
WHERE TBNAME = ‘TABELA’ AND
TBCREATOR = ‘GPXXNN’
SELECT *
FROM SYSIBM.SYSINDEXES
WHERE CREATOR = ‘GPXXNN’
SELECT *
4
FROM SYSIBM.SYSKEYS
WHERE IXCREATOR = ‘GPXXNN’ AND
IXNAME = ‘INDICE’
4
para receber o resulttable. Usaremos o arquivo sequencial
GP.GPXXNN.DB2SAI.
GP.GPXXNN.DB2 SAI
PS/VB
1. Digitar o comando SQL desejado e pressionar a tecla PF3, que sai salvando
2. A mensagem informa que você terminou de editar o comando SQL e que
precisa pressionar a tecla ENTER para executar o comando. Observe que o
campo 6 está com *, indicando que não entrará novamente na edição (Se
desejar editar novamente, coloque Y neste campo)
3. Agora você está vendo (BROWSE) o arquivo de saída. Para voltar ao painel do
SPUFI pressione a tecla PF3.
4
Para comentar os comandos, utilize dois hífens em qualquer coluna. Tudo que
vier na sequência será ignorado pelo DB2.
Practice
1. ( ) SELECT
2. ( ) ROLLBACK
3. ( ) CREATE
4. ( ) UPDATE
5. ( ) ALTER
6. ( ) DROP
7. ( ) GRANT
8. ( ) COMMIT
9. ( ) REVOKE
10. ( ) INSERT
11. ( ) DELETE
4
1) Inserir a coluna PRECOVENDA DECIMAL(9,2) NOT NULL na tabela TBPROD.
Performance
1 2
IDXTIPOCLI IDXTIPOPROD
TBTIPOCLI TBTIPOPROD
CODTIPOCLI (PK) CODTIPOPROD (PK)
DESCTIPOCLI DESCTIPOPROD SET NULL
SET NULL
3 4
IDXCLI IDXPROD
TBCLI TBPROD
CODCLI (PK) CODPROD (PK)
NOMECLI DESCPROD
ENDCLI PRECOPROD
DATANASCCLI UNIDPROD
ALTURACLI CODTIPOPROD (FK)
CODTIPOCLI (FK)
RESTRICT
5
CASCADE
IDXVENDA
TBVENDA
NUMVENDA (PK)
DATAHORAVENDA
QTDEVENDA
CODCLI (FK)
CODPROD (FK)
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
Membro Tabela
CREATE1 TBTIPOCLI
CREATE2 TBTIPOPROD
4
CREATE3 TBCLI
CREATE4 TBPROD
CREATE5 TBVENDA
2) Escrever os comandos SQL DDL para a criação dos índices únicos (UNIQUE
INDEX) para as colunas UNIQUE NOT NULL:
Estou fera!
Fiz Certo!
Preparation
Presentation
5
SELECT Para consultar dados
Teoria insert
O comando INSERT é usado para inserir novas linhas em uma tabela. Sua
sintaxe básica é:
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.
Exemplo 2:
Exemplo 3:
5
CODCLI CHAR(5)
NOMECLI VARCHAR(50)
FONECLI CHAR(10)
SALDOCLI DECIMAL(9,2)
CODCLI CHAR(5)
SALDOCLI DECIMAL(9,2)
Teoria Select
SELECT colunas
FROM tabela
WHERE restrição
Exemplo1:
Neste exemplo a tabela resultado conterá uma relação com o código, nome e
salário da tabela FUNCIONARIOS, para aqueles cujo SALARIO é maior que
R$ 1000,00.
Exemplo 2: Proibido em
muitas empresas!
SELECT *
FROM FUNCIONARIOS
Exemplo 3:
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:
5
PRECOPROD * 1.1 AS AUMENTO
FROM TABPRODUTOAS PROD
Outro exemplo do uso de alias. Aqui foram dados Álias para as colunas e
também para a tabela, artifício que facilitará a digitação de SELECTs com várias
tabelas, como veremos adiante.
Exemplo 5:
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
Operador Descrição
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:
Exemplo 6:
5
Vale relembrar que a prioridade dos operadores lógicos é:
1º. NOT
2º. AND
3º. OR
Exemplo 7:
Exemplo 8:
O exemplo abaixo lista o código dos produtos vendidos, sem repetição, que
foram vendidos mais de 10 unidades.
Exemplo 10:
DISTINCT gentleman
There is no other like him
OPERAÇÕES ARITMÉTICAS
Exemplo 11:
Exemplo 13:
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:
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.
Para ordenar as linhas na tabela resultado usamos ORDER BY, sua sintaxe é a
seguinte:
Com esta sintaxe a tabela resultado será ordenada pelas colunas especificadas
no argumento ORDER BY. O argumento ASC é opcional, pode ser DESC, e indica se
a ordenação é crescente ou decrescente.
5
Exemplo 15:
Exemplo 16:
SELECT NOME,CARGO,DEPTO,SALARIO
FROM FUNCIONARIOS
ORDER BY 4
Exemplo 17:
SELECT CODCLI,CODPROD
FROM TBVENDA
ORDER BY CODCLI ASC, CODPROD DESC
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:
Funções de Data/Hora
Devolve um valor DATE contido na expressão
DATE(coluna)
ou coluna do tipo DATE ou TIMESTAMP
Devolve o dia do mês se a expressão for do tipo
DAY(expressão) DATE, ou a quantidade de dias se a expressão
representar uma diferença de datas.
Devolve um numero inteiro representando o
DAYS(expressão) numero de dias transcorridos entre o valor DATE
da expressão e o dia 01/01/0001.
Retorna o valor da HORA contido na expressão.
HOUR(expressão) Expressão deve ter formato TIME ou
TIMESTAMP.
Devolve o valor dos MICROSSEGUNDOS
MICROSECOND(expressão) contidos na expressão. Expressão precisa ter
formato TIME ou TIMESTAMP.
Devolve o valor dos MINUTOS contidos na
MINUTE(expressão) expressão. Expressão deve ter formato TIME ou
TIMESTAMP
Devolve o valor do MES contido na expressão.
MONTH(expressão) Expressão deve ter formato DATE ou
TIMESTAMP
Devolve o valor dos SEGUNDOS contidos na
SECOND(expressão) expressão. Expressão deve ter formato TIME ou
TIMESTAMP
Devolve o valor do ANO contido na expressão.
YEAR(expressão) Expressão deve ter formato DATE ou
TIMESTAMP
Funções Agregativas
Obtém a média aritmética dos valores das
AVG(DISTINCT coluna) colunas ou expressões. Se DISTINCT for usado,
os valores repetidos serão desprezados.
* obtém a quantidade de linhas selecionadas. Se
COUNT(* ou DISTINCT coluna) DISTINCT for usado, as linhas repetidas não
serão contadas.
Obtém o maior valor contido nas colunas ou
MAX(coluna)
expressões selecionadas.
Obtém o menor valor contido nas colunas ou
MIN(coluna)
expressões selecionadas.
Obtém a soma dos valores das colunas ou
5
SUM(DISTINCT coluna) expressões selecionadas. Se DISTINCT for
usado, os valores repetidos não serão somados.
Funções de Conversão
Converte o resultado de expressão para
STRING. O resultado de expressão pode estar
CHAR(expressão) nos formatos:INTEGER ou SMALLINT
DECIMAL
REAL ou DOUBLE
Transforma o valor de expressão em valor no
DECIMAL(expressão,n1,n2) formato DECIMAL, contendo um total de n1
algarismos e n2 decimais.
Retorna o valor da expressão com os algarismos
no formato de um STRING de caracteres,
DIGITS(expressão) preenchendo com zeros a esquerda. A
expressão deve estar no formato INTEGER,
SMALLINT ou DECIMAL.
Retorna o valor da expressão ou coluna no
FLOAT(expressão)
formato FLOAT.
Retorna um STRING de dígitos hexadecimais
HEX(expressão)
com o valor da expressão.
Retorna o valor da expressão no formato
INTEGER(expressão)
INTEGER
Retorna o numero de caracteres do valor da
LENGTH(expressão)
expressão (ou coluna)
VALUE(expressão,expressão) Retorna o valor da primeira expressão cujo valor
COALESCE (expressão,expressão) não for NULL. São duas funções equivalentes.
Devolve um STRING extraído de STRING1 a
partir de INICIO. O argumento TAMANHO é
SUBSTR(string1,inicio,tamanho) opcional, e indica o comprimento do resultado.
Se TAMANHO for omitido, a extração se inicia
em INICIO até o fim de STRING1.
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
Exemplo 20:
Exemplo 21:
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
5
igual em todos os SELECTs. O data type das colunas correspondentes deve ser igual.
O tamanho das colunas não precisa ser igual, é considerado o tamanho do maior. O
Operador UNION usa as tabelas resultantes e elimina as linhas duplicadas, o que
implica no uso do SORT. O operador UNION ALL também une as tabelas, mas não
elimina as linhas duplicadas. Portanto não usa O SORT.
Exemplo 22:
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:
FUNCIONARIOS
OS 7 TIPOS DE JOIN
TBCLISP TBCLIRJ
008
LEFT 001 002 RIGHT
009
003 010 004
005 006
A B
CODCLISP NOMECLIRJ SALDOCLIRJ
-------+---------+---------+----
001 ---------- ----------
-------- DANIEL 200.00
003 ---------- ----------
-------- ELIZABETE 400.00
005 ---------- ----------
-------- FABIO 600.00
008 PEDRO 800.00
009 JOAO 900.00
010 JOSE 1000.00
A B
CODCLISP NOMECLIRJ SALDOCLIRJ
-------+---------+---------+----
5
001 ---------- ----------
003 ---------- ----------
005 ---------- ----------
008 PEDRO 800.00
009 JOAO 900.00
010 JOSE 1000.00
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.
5
-------+---------+---------+---
001 ---------- ----------
-------- DANIEL 200.00
003 ---------- ----------
-------- ELIZABETE 400.00
005 ---------- ----------
-------- FABIO 600.00
Exemplo 24:
SELECT NOME,SALARIO
FROM FUNCIONARIOS
WHERE DEPTO = ‘P1’ AND
SALARIO < (SELECT AVG(SALARIO)
FROM FUNCIONARIOS
WHERE DEPTO = ‘P2’)
IN
A condição do WHERE deve ser satisfeita pelo menos por UMA linha da
ANY
SUBQUERY
SOME
Teoria update
UPDATE Tabela
SET coluna1=valor1,
Coluna2=valor2,
5
.......
WHERE condição
Exemplo 1:
UPDATE FUNCIONARIOS
SET SALARIO = SALARIO * 1.10,
BONUS = NULL,
COMISSAO = 10.00
WHERE DEPTO = ‘P1’
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)
Teoria delete
Exemplo 1:
Uma Subquery pode ser usada no WHERE para aprimorar a seleção das linhas
excluídas.
Exemplo 2:
Practice
SELECT CODIGO,NOME
1
FROM FUNCIONARIOS
SELECT *
2
FROM FUNCIONARIOS
SELECT CODIGO,NOME
3 FROM FUNCIONARIOS
WHERE CARGO = ‘VENDAS’
SELECT NOME,SALARIO
FROM FUNCIONARIOS
4
WHERE CARGO = ‘VENDAS’
AND SALARIO > 1000
SELECT NOME,SALARIO
FROM FUNCIONARIOS
5
WHERE SALARIO BETWEEN
500 AND 2000
SELECT CODIGO,NOME
FROM FUNCIONARIOS
6
WHERE CARGO IN
(‘VENDAS’,’COBRANCA’)
SELECT NOME
FROM FUNCIONARIOS
7
WHERE NOME LIKE
‘MARIA%’
SELECT NOME,SALARIO
FROM FUNCIONARIOS
8
WHERE SALARIO * 12 >
50000
SELECT NOME,
CURRENT DATE –
DATADEMISSAO
9
FROM FUNCIONARIOS
WHERE DATADEMISSAO
IS NOT NULL
SELECT SUM(SALARIO),
5
AVG(COMISSAO)
1
FROM FUNCIONARIOS
WHERE DEPTO = ‘P1’
SELECT MAX(SALARIO),
2 MIN(SALARIO)
FROM FUNCIONARIOS
SELECT CARGO,
SUM(SALARIO)
3 FROM FUNCIONARIOS
GROUP BY CARGO
HAVING SUM(SALARIO) > 10000
SELECT SALARIO,
DECIMAL(SALARIO,6,1),
INTEGER(SALARIO),
4
HEX(SALARIO),
DIGITS(SALARIO)
FROM FUNCIONARIOS
SELECT NOME,
5 LENGTH(NOME)
FROM FUNCIONARIOS
SELECT SUBSTR(NOME,1,3)
6
FROM FUNCIONARIOS
SELECT COUNT(*)
7
FROM FUNCIONARIOS
SELECT NOME,
VALUE(COMISSAO,0)
8
FROM FUNCIONARIOS
WHERE COMISSAO IS NULL
SELECT NOME,
YEAR(DATANASC)
9
FROM FUNCIONARIOS
WHERE CODFUNC = ‘0010’
SELECT NOME,
YEAR(DATANASC)
10 FROM FUNCIONARIOS
WHERE YEAR(CURRENT DATE
– DATANASC) >= 18
SELECT NOME,SALARIO
5
FROM FUNCIONARIOS
WHERE DEPTO = ‘P1’ AND SALARIO > ALL
1
( SELECT SALARIO
FROM FUNCIONARIOS
WHERE DEPTO = ‘P2’)
SELECT NOME,SALARIO
FROM FUNCIONARIOS
WHERE DEPTO = ‘P1’ AND SALARIO >ANY
2
( SELECT SALARIO
FROM FUNCIONARIOS
WHERE DEPTO = ‘P2’)
SELECT NOME,SALARIO
FROM FUNCIONARIOS
WHERE DEPTO = ‘P1’ AND SALARIO EXISTS
3
( SELECT SALARIO
FROM FUNCIONARIOS
WHERE DEPTO = ‘P2’)
5
CLIENTE PEDIDO MOTOBOY
NUMPED(PK)
CODCLI(PK) CODBOY(PK)
DATAPED
NOMECLI NOMEBOY
CODCLI(FK)
FONECLI ALCUNHABOY
CODBOY(FK)
COMPAGTO
(FK)NUMPED
PK
(FK)CODFORMA ITEM PRODUTO
VALORPAGTO
(FK)NUMPED CODPROD(PK)
PK
NUMITEM DESCPROD
CODPROD(FK) PRECOPROD
QTDPROD
FORMAPGTO
CODFORMA(PK)
DESCFORMA
Performance
1 2
IDXTIPOCLI IDXTIPOPROD
TBTIPOCLI TBTIPOPROD
CODTIPOCLI (PK) CODTIPOPROD (PK)
DESCTIPOCLI DESCTIPOPROD
SET NULL
SET NULL
3 4
IDXCLI IDXPROD
TBCLI TBPROD
CODCLI (PK) CODPROD (PK)
NOMECLI DESCPROD
ENDCLI PRECOPROD
DATANASCCLI UNIDPROD
ALTURACLI CODTIPOPROD (FK)
CODTIPOCLI (FK)
RESTRICT
5
CASCADE
IDXVENDA
TBVENDA
NUMVENDA (PK)
DATAHORAVENDA
QTDEVENDA
CODCLI (FK)
CODPROD (FK)
Atividade INSERT
Dica: para digitar vários comandos SQL no mesmo membro, separe-os usando
ponto-e-vírgula como mostra o exemplo abaixo.
Atividade select
SELECT01 5
Exibir o nome e o endereço dos clientes do tipo ‘01’
SELECT02
SELECT03
SELECT04
SELECT05
SELECT06
SELECT07
SELECT08
Exibir todos os dados dos clientes do tipo ‘03’e (AND) que tenham
mais de 1.7m de altura em ordem decrescente de nome
SELECT09
SELECT10
SELECT11
Exibir o preço dos produtos mais caros por tipo de produto (MAX e
GROUP BY)
SELECT12
5
SELECT13
SELECT14
SELECT15
SELECT16
SELECT17
SELECT18
SELECT19
SELECT20
SELECT21
Atividade UPDATE
UPDATE1
UPDATE2
Alterar para tipo ‘05’ os clientes nascidos depois de 1980 com mais
de 1.6m de altura
UPDATE3
UPDATE4
Lembrem-se das
Regras de integridade
Na exclusão
Atividade DELETE Cascade / delete / set null
5
Excluir as vendas feitas para os clientes ‘0005’ e ‘0010’
DELETE1
DELETE2
DELETE3
DELETE4
Estou fera!
Fiz Certo!
Preparation
6
saibam como está seu conhecimento sobre o assunto e se você precisa ou
pode fornecer ajuda aos colegas e instrutor.
Presentation
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.
Exemplo:
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
EXEC SQL
DELETE FROM FUNCIONARIOS
WHERE DATAADMISSAO IS NOT NULL
6
END-EXEC
HOST VARIABLES
Quando 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).
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.
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
*----------------------------------------------------------------*
WORKING-STORAGE SECTION.
*----------------------------------------------------------------*
EXEC SQL
INCLUDE PRODUTO
END-EXEC
Declaration da Tabela
6
Definição do Arquivo
Variável Hospedeira
Variável Espelho
----+-*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
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
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-==.
E
CO n t ã o
PY
de de eu di
va bo ss
tab r o e
ela iáveis k de a ele
s, m h ar pa
as ospe quivo ra fa
ele de e z
nã iras INCL er
om par UD
eo a E
u vi a s
ue
...
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
*----------------------------------------------------------------*
WORKING-STORAGE SECTION.
*----------------------------------------------------------------*
EXEC SQL
INCLUDE SQLCA
END-EXEC
----+-*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).
Mas se a variável SQLWARN0 for igual a “W”, significa que alguns SQLWARN
foram “setados” para “W”:
6
Os valores a serem testados no SQLCODEsão:
----+-*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
.
Teoria WHENEVER
A cláusula WHENEVER (sempre que) do DB2 pode ser usada para substituir
os testes do SQLCODE, ela define uma ação no programa para onde a execução
continuará quando ocorrer uma condição de erro apontada no WHENEVER.
O WHENEVER no entanto somente intercepta 3 condições de erro:
6
SQLERROR Intercepta SQLCODE negativo
NOT FOUND Intercepta SQLCODE = +100
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
PROCEDURE DIVISION.
EXEC SQL
WHENEVER condicao
GO TO paragrafo
END-EXEC
SQLWARNING
SQLERROR
ou
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
6
*-------------------------------------------------------------*
PROCEDURE DIVISION.
*-------------------------------------------------------------*
*000-ROTINA-PRINCIPAL.
DSNSQL SECTION.
SQL-SKIP.
GO TO SQL-INIT-END.
SQL-INITIAL.
MOVE 1 TO SQL-INIT-FLAG.
CALL 'DSNHADDR' USING SQL-VPARMPTR OF SQL-PLIST2 SQL-PVAR-LIS
- T2.
CALL 'DSNHADDR' USING SQL-PVAR-ADDRS OF SQL-PLIST2 CODPROD OF
DCLPRODUTO SQL-NULL DESCPROD OF DCLPRODUTO SQL-NULL UNIDPROD
OF DCLPRODUTO SQL-NULL LOCALPROD OF DCLPRODUTO SQL-NULL QTDES
- T OF DCLPRODUTO SQL-NULL QTDMAX OF DCLPRODUTO SQL-NULL QTDMIN
OF DCLPRODUTO SQL-NULL PRECOCOMPRA OF DCLPRODUTO SQL-NULL PRE
- COVENDA OF DCLPRODUTO SQL-NULL PERCOMIS OF DCLPRODUTO SQL-NUL
- L
CALL 'DSNHADDR' USING SQL-CODEPTR OF SQL-PLIST2 SQLCA.
SQL-INIT-END.
PERFORM 010-INICIALIZAR
PERFORM 030-PROCESSAR
UNTIL CADPRDD1-EOF
PERFORM 040-TERMINO
STOP RUN
.
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
----+-*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
Objetivo do Programa
6
Macro-Fluxo
CADCLI
EXECARGA
TBCLIENTE
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.
Layout da Tabela
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).
BOOK VARTEMPO
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
*----------------------------------------------------------------*
* VARIAVEL DO HORARIO *
*----------------------------------------------------------------*
01 WS-HORARIO-INICIAL.
05 WS-HORA-I PIC 9(02).
05 WS-MIN-I PIC 9(02).
05 WS-SEG-I PIC 9(02).
05 WS-CENT-I PIC 9(02).
01 WS-HORARIO-FINAL.
05 WS-HORA-F PIC 9(02).
05 WS-MIN-F PIC 9(02).
05 WS-SEG-F PIC 9(02).
05 WS-CENT-F PIC 9(02).
01 WS-TEMPO-PROCESSAMENTO.
05 WS-HORA-P PIC 9(02).
05 FILLER PIC X(01)
VALUE ":".
6
05 WS-MIN-P PIC 9(02).
05 FILLER PIC X(01)
VALUE ":".
05 WS-SEG-P PIC 9(02).
05 FILLER PIC X(01)
VALUE ":".
05 WS-CENT-P PIC 9(02).
----+-*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.
----+-*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
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 "************************************************"
.
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.
6
FILE STATUS IS FS-CADCLI
.
*----------------------------------------------------------------*
DATA DIVISION.
*----------------------------------------------------------------*
FILE SECTION.
FD CADCLI
RECORDING MODE IS F.
*----------------------------------------------------------------*
WORKING-STORAGE SECTION.
*----------------------------------------------------------------*
* BOOK DA VARIAVEL ESPELHO
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.
MOVE 0 TO WS-CTLIDO
WS-CTINS
WS-CTDUP
WS-CTINV
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
.
*----------------------------------------------------------------*
* INSERIR OS DADOS DA HOSPEDEIRA NA TABELA (SQL FIELDS)
*----------------------------------------------------------------*
EXEC SQL
INSERT INTO TBCLIENTE
( CODCLI
6
, NOMECLI
, ENDCLI
, FONECLI
, EMAILCLI
, CPFCLI
, SALDOCLI
)
VALUES
( :CODCLI
,:NOMECLI
,:ENDCLI
,:FONECLI
,:EMAILCLI
,:CPFCLI
,:SALDOCLI
)
END-EXEC
*----------------------------------------------------------------*
* TESTAR SQLCODE
*----------------------------------------------------------------*
EVALUATE SQLCODE
WHEN 0
ADD 1 TO WS-CTINS
WHEN -803
ADD 1 TO WS-CTDUP
WHEN -545
ADD 1 TO WS-CTINV
WHEN OTHER
MOVE "ERRO INSERT TBCLIENTE"
TO WS-MSG
MOVE SQLCODE TO WS-SQLCODE
PERFORM 9000-ERRO-DB2
END-EVALUATE
PERFORM 1500-LER-CADCLI
.
PERFORM 9000-CALCULA-TEMPO-PROC
PERFORM 9000-IMPRIME-DATA
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
.
Practice
6
preencher o quadro com os tipos de dados gerados para
o COBOL pelo DCLGEN. (membro CREATET no
JCLDATA).
CAMPO01 CHAR(5)
CAMPO02 VARCHAR(20)
CAMPO03 INTEGER
CAMPO04 SMALLINT
CAMPO05 DECIMAL(10,4)
CAMPO06 REAL
CAMPO07 DOUBLE
CAMPO08 DATE
CAMPO09 TIME
CAMPO10 TIMESTAMP
WORKING-STORAGE SECTION.
Performance
Objetivo do Programa
6
A Metal Screws Inc. está implantando o Sistema Gerenciador de banco de
Dados DB2 e está migrando seus dados de arquivos sequenciais para tabelas em um
banco de dados relacional.
Macro-Fluxo
CADPRDD1
GPXXNND1
TBPRODUTO
Layout do Arquivo
Layout da Tabela
Layout da SYSOUT
1 2 3 4 5
12345678901234567890123456789012345678901234567890
**************************************************
* DATA GREGORIANA 1 - 99/99/2099 *
* DATA GREGORIANA 2 - 99 DE XXXXXXXXX DE 2099 *
* DATA JULIANA – 999 DE 2099 *
* DIA DA SEMANA – XXXXXXXXXXXXX *
**************************************************
==================================================
== ESTATISTICA FINAL DE PROCESSAMENTO ==
==================================================
QTDE. PRODUTOS LIDOS CADPRDD1........: ZZ.ZZ9
6
QTDE. PRODUTOS INSERIDOS TBPRODUTO...: ZZ.ZZ9
QTDE. PRODUTOS DUPLICADOS............: ZZ.ZZ9
QTDE. PRODUTOS INVALIDOS.............: ZZ.ZZ9
==================================================
TEMPO TOTAL DE PROCESSAMENTO.........: HH:MM:SS:CC
==================================================
== TERMINO NORMAL DO PROGRAMA GPXXNND1 ==
==================================================
Observação
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
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)
Parágrafo 2000-PROCESSAR
Usar EVALUTE aqui, Mover os dados da variável espelho para a hospedeira
entendeu ? Inserir o registro na tabela TBPRODUTO (INSERT) e testar SQLCODE:
se SQLCODE = 0
somar 1 ao contador de produto inserido
se SQLCODE = -803
somar 1 ao contador de produto duplicado
se SQLCODE = -545
somar 1 ao contador de produto inválidos
senão
mover mensagem de erro para variável da rotina de erro
mover SQLCODE para variável formatada
executar a rotina de erro para DB2 (9000-ERRO-DB2)
6
Ler o próximo registro do arquivo CADPRDD1(1100-LER-CADPRDD1)
Parágrafo 3000-TERMINO
Fechar o arquivo CADPRDD1
Se file status for diferente de “00”
Mover mensagem de erro para variável da rotina de erro
Mover file status para variáveis da rotina de erro
Executar rotina de erro (9000-ERRO)
Receber o horário final de processamento
Calcular o tempo de processamento
Exibir SYSOUT de acordo com LAYOUT
Exibir contador de produtos lidos
Exibir contador de produtos inseridos
Exibir contador de produtos duplicado
Exibir contador de produtos inválido
Exibir o tempo total de processamento
Parágrafo 9000-ERRO
Exibir mensagem de erro
Exibir file status
Abendar o programa com RETURN-CODE = 12
Parágrafo 9000-ERRO-DB2
Exibir mensagem de erro
Exibir SQLCODE formatado
Exibir SQLERRMC (mensagem de erro do SQLCODE)
Abendar o programa com RETURN-CODE = 16
Estou fera!
Fiz Certo!
Hugh Darwen
Preparation
7
O que você não sabe ?
Porque é importante conhecer estes tópicos ?
Quais são os seus temores ?
O que você considera difícil ?
Presentation
Vamos agora colocar tudo junto. Escreveremos um programa que vai Inserir,
Excluir, Alterar e Consultar dados em uma tabela, tudo em um mesmo programa.
Então vamos por tudo junto, ou em inglês Let´s put it all together.
Programa Fonte
COBOL
+ GP.GPXXNN.COBLIB
SQL (GPXXNND1)
7
GP.GPXXNN.JOBLIB
1º. Passo (COMPBDB2)
BOOKs PRE-COMPILE
GP.GPXXNN.BOOKLIB
(GPXXNND1)
TIMESTAMP TIMESTAMP
Programa fonte DBRM
modificado Acessos DB2
só COBOL só SQL
d
SYS2.DB2.DBRMLIB.DATA SPOOL
(GPXXNND1)
2º. Passo
COMPILE
SD.ST
? JOBID
4º. Passo S SYSPRINT
PROGRAMA BIND
OBJETO
s
3º. Passo
LIBRARY LINK-EDIT k
PLAN
COLLECTION
i
GP.GERAL.LOADLIB TIMESTAMP
(GPXXNND1) TIMESTAMP
LOAD MODULE PACKAGE
A SYSIBM.SYSPACKAGES
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.
2º Passo – Compilação
3º Passo – Link-edição
3
1
2
Quando eu criei o
primeiro compilador
as coisas eram mais
simples...
Essa IBM !
Amiga !
Grace Hopper e
a traca
, (BUG)
2
3
4
5
1 – Quando aparecer somente esses três arquivos JES2, significa que há erro de
JCL e o JOB deve ser corrigido.
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.
O JOB de execução também deve apontar para a instalação de DB2 correta, usada
para compilar os programas, como mostra a tela abaixo.
3 1
7
3 – Esta é a instalação do DB2 que será usada para definir o plano de acesso
----+-*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
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
7
Quando o SELECT seleciona mais de uma linha, essa RESULT TABLE não
pode ser carregada na HOST VARIABLE apontada pela claúsula INTO, que comporta
apenas uma linha.
----+-*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
----+-*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
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
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
PROCEDURE DIVISION.
.......
EXEC SQL
DELETE FROM tabela
WHERE restricao
END-EXEC
Exemplo:
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
PROCEDURE DIVISION.
.......
MOVE WS-CODPROD TO CODIGO
EXEC SQL
DELETE FROM PRODUTO
WHERE CODIGO = :CODIGO
END-EXEC
7
IF SQLCODE = 0
ADD 1 TO WS-CTEXCLUIDO
ELSE
IF SQLCODE = 100
ADD 1 TO WS-CTNAOENCONTRADO
ELSE
MOVE “ERRO NO DELETE” TO WS-MSG
MOVE SQLCODE TO WS-SQLCODE
PERFORM 9000-ERRO-DB2
END-IF
END-IF
Teoria INDICATORS
* *
INSERT DELETE UPDATE SELECT FETCH
* Precisam de INDICATORS
Este INDICATOR receberá um dos seguintes valores após a execução de um
SELECT:
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.
----+-*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
Sintaxes:
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
:variavel1 :indicator1, ...
ou
:variavel1 INDICATOR :indicator1, ...
Exemplo:
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
WORKING-STORAGE SECTION.
01 WS-INDICADORES.
05 INDNOMEEMP PIC 9S(4) COMP.
05 INDSALARIO PIC 9S(4) COMP.
PROCEDURE DIVISION.
7
MOVE “000001” TO CODEMP
EXEC SQL
SELECT CODEMP, NOMEEMP, SALARIO
INTO :CODEMP,
:NOMEEMP INDICATOR :INDNOMEEMP,
:SALARIO INDICATOR :INDSALARIO
FROM EMPREGADOS
WHERE CODEMP = :CODEMP
END-EXEC
----+-*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.
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
******************************************************************
* DCLGEN TABLE(PRODUTO) *
* LIBRARY(GP.GPAZ99.BOOKLIB(PRODUTO)) *
* LANGUAGE(COBOL) *
* QUOTE *
Achei, são esses * INDVAR(YES) *
em vermelho!
* ... IS THE DCLGEN COMMAND THAT MADE THE FOLLOWING STATEMENTS *
******************************************************************
EXEC SQL DECLARE PRODUTO TABLE
( CODPROD CHAR(4) NOT NULL,
DESCPROD VARCHAR(20) NOT NULL,
UNIDPROD CHAR(5),
LOCALPROD CHAR(5),
QTDEST DECIMAL(5, 0),
QTDMAX DECIMAL(5, 0),
QTDMIN DECIMAL(5, 0),
PRECOCOMPRA DECIMAL(8, 2),
PRECOVENDA DECIMAL(8, 2),
PERCOMIS DECIMAL(4, 2)
) END-EXEC.
Mas, nada impede que você defina e use indicadores para essas colunas,
assim poderá tratar os valores positivos do INDICATOR. Por questão de organização,
coloque as variáveis indicadoras na WORKING-STORAGE, próximo dos DCLGENs.
----+-*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
PROCEDURE DIVISION.
......
* EXEMPLO DO USO DOS INDICATORS DEFINIDOS PELO PROGRAMADOR
EXEC SQL
SELECT CODPROD
,DESCPROD
,UNIDPROD
,LOCALPROD
,QTDEST
7
,QTDMIN
,QTDMAX
,PRECOCOMPRA
,PRECOVENDA
,PERCOMIS
INTO :CODPROD :ICODPROD
,:DESCPROD :IDESCPROD
,:UNIDPROD :IUNIDPROD
,:LOCALPROD :ILOCALPROD
,:QTDEST :IQTDEST
,:QTDMIN :IQTDMIN
,:QTDMAX :IQTDMAX
,:PRECOCOMPRA :IPRECOCOMPRA
,:PRECOVENDA :IPRECOVENDA
,:PERCOMIS :IPERCOMIS
FROM TBPRODUTO
WHERE CODPROD = '0300'
END-EXEC
DISPLAY "*---------------------------------------------*"
STOP RUN
.
EBCDIC 000J
HEXADECIMAL FFFD
0001
Exemplo manutencão
,
Objetivo do Programa
Macro-Fluxo
MOVCLIDB
7
EXEMANUT
TBCLIENTE
Observação
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 ==
==================================================
Layout do Arquivo
7
SALDOCLI-DB PIC 9(05)V99 Saldo do cliente
TIPOMOVTO-DB PIC X(01) Tipo da movimentação
Layout da Tabela
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.
01 WS-CONTADORES-COMP.
7
05 WS-CTLIDO PIC 9(05) COMP.
05 WS-CTINS PIC 9(05) COMP.
05 WS-CTEXC PIC 9(05) COMP.
05 WS-CTINV PIC 9(05) COMP.
05 WS-CTALT PIC 9(05) COMP.
05 WS-CTCON PIC 9(05) COMP.
01 WS-CONTADORES-FORMATADOS.
05 WS-CTLIDO-F PIC ZZ.ZZ9.
05 WS-CTINS-F PIC ZZ.ZZ9.
05 WS-CTEXC-F PIC ZZ.ZZ9.
05 WS-CTINV-F PIC ZZ.ZZ9.
05 WS-CTALT-F PIC ZZ.ZZ9.
05 WS-CTCON-F PIC ZZ.ZZ9.
INITIALIZE WS-CONTADORES-COMP
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
.
EXEC SQL
INSERT INTO TBCLIENTE
( CODCLI
, NOMECLI
, ENDCLI
, FONECLI
, EMAILCLI
, CPFCLI
, SALDOCLI
)
VALUES
( :CODCLI
, :NOMECLI
7
, :ENDCLI
, :FONECLI
, :EMAILCLI
, :CPFCLI
, :SALDOCLI
)
END-EXEC
EVALUATE SQLCODE
WHEN 0 ADD 1 TO WS-CTINS
WHEN -803 ADD 1 TO WS-CTINV
WHEN -545 ADD 1 TO WS-CTINV
WHEN OTHER
MOVE "ERRO INSERT NA TABELA TBCLIENTE"
TO WS-MSG
MOVE SQLCODE TO WS-SQLCODE
PERFORM 9000-ERRO-DB2
END-EVALUATE
.
2200-EXCLUSAO.
MOVE WS-CODCLI-DB TO CODCLI
EXEC SQL
DELETE FROM TBCLIENTE
WHERE CODCLI = :CODCLI
END-EXEC
EVALUATE SQLCODE
WHEN 0 ADD 1 TO WS-CTEXC
WHEN +100 ADD 1 TO WS-CTINV
WHEN OTHER
MOVE "ERRO DELETE NA TABELA TBCLIENTE"
TO WS-MSG
MOVE SQLCODE TO WS-SQLCODE
PERFORM 9000-ERRO-DB2
END-EVALUATE
.
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
.
7
IF WS-SALDOCLI-DB IS NUMERIC
MOVE WS-SALDOCLI-DB TO SALDOCLI
END-IF
EXEC SQL
UPDATE TBCLIENTE
SET NOMECLI = :NOMECLI
,ENDCLI = :ENDCLI
,FONECLI = :FONECLI
,EMAILCLI = :EMAILCLI
,CPFCLI = :CPFCLI
,SALDOCLI = :SALDOCLI
WHERE CODCLI = :CODCLI
END-EXEC
EVALUATE SQLCODE
WHEN 0 ADD 1 TO WS-CTALT
WHEN +100 ADD 1 TO WS-CTINV
WHEN -545 ADD 1 TO WS-CTINV
WHEN OTHER
MOVE "ERRO UPDATE NA TABELA TBCLIENTE"
TO WS-MSG
MOVE SQLCODE TO WS-SQLCODE
PERFORM 9000-ERRO-DB2
END-EVALUATE
.
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
PERFORM 9000-CALCULA-TEMPO-PROC
9000-TRATA-INDICATOR.
* TESTE DOS INDICATORS
IF IENDCLI LESS ZERO
MOVE SPACES TO ENDCLI
END-IF
7
MOVE SPACES TO FONECLI
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
.
Practice
a)
b)
Pré-Compilação
Compilação
7
c) Link-edição
d) Bind
SQL DML
SELECT INSERT UPDATE DELETE
0
+100
-803
-545
(
)
)
Erro na conversão de valores
==================================================
== ESTATISTICA FINAL DE PROCESSAMENTO ==
==================================================
QTDE. PRODUTOS LIDOS CADPRDD1........: ___________
==================================================
TEMPO TOTAL DE PROCESSAMENTO.........: ___________
==================================================
== TERMINO NORMAL DO PROGRAMA GPXXNND1 ==
==================================================
Performance
Objetivo do Programa
7
DB2 e já migrou seus dados de produtos que estavam em arquivo sequencial para a
tabela TBPRODUTO.
Macro-Fluxo
MOVPRDD2
GPXXNND2
TBPRODUTO
Layout do Arquivo
Layout da Tabela
Layout da SYSOUT
1 2 3 4 5
12345678901234567890123456789012345678901234567890
==================================================
== CONSULTA DE PRODUTOS ==
==================================================
CODIGO...................: 9999
DESCRICAO................: XXXXXXXXXXXXXXXXXXXX
UNIDADE DE VENDA.........: XXXXX
LOCALIZACAO NO ESTOQUE...: XXXXX
QTDE. EM ESTOQUE.........: ZZ.ZZ9
QTDE. MAXIMA ARMAZENADA..: ZZ.ZZ9
QTDE. MINIMA ARMAZENADA..: ZZ.ZZ9
PRECO DE COMPRA..........: ZZZ.ZZ9,99
PRECO DE VENDA...........: ZZZ.ZZ9,99
7
PERCENTUAL DE COMISSAO...: Z9,99
==================================================
1 2 3 4 5
12345678901234567890123456789012345678901234567890
**************************************************
* DATA GREGORIANA 1 - 99/99/2099 *
* DATA GREGORIANA 2 - 99 DE XXXXXXXXX DE 2099 *
* DATA JULIANA – 999 DE 2099 *
* DIA DA SEMANA – XXXXXXXXXXXXX *
**************************************************
1 2 3 4 5
12345678901234567890123456789012345678901234567890
==================================================
== ESTATISTICA FINAL DE PROCESSAMENTO ==
==================================================
QTDE. PRODUTOS LIDOS MOVPRDD2..........: ZZ.ZZ9
QTDE. PRODUTOS INSERIDOS TBPRODUTO...: ZZ.ZZ9
QTDE. PRODUTOS EXCLUIDOS TBPRODUTO...: ZZ.ZZ9
QTDE. PRODUTOS ALTERADOS TBPRODUTO...: ZZ.ZZ9
QTDE. PRODUTOS CONSULTADOS TBPRODUTO...: ZZ.ZZ9
QTDE. MOVIMENTOS INVALIDOS.............: ZZ.ZZ9
==================================================
TEMPO TOTAL DE PROCESSAMENTO.........: HH:MM:SS:CC
==================================================
== TERMINO NORMAL DO PROGRAMA GPXXNND2 ==
==================================================
Observação
==================================================
== ESTATISTICA FINAL DE PROCESSAMENTO ==
==================================================
QTDE. PRODUTOS LIDOS MOVPRDD2..........: _________
==================================================
TEMPO TOTAL DE PROCESSAMENTO.........: ___________
==================================================
7
== TERMINO NORMAL DO PROGRAMA GPXXNND2 ==
==================================================
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
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)
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
Parágrafo 3100-INCLUSAO
Mover os dados da variável espelho para a hospedeira
Inserir a linha na tabela TBPRODUTO (INSERT) e testar SQLCODE:
se SQLCODE = 0
7
somar 1 ao contador de produto inserido
se SQLCODE = -803
somar 1 ao contador de produto inválido
se SQLCODE = -545
somar 1 ao contador de produto inválido
senão
mover SQLCODE para variável formatada
Mover mensagem de erro para variável da rotina de erro DB2
executar a rotina de erro para DB2 (9000-ERRO-DB2)
Parágrafo 3200-EXCLUSAO
Mover o código do produto da variável espelho para a hospedeira
Excluir a linha na tabela TBPRODUTO (DELETE) e testar SQLCODE:
se SQLCODE = 0
somar 1 ao contador de produto excluído
se SQLCODE = +100
somar 1 ao contador de movimento inválido
senão
mover SQLCODE para variável formatada
Mover mensagem de erro para variável da rotina de erro DB2
executar a rotina de erro para DB2 (9000-ERRO-DB2)
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).
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)
Parágrafo 3400-CONSULTAR
Mover o código do produto da variável espelho para a hospedeira
Consultar a linha da tabela TBPRODUTO (SELECT) carregando a
variável hospedeira e testar SQLCODE:
se SQLCODE = 0
somar 1 ao contador de produto consultado
executar a rotina 9000-TRATA-INDICATOR
executar a rotina 9000-EXIBE-PRODUTO
se SQLCODE = +100
somar 1 ao contador de movimento inválido
senão
mover SQLCODE para variável formatada
Mover mensagem de erro para variável da rotina de erro DB2
executar a rotina de erro para DB2 (9000-ERRO-DB2)
Parágrafo 4000-TERMINO
7
Fechar o arquivo MOVPRDD2
Se file status for diferente de “00”
Mover mensagem de erro para variável da rotina de erro
Mover file status para variáveis da rotina de erro
Executar rotina de erro (9000-ERRO)
Receber o horário final de processamento
Calcular o tempo de processamento
Exibir SYSOUT de acordo com LAYOUT
Exibir o contador de movimento lido
Exibir o contador de produto inserido
Exibir o contador de produto excluído
Exibir o contador de produto alterado
Exibir o contador de produto consultado
Exibir o contador de movimento inválido
Exibir o tempo total de processamento
Parágrafo 9000-TRATA-INDICATOR
Se INDICATOR < 0
Mover espaços quando a variável hospedeira for alfanumérica
ou zeros quando numérica
Parágrafo 9000-EXIBE-PRODUTO
EXIBIR (DISPLAY) as variáveis hospedeiras na SYSOUT conforme
layout.
Parágrafo 9000-ERRO
Exibir mensagem de erro
Exibir file status
Abendar o programa com RETURN-CODE = 12
ENTRE AS ROTINAS
3300-ALTERACAO E
3310-UPDATE UM tempo se
passou, suficiente para
alguém ou um aplicativo ter
excluido o produto.
Estou fera!
Fiz Certo!
Preparation
8
O que você considera difícil ?
Presentation
de novo de novo
ser
mic rilha o
ro s u
erri
lha
rem
a lina
a d
lega
e po a s
de 1 66 linh
/6 d
80 o
de 1 u 132
/10 d co
e po lunas
lega
da
Teoria cursor
8
Declarar o CURSOR, definindo seu nome e o comando SELECT.
(Na WORKING-STORAGE SECTION ou na PROCEDURE DIVISION)
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
PROCEDURE DIVISION.
.......
*----------------------------------------------------------------*
* NAO CARREGA SQLCODE *
*----------------------------------------------------------------*
EXEC SQL
DECLARE nome_do_cursor CURSOR FOR
Commando SELECT
END-EXEC
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
----+-*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
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
EXEC SQL
OPEN LEREMP
END-EXEC
IF SQLCODE NOT = 0
MOVE “ERRO ABERTURA CURSOR LEREMP”
TO WS-MSG
8
MOVE SQLCODE TO WS-SQLCODE
GO TO 999-ERRO-SQL
END-IF
PERFORM 020-LER-CURSOR
.
020-LER-CURSOR.
* 3- LEITURA DO CURSOR COM FETCH E TESTE DO SQLCODE
EXEC SQL
FETCH LEREMP
INTO :CODEMP, :NOMEEMP INDICATOR :INDNOMEMP
END-EXEC
IF SQLCODE = 0
ADD 1 TO WS-CTLIDO
ELSE
IF SQLCODE NOT = +100
MOVE “ERRO LEITURA CURSOR LEREMP”
TO WS-MSG
MOVE SQLCODE TO WS-SQLCODE
GO TO 999-ERRO-DB2
END-IF
END-IF
.
030-PROCESSAR.
IF INDNOMEMP < 0
MOVE “NOME INVALIDO” TO NOMEMP
END-IF
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
999-ERRO-DB2.
DISPLAY “MENSAGEM…....: “ WS-MSG
DISPLAY “SQLCODE .....: “ WS-SQLCODE
DISPLAY “TERMINO ANORMAL DO PROGRAMA”
MOVE +16 TO RETURN-CODE
STOP RUN
.
Objetivo do Programa
Macro-Fluxo
TBCLIENTE
EXERELAT
8
CLIRELAT
1 2 3 4 5 6 7 8 9 0 1 2 3
123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012
01 DD/MM/AAAA HH:MM:SS RELACAO DE CLIENTES SEM E-MAIL PAG. ZZ9
02 ------------------------------------------------------------------------------------------------------------------------------------
03 CODIGO NOME ENDERECO TELEFONE CPF SALDO
04 ------ ------------------------------ ---------------------------------------- --------- ----------- ---------
05 XXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 999999999 99999999999 ZZ.ZZ9,99
www.grandeporte.com.br
06 XXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 999999999 99999999999 ZZ.ZZ9,99
07 XXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 999999999 99999999999 ZZ.ZZ9,99
08 XXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 999999999 99999999999 ZZ.ZZ9,99
09 XXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 999999999 99999999999 ZZ.ZZ9,99
.. XXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 999999999 99999999999 ZZ.ZZ9,99
57 XXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 999999999 99999999999 ZZ.ZZ9,99
Parte 8
59 ------------------------------------------------------------------------------------------------------------------------------------
60 APOS O USO REUTILIZE ESSE RELATORIO COMO RASCUNHO - RECLICLE SUAS IDEIAS INDUSTRIAS JOAQUIM NABUCO LTDA.
Layout do Arquivo
Layout da Tabela
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 ==
==================================================
Programa COBOL
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
*----------------------------------------------------------------*
IDENTIFICATION DIVISION.
*----------------------------------------------------------------*
PROGRAM-ID. EXERELAT.
*----------------------------------------------------------------*
ENVIRONMENT DIVISION.
*----------------------------------------------------------------*
CONFIGURATION SECTION.
SPECIAL-NAMES.
DECIMAL-POINT IS COMMA.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT CLIRELAT ASSIGN TO UT-S-CLIRELAT
FILE STATUS FS-CLIRELAT.
*----------------------------------------------------------------*
DATA DIVISION.
*----------------------------------------------------------------*
FILE SECTION.
*----------------------------------------------------------------*
FD CLIRELAT
LABEL RECORD OMITTED
RECORDING MODE IS F
8
RECORD CONTAINS 132 CHARACTERS
DATA RECORD REG-CLIRELAT
.
01 REG-CLIRELAT PIC X(132).
*----------------------------------------------------------------*
WORKING-STORAGE SECTION.
*----------------------------------------------------------------*
* BOOK DAS VARIAVEIS HOSPEDEIRAS
EXEC SQL
INCLUDE BKEXETC
END-EXEC
* BOOK DA SQLCODE
EXEC SQL
INCLUDE SQLCA
END-EXEC
* 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.
* 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
" --------- ----------- ".
* RODAPE 1
01 WS-RODAPE1 PIC X(132)
VALUE ALL "-".
* RODAPE 2
8
01 WS-RODAPE2.
03 FILLER PIC X(33)
VALUE
"APOS O USO REUTILIZE ESSE RELATOR".
03 FILLER PIC X(33)
VALUE
"IO COMO RASCUNHO - RECLICLE SUAS ".
03 FILLER PIC X(33)
VALUE
"IDEIAS ".
03 FILLER PIC X(33)
VALUE
" INDUSTRIAS JOAQUIM NABUCO LTDA.".
*----------------------------------------------------------------*
* DATA E HORA PARA O RELATORIO
*----------------------------------------------------------------*
01 WS-DATA-SYS.
03 WS-ANO PIC 9(02).
03 WS-MES PIC 9(02).
03 WS-DIA PIC 9(02).
01 WS-DATA-FORMATADA.
03 WS-DIA PIC 9(02).
03 FILLER PIC X(01)
VALUE "/".
03 WS-MES PIC 9(02).
03 FILLER PIC X(03)
VALUE "/20".
03 WS-ANO PIC 9(02).
01 WS-HORA-SYS.
03 WS-HORA PIC 9(02).
03 WS-MINUTO PIC 9(02).
03 WS-SEGUNDO PIC 9(02).
1000-INICIALIZAR.
* CARREGAR VARIAVEIS PARA CALCULO DO TEMPO DE PROCESSAMENTO
ACCEPT WS-HORARIO-INICIAL FROM TIME
1500-LER-CLISEMEMAIL.
EXEC SQL
FETCH CLISEMEMAIL
INTO :CODCLI
8
,:NOMECLI
,:ENDCLI :IENDCLI
,:FONECLI :IFONECLI
,:CPFCLI :ICPFCLI
,:SALDOCLI :ISALDOCLI
END-EXEC
IF SQLCODE = 0
ADD 1 TO WS-CTLIDO
PERFORM 1600-TRATA-INDICATOR
ELSE
IF SQLCODE NOT = +100
MOVE "ERRO LEITURA CURSOR CLISEMEMAIL"
TO WS-MSG
MOVE SQLCODE TO WS-SQLCODE
GO TO 9000-ERRO-DB2
END-IF
END-IF
.
1600-TRATA-INDICATOR.
IF IENDCLI < 0
MOVE ALL "*" TO ENDCLI-TEXT
END-IF
IF IFONECLI < 0
MOVE ALL "*" TO FONECLI
END-IF
IF ICPFCLI < 0
MOVE ALL "*" TO CPFCLI
END-IF
IF ISALDOCLI < 0
MOVE ZEROS TO SALDOCLI
END-IF
.
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
ADD 1 TO WS-CTLINHA
ADD 1 TO WS-CTIMP
.
2300-IMPRIME-RODAPE.
COMPUTE WS-PULA = 59 - WS-CTLINHA
8
END-IF
MOVE 60 TO WS-CTLINHA
.
EXEC SQL
CLOSE CLISEMEMAIL
END-EXEC
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
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.
TABFUNC TABDEPTO
codfunc(PK) coddepto(PK)
nomefunc nomedepto
dataadminfunc codgerente(FK)
datademissaofunc
coddepto(FK)
TABFUNC TABDEPTO
codfunc(PK) CHAR(4) coddepto(PK) CHAR(3)
nomefunc VARCHAR(30) nomedepto VARCHAR(20)
dataadminfunc DATE codgerente(FK) CHAR(4)
a) CVETERANO datademissaofunc DATE
coddepto(FK) CHAR(3)
b) CGERENTE
Performance
Objetivo do Programa
8
reposição de estoque, para poder fazer os pedidos aos seus fornecedores.
Macro-Fluxo
TBPRODUTO
GPXXNND3
RELREPO
Layout do Arquivo
Layout da Tabela
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.
Layout da SYSOUT
1 2 3 4 5
12345678901234567890123456789012345678901234567890
**************************************************
* DATA GREGORIANA 1 - 99/99/2099 *
* DATA GREGORIANA 2 - 99 DE XXXXXXXXX DE 2099 *
* DATA JULIANA – 999 DE 2099 *
* DIA DA SEMANA – XXXXXXXXXXXXX *
**************************************************
1 2 3 4 5
12345678901234567890123456789012345678901234567890
==================================================
== ESTATISTICA FINAL DE PROCESSAMENTO ==
==================================================
QTDE. PRODUTOS LIDOS ................: ZZ.ZZ9
QTDE. PRODUTOS IMPRESSOS.............: ZZ.ZZ9
QTDE. PAGINAS........................: ZZ.ZZ9
==================================================
8
TEMPO TOTAL DE PROCESSAMENTO.........: HH:MM:SS:CC
==================================================
== TERMINO NORMAL DO PROGRAMA GPXXNND3 ==
==================================================
Observação
Detalhamento do Relatório
WS-DATA-CABEC1
WS-PAG-CABEC1
WS-HORA-CABEC1
LD-CODPROD
LD-DESCPROD
LD-PRECOVENDA
LD-LUCRO
LD-QTDEST
LD-QTDREP
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
Se contador de linha = 58
Executar a rotina 2300-IMPRIME-RODAPE
Parágrafo 2100-IMPRIME-CABECALHO
Somar 1 ao contador de páginas impressas
Mover o contador de páginas impressas para variável do WS-CABEC1
Mover a data e a hora formatada para variável do WS-CABEC1
Gravar registro do RELREPO com base no WS-CABEC1
pulando uma página e testar file status
Gravar registro do RELREPO com base no WS-CABEC2 e testar file status
Gravar registro do RELREPO com base no WS-CABEC3 e testar file status
Gravar registro do RELREPO com base no WS-CABEC4 e testar file status
Mover 4 para o contador de linha
Parágrafo 2200-IMPRIME-DETALHE
Mover os dados da variável hospedeira para as variáveis na WS-LINDET
Calcular o lucro e movê-lo para a variável na WS-LINDET
Calcular a quantidade de reposição e movê-la para a variável na WS-LINDET
Gravar registro do RELREPO com base na WS-LINDET e testar file status
Somar 1 ao contador de linhas de detalhes impressas
Somar 1 ao contador de linha
Parágrafo 2300-IMPRIME-RODAPE
Calcular quantas linhas precisam ser puladas para chegar na linha 59
Gravar registro do RELREPO com base no WS-RODAPE1
pulando linhas para chegar na linha 59 e testar file status
Gravar registro do RELREPO com base no WS-RODAPE2 e testar file status
Mover 60 para o contador de linha
Parágrafo 3000-TERMINO
Se contador de linha for menor que 60
Executar a rotina 2300-IMPRIME-RODAPE
8
fim-se
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
Estou fera!
Fiz Certo!
Preparation
Presentation
História Finalizando...
Teoria ç
Atualiza ão posicionada
----+-*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
a) O SELECT deve buscar dados em apenas uma tabela, não é permitido o uso
de JOINs.
9
b) Não pode ter a cláusula ORDER BY
c) Não pode ter a palavra chave DISTINCT
d) Não pode ter a cláusula GROUP BY ou HAVING
e) Não pode ter subqueries em que busquem seus dados na mesma tabela
Quando o cursor for declarado para atualização com a sintaxe acima, após
cada FETCH o programa pode atualizar a linha lida com a sintaxe abaixo:
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
PROCEDURE DIVISION.
.......
EXEC SQL
UPDATE tabela
SET coluna1 = :valor1,
coluna2 = :valor2,
.......
WHERE CURRENT OF nome_do_cursor
END-EXEC
----+-*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
----+-*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
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.
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.
linha do
UPDATE DELETE UPDATE DELETE
tempo
9
início da término da término da
LUW LUW LUW
COMMIT COMMIT
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.
Em geral, nos sistemas Batch que atualizam tabelas do DB2, deve-se estabelecer
as LUW e executar COMMIT e ROLLBACK nos momentos apropriados.
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
Uma instrução COMMIT fecha todos os cursores sem opção WITH HOLD e
valida todas as atualizações efetuadas, encerrando a LUW.
Practice
9
ROLLBACK
Fim-se
Fim-se
==================================================
== ESTATISTICA FINAL DE PROCESSAMENTO ==
==================================================
QTDE. PRODUTOS LIDOS MOVPRDD2..........: _________
==================================================
TEMPO TOTAL DE PROCESSAMENTO.........: ___________
==================================================
== TERMINO NORMAL DO PROGRAMA GPXXNND2 ==
==================================================
Performance
Objetivo do Programa
Macro-Fluxo
9
MOVPRDD4
GPXXNND4
TBPRODUTO
Layout do Arquivo
Layout da Tabela
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 ==
==================================================
==================================================
== ESTATISTICA FINAL DE PROCESSAMENTO ==
==================================================
QTDE. MOVIMENTOS LIDOS MOVPRDD4......: _________
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
Parágrafo 1500-LER-MOVPRDD4
Ler registro do arquivo MOVPRDD4 carregando a variável espelho
Se file status for igual a “00” (sucesso)
9
Somar 1 ao contador de registros lidos no arquivo de movimento
Senão
Se file status for diferente de “10” (fim de arquivo)
Mover mensagem de erro para variável da rotina de erro
Mover file status para variáveis da rotina de erro
Executar rotina de erro (9000-ERRO)
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)
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).
Parágrafo 3000-TERMINO
9
Fechar o arquivo MOVPRDD4
Se file status for diferente de “00”
Mover mensagem de erro para variável da rotina de erro
Mover file status para variável da rotina de erro
Executar a rotina de erro (9000-ERRO)
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
Estou fera!
Fiz Certo!
ANEXOS
Versão 2.2.3
Parte 10 3
Warning SQLCODE
12 THE UNQUALIFIED COLUMN NAME column-name WAS INTERPRETED AS A CORRELATED REFERENCE
98 A DYNAMIC SQL STATEMENT ENDS WITH A SEMICOLON
ROW NOT FOUND FOR FETCH, UPDATE OR DELETE, OR THE RESULT OF A QUERY IS AN EMPTY
100 TABLE
110 SQL UPDATE TO A DATA CAPTURE TABLE NOT SIGNALED TO ORIGINATING SUBSYSTEM
111 THE SUBPAGES OPTION IS NOT SUPPORTED FOR TYPE 2 INDEXES
117 THE NUMBER OF INSERT VALUES IS NOT THE SAME AS THE NUMBER OF OBJECT COLUMNS
162 TABLESPACE database-name.tablespace-name HAS BEEN PLACED IN CHECK PENDING
THE QUALIFIED COLUMN NAME column-name WAS RESOLVED USING A NON-UNIQUE OR UNEXPOSED
203 NAME
204 name IS AN UNDEFINED NAME
column-name IS NOT A COLUMN OF AN INSERTED TABLE, UPDATED TABLE, OR ANY TABLE
206 IDENTIFIED IN A FROM CLAUSE
218 THE SQL STATEMENT REFERENCING A REMOTE OBJECT CANNOT BE EXPLAINED
219 THE REQUIRED EXPLANATION TABLE table-name DOES NOT EXIST
220 THE COLUMN column-name IN EXPLANATION TABLE table-name IS NOT DEFINED PROPERLY
A VALUE WITH DATA TYPE data-type1 CANNOT BE ASSIGNED TO A HOST VARIABLE BECAUSE THE
VALUE IS NOT WITHIN THE RANGE OF THE HOST VARIABLE IN POSITION position-number WITH DATA
304 TYPE data-type2
THE NULL VALUE HAS BEEN ASSIGNED TO A HOST VARIABLE BECAUSE THE STRING CANNOT BE
331 TRANSLATED. REASON reason-code, CHARACTER code-point, HOST VARIABLE position-number
THE SQL STATEMENT HAS BEEN SUCCESSFULLY EXECUTED, BUT THERE MAY BE SOME
339 CHARACTER CONVERSION INCONSISTENCIES
402 LOCATION location IS UNKNOWN
403 THE LOCAL OBJECT REFERENCED BY THE CREATE ALIAS STATEMENT DOES NOT EXIST
535 THE RESULT OF THE POSITIONED UPDATE OR DELETE MAY DEPEND ON THE ORDER OF THE ROWS.
541 THE REFERENTIAL OR UNIQUE CONSTRAINT name HAS BEEN IGNORED BECAUSE IT IS A DUPLICATE
551 auth-id DOES NOT HAVE THE PRIVILEGE TO PERFORM OPERATION operation ON OBJECT object-name
552 auth-id DOES NOT HAVE THE PRIVILEGE TO PERFORM OPERATION operation
558 THE WITH GRANT OPTION IS IGNORED
THE ALTER, INDEX, AND REFERENCES PRIVILEGES CANNOT BE GRANTED TO PUBLIC AT ALL
561 LOCATIONS
A GRANT OF A PRIVILEGE WAS IGNORED BECAUSE THE GRANTEE ALREADY HAS THE PRIVILEGE
562 FROM THE GRANTOR
Error SQLCODE
-7 STATEMENT CONTAINS THE ILLEGAL CHARACTER character
-10 THE STRING CONSTANT BEGINNING string IS NOT TERMINATED
-29 INTO CLAUSE REQUIRED
-60 INVALID type SPECIFICATION : spec
-84 UNACCEPTABLE SQL STATEMENT
-101 THE STATEMENT IS TOO LONG OR TOO COMPLEX
-102 LITERAL STRING IS TOO LONG. STRING BEGINS string
-103 literal IS AN INVALID NUMERIC LITERAL
-104 ILLEGAL SYMBOL "token". SOME SYMBOLS THAT MIGHT BE LEGAL ARE: token-list
-105 INVALID STRING
-107 THE NAME name IS TOO LONG. MAXIMUM ALLOWABLE SIZE IS size
-109 clause CLAUSE IS NOT PERMITTED
-110 INVALID HEXADECIMAL LITERAL BEGINNING string
-111 A COLUMN FUNCTION DOES NOT INCLUDE A COLUMN NAME
-112 THE OPERAND OF A COLUMN FUNCTION IS ANOTHER COLUMN FUNCTION
-113 INVALID CHARACTER FOUND IN string, REASON CODE - nnn
-114 THE LOCATION NAME location DOES NOT MATCH THE CURRENT SERVER
A PREDICATE IS INVALID BECAUSE THE COMPARISON OPERATOR operator IS FOLLOWED BY A
-115 PARENTHESIZED LIST OR BY ANY OR ALL WITHOUT A SUBQUERY
-117 THE NUMBER OF INSERT VALUES IS NOT THE SAME AS THE NUMBER OF OBJECT COLUMNS
-421 THE OPERANDS OF A UNION OR UNION ALL DO NOT HAVE THE SAME NUMBER OF COLUMNS
-426 DYNAMIC COMMIT NOT VALID AT AN APPLICATION SERVER WHERE UPDATES ARE NOT ALLOWED
DYNAMIC ROLLBACK NOT VALID AT AN APPLICATION SERVER WHERE UPDATES ARE NOT
-427 ALLOWED
THE NUMBER OF PARAMETERS IN THE PARAMETER LIST DOES NOT MATCH THE NUMBER OF
PARAMETERS EXPECTED FOR STORED PROCEDURE name, AUTHID authid, LUNAME luname. number
-440 PARAMETERS WERE EXPECTED.
-444 USER PROGRAM name COULD NOT BE FOUND
STORED PROCEDURE name, PARAMETER NUMBER number, OVERLAYED STORAGE BEYOND ITS
-450 DECLARED LENGTH
-469 SQL CALL STATEMENT MUST SPECIFY AN OUTPUT HOST VARIABLE FOR PARAMETER number.
SQL CALL STATEMENT SPECIFIED A NULL VALUE FOR INPUT PARAMETER number, BUT THE STORED
-470 PROCEDURE DOES NOT SUPPORT NULL VALUES
-471 SQL CALL FOR STORED PROCEDURE name FAILED DUE TO REASON rc
-500 THE IDENTIFIED CURSOR WAS CLOSED WHEN THE CONNECTION WAS DESTROYED
-501 THE CURSOR IDENTIFIED IN A FETCH OR CLOSE STATEMENT IS NOT OPEN
-502 THE CURSOR IDENTIFIED IN AN OPEN STATEMENT IS ALREADY OPEN
A COLUMN CANNOT BE UPDATED BECAUSE IT IS NOT IDENTIFIED IN THE UPDATE CLAUSE OF THE
-503 SELECT STATEMENT OF THE CURSOR
-504 THE CURSOR NAME cursor-name IS NOT DEFINED
-507 THE CURSOR IDENTIFIED IN THE UPDATE OR DELETE STATEMENT IS NOT OPEN
-508 THE CURSOR IDENTIFIED IN THE UPDATE OR DELETE STATEMENT IS NOT POSITIONED ON A ROW
THE TABLE IDENTIFIED IN THE UPDATE OR DELETE STATEMENT IS NOT THE SAME TABLE
-509 DESIGNATED BY THE CURSOR
THE TABLE DESIGNATED BY THE CURSOR OF THE UPDATE OR DELETE STATEMENT CANNOT BE
-510 MODIFIED
THE FOR UPDATE CLAUSE CANNOT BE SPECIFIED BECAUSE THE TABLE DESIGNATED BY THE
-511 CURSOR CANNOT BE MODIFIED
-512 STATEMENT REFERENCE TO REMOTE OBJECT IS INVALID
-513 THE ALIAS alias-name MUST NOT BE DEFINED ON ANOTHER LOCAL OR REMOTE ALIAS
-514 THE CURSOR cursor-name IS NOT IN A PREPARED STATE
-516 THE DESCRIBE STATEMENT DOES NOT IDENTIFY A PREPARED STATEMENT
CURSOR cursor-name CANNOT BE USED BECAUSE ITS STATEMENT NAME DOES NOT IDENTIFY A
-517 PREPARED SELECT STATEMENT
-518 THE EXECUTE STATEMENT DOES NOT IDENTIFY A VALID PREPARED STATEMENT
THE PREPARE STATEMENT IDENTIFIES THE SELECT STATEMENT OF THE OPENED CURSOR cursor-
-519 name
THE SQL STATEMENT CANNOT BE EXECUTED BECAUSE IT WAS IN ERROR AT BIND TIME FOR
-525 SECTION = sectno PACKAGE = pkgname CONSISTENCY TOKEN = X'contoken'
-530 THE INSERT OR UPDATE VALUE OF FOREIGN KEY constraint-name IS INVALID
THE PRIMARY KEY IN A PARENT ROW CANNOT BE UPDATED BECAUSE IT HAS ONE OR MORE
-531 DEPENDENT ROWS IN RELATIONSHIP constraint-name
-532 THE RELATIONSHIP constraint-name RESTRICTS THE DELETION OF ROW WITH RID X'rid-number'
-533 INVALID MULTIPLE-ROW INSERT
-534 THE PRIMARY KEY CANNOT BE UPDATED BECAUSE OF MULTIPLE-ROW UPDATE
THE DELETE STATEMENT IS INVALID BECAUSE TABLE table-name CAN BE AFFECTED BY THE
-536 OPERATION
THE PRIMARY KEY CLAUSE, A FOREIGN KEY CLAUSE, OR A UNIQUE CLAUSE IDENTIFIES COLUMN
-537 column-name MORE THAN ONCE
-619 OPERATION DISALLOWED BECAUSE THE WORK FILE DATABASE IS NOT STOPPED
KEYWORD keyword IN stmt type STATEMENT IS NOT PERMITTED FOR A TABLE SPACE IN THE WORK
-620 FILE DATABASE
-621 DUPLICATE DBID dbid WAS DETECTED AND PREVIOUSLY ASSIGNED TO database-name
-622 FOR MIXED DATA IS INVALID BECAUSE THE MIXED DATA INSTALL OPTION IS NO
-623 A CLUSTERING INDEX ALREADY EXISTS ON TABLE table-name
-624 TABLE table-name ALREADY HAS A PRIMARY KEY
-625 TABLE table-name DOES NOT HAVE AN INDEX TO ENFORCE THE UNIQUENESS OF THE PRIMARY KEY
-626 THE ALTER STATEMENT IS NOT EXECUTABLE BECAUSE THE PAGE SET IS NOT STOPPED
-627 THE ALTER STATEMENT IS INVALID BECAUSE THE PAGESET HAS USER-MANAGED DATA SETS
-628 THE CLAUSES ARE MUTUALLY EXCLUSIVE.
-629 SET NULL CANNOT BE SPECIFIED BECAUSE FOREIGN KEY name CANNOT CONTAIN NULL VALUES
-630 THE WHERE NOT NULL SPECIFICATION IS INVALID FOR TYPE 1 INDEXES
-631 FOREIGN KEY name IS TOO LONG OR HAS TOO MANY COLUMNS
THE TABLE CANNOT BE DEFINED AS A DEPENDENT OF table-name BECAUSE OF DELETE RULE
-632 RESTRICTIONS
-633 THE DELETE RULE MUST BE delete-rule
-634 THE DELETE RULE MUST NOT BE CASCADE
-635 THE DELETE RULES CANNOT BE DIFFERENT OR CANNOT BE SET NULL
-636 THE PARTITIONING KEYS ARE NOT SPECIFIED IN ASCENDING OR DESCENDING ORDER
-637 DUPLICATE keyword KEYWORD
-638 TABLE table-name CANNOT BE CREATED BECAUSE COLUMN DEFINITION IS MISSING
A NULLABLE COLUMN OF A FOREIGN KEY WITH A DELETE RULE OF SET NULL CANNOT BE A
-639 COLUMN OF THE KEY OF A PARTITIONED INDEX
-640 LOCKSIZE ROW CANNOT BE SPECIFIED BECAUSE TABLE IN THIS TABLESPACE HAS TYPE 1 INDEX
-642 TOO MANY COLUMNS IN UNIQUE CONSTRAINTS
-643 CHECK CONSTRAINT EXCEEDS MAXIMUM ALLOWABLE LENGTH
-644 INVALID VALUE SPECIFIED FOR KEYWORD keyword IN stmt-type TATEMENT
TABLE table-name CANNOT BE CREATED IN PARTITIONED/DEFAULT TABLE SPACE tspace-name
-646 BECAUSE IT ALREADY CONTAINS A TABLE
-647 BUFFERPOOL bp-name CANNOT BE SPECIFIED BECAUSE IT HAS NOT BEEN ACTIVATED
-650 THE ALTER INDEX CANNOT BE EXECUTED, REASON reason
-651 TABLE DESCRIPTION EXCEEDS MAXIMUM SIZE OF OBJECT DESCRIPTOR.
-652 VIOLATION OF INSTALLATION DEFINED EDIT OR VALIDATION PROCEDURE proc-name
TABLE table-name IN PARTITIONED TABLE SPACE tspace-name IS NOT AVAILABLE BECAUSE ITS
-653 PARTITIONED INDEX HAS NOT BEEN CREATED
THE CREATE OR ALTER STOGROUP IS INVALID BECAUSE THE STORAGE GROUP WOULD HAVE BOTH
-655 SPECIFIC AND NON-SPECIFIC VOLUME IDS
INDEX index-name CANNOT BE CREATED ON PARTITIONED TABLE SPACE tspace-name BECAUSE KEY
-660 LIMITS ARE NOT SPECIFIED
INDEX index-name CANNOT BE CREATED ON PARTITIONED TABLE SPACE tspace-name BECAUSE THE
NUMBER OF PART SPECIFICATIONS IS NOT EQUAL TO THE NUMBER OF PARTITIONS OF THE TABLE
-661 SPACE
-662 A PARTITIONED INDEX CANNOT BE CREATED ON A NON-PARTITIONED TABLE SPACE tspace-name
THE NUMBER OF KEY LIMIT VALUES IS EITHER ZERO, OR GREATER THAN THE NUMBER OF
-663 COLUMNS IN THE KEY OF INDEX index-name
-722 bind-type ERROR USING auth-id AUTHORITY PACKAGE package-name DOES NOT EXIST
BIND ERROR ATTEMPTING TO REPLACE PACKAGE = . THERE ARE ENABLE OR DISABLE ENTRIES
-726 CURRENTLY ASSOCIATED WITH THE PACKAGE
THE PARENT OF A TABLE IN A READ-ONLY SHARED DATABASE MUST ALSO BE A TABLE IN A READ-
-730 ONLY SHARED DATABASE
-731 USER-DEFINED DATASET dsname MUST BE DEFINED WITH SHAREOPTIONS(1,3)
THE DATABASE IS DEFINED ON THIS SUBSYSTEM WITH THE ROSHARE READ ATTRIBUTE BUT THE
-732 TABLE SPACE OR INDEX SPACE HAS NOT BEEN DEFINED ON THE OWNING SUBSYSTEM
THE DESCRIPTION OF A TABLE SPACE, INDEX SPACE, OR TABLE IN A ROSHARE READ DATABASE
-733 MUST BE CONSISTENT WITH ITS DESCRIPTION IN THE OWNER SYSTEM
-734 THE ROSHARE ATTRIBUTE OF A DATABASE CANNOT BE ALTERED FROM ROSHARE READ
-735 DATABASE dbid CANNOT BE ACCESSED BECAUSE IT IS NO LONGER A SHARED DATABASE
-736 INVALID OBID obid SPECIFIED
-737 IMPLICIT TABLE SPACE NOT ALLOWED
-741 A WORK FILE DATABASE IS ALREADY DEFINED FOR MEMBER member-name
-742 DSNDB07 IS THE IMPLICIT WORK FILE DATABASE
A STORED PROCEDURE HAS BEEN PLACED IN MUST_ROLLBACK STATE DUE TO SQL OPERATION
-751 name
THE CONNECT STATEMENT IS INVALID BECAUSE THE PROCESS IS NOT IN THE CONNECTABLE
-752 STATE
EXCEPTION ERROR 'exception-type' HAS OCCURRED DURING 'operation-type' OPERATION ON 'data-type'
-802 DATA, POSITION 'position-number'
AN INSERTED OR UPDATED VALUE IS INVALID BECAUSE THE INDEX IN INDEX SPACE indexspace-
name CONSTRAINS COLUMNS OF THE TABLE SO NO TWO ROWS CAN CONTAIN DUPLICATE VALUES
-803 IN THOSE COLUMNS. RID OF EXISTING ROW IS X'rid'
AN ERROR WAS FOUND IN THE APPLICATION PROGRAM INPUT PARAMETERS FOR THE SQL
-804 STATEMENT. REASON reason
DBRM or PACKAGE NAME location-name.collection-id.dbrm-name.consistency -token NOT FOUND IN PLAN
-805 plan-name. REASON reason
ACCESS DENIED: PACKAGE package-name IS NOT ENABLED FOR ACCESS FROM connection-type
-807 connection-name
-808 THE CONNECT STATEMENT IS NOT CONSISTENT WITH THE FIRST CONNECT STATEMENT
THE RESULT OF AN EMBEDDED SELECT STATEMENT IS A TABLE OF MORE THAN ONE ROW, OR THE
-811 RESULT OF THE SUBQUERY OF A BASIC PREDICATE IS MORE THAN ONE VALUE
THE SQL STATEMENT CANNOT BE PROCESSED BECAUSE A BLANK COLLECTION-ID WAS FOUND IN
THE CURRENT PACKAGESET SPECIAL REGISTER WHILE TRYING TO FORM A QUALIFIED PACKAGE
-812 NAME FOR PROGRAM program-name.consistency-token USING PLAN plan-name
A GROUP BY OR HAVING CLAUSE IS IMPLICITLY OR EXPLICITLY SPECIFIED IN AN EMBEDDED
-815 SELECT STATEMENT OR A SUBQUERY OF A BASIC PREDICATE
THE SQL STATEMENT CANNOT BE EXECUTED BECAUSE THE STATEMENT WILL RESULT IN A
-817 PROHIBITED UPDATE OPERATION
THE PRECOMPILER-GENERATED TIMESTAMP x IN THE LOAD MODULE IS DIFFERENT FROM THE
-818 BIND TIMESTAMP y BUILT FROM THE DBRM z
THE VIEW CANNOT BE PROCESSED BECAUSE THE LENGTH OF ITS PARSE TREE IN THE CATALOG IS
-819 ZERO
THE SQL STATEMENT CANNOT BE PROCESSED BECAUSE catalog-table CONTAINS A VALUE THAT IS
-820 NOT VALID IN THIS RELEASE
-822 THE SQLDA CONTAINS AN INVALID DATA ADDRESS OR INDICATOR VARIABLE ADDRESS
-840 TOO MANY ITEMS RETURNED IN A SELECT OR INSERT LIST
-842 A CONNECTION TO location-name ALREADY EXISTS
-843 THE SET CONNECTION OR RELEASE STATEMENT MUST SPECIFY AN EXISTING CONNECTION
THE NUMBER OF HOST VARIABLES IN THE STATEMENT IS NOT EQUAL TO THE NUMBER OF
-870 DESCRIPTORS
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.
EBCDIC e a sigla para Extended Binary Coded Decimal Interchange Code, desenvolvida para os Mainframes
no início dos anos de 1960 e são ainda usadas hoje em dia, principalmente nos Mainframes da IBM.
Dec Hex char Dec Hex Char Dec Hex Char Dec Hex Char
LOW-VALUES 0 0 NUL (null) 64 40 SP (space) 128 80 192 C0 {
1 1 SOH (start of heading) 65 41 129 81 a 193 C1 A
2 2 STX (start of text) 66 42 130 82 b 194 C2 B
3 3 ETX (end of text) 67 43 131 83 c 195 C3 C Usados para
4 4 PF (punch off) 68 44 132 84 d 196 C4 D representar
5 5 HT (horizontal tab) 69 45 133 85 e 197 C5 E
números
6 6 LC (lower case) 70 46 134 86 f 198 C6 F
7 7 DEL (delete) 71 47 135 87 g 199 C7 G positivos.
8 8 GE 72 48 136 88 h 200 C8 H
9 9 RLF 73 49 137 89 i 201 C9 I
10 A SMM (start of manual message) 74 4A ¢ 138 8A 202 CA
11 B VT (vertical tab) 75 4B . 139 8B 203 CB
12 C FF (form feed) 76 4C < 140 8C 204 CC
13 D CR (carriage return) 77 4D ( 141 8D 205 CD
14 E SO (shift out) 78 4E + 142 8E 206 CE
15 F SI (shift in) 79 4F | 143 8F 207 CF
16 10 DLE (data link escape) 80 50 & 144 90 208 D0 }
17 11 DC1 (device control 1) 81 51 145 91 j 209 D1 J
18 12 DC2 (device control 2) 82 52 146 92 k 210 D2 K Usados para
19 13 TM (tape mark) 83 53 147 93 l 211 D3 L representar
20 14 RES (restore) 84 54 148 94 m 212 D4 M
números
21 15 NL (new line) 85 55 149 95 n 213 D5 N
22 16 BS (back space) 86 56 150 96 o 214 D6 O negativos.
23 17 IL (idle) 87 57 151 97 p 215 D7 P
24 18 CAN (cancel) 88 58 152 98 q 216 D8 Q
25 19 EM (end of medium) 89 59 153 99 r 217 D9 R
26 1A CC (cursor control) 90 5A ! 154 9A 218 DA
27 1B CU1 (customer use 1) 91 5B $ 155 9B 219 DB
28 1C IFS (interchange file separator) 92 5C * 156 9C 220 DC
29 1D IGS (interchange group separator) 93 5D ) 157 9D 221 DD
30 1E IRS (interchange record separator) 94 5E ; 158 9E 222 DE
31 1F IUS (interchange unit separator) 95 5F ¬ 159 9F ¤ 223 DF
32 20 DS (digit select) 96 60 - 160 A0 224 E0 \
33 21 SOS (start of significance) 97 61 / 161 A1 ~ 225 E1
34 22 FS (field separator) 98 62 162 A2 s 226 E2 S
35 23 99 63 163 A3 t 227 E3 T
36 24 BYP (bypass) 100 64 164 A4 u 228 E4 U
37 25 LF (line feed) 101 65 165 A5 v 229 E5 V
38 26 ETB (end of transmission block) 102 66 166 A6 w 230 E6 W
39 27 ESC (escape) 103 67 167 A7 x 231 E7 X
40 28 104 68 168 A8 y 232 E8 Y
41 29 105 69 169 A9 z 233 E9 Z
42 2A SM (set mode) 106 6A ¦ 170 AA 234 EA
43 2B CU2 (customer use 2) 107 6B , 171 AB 235 EB
44 2C 108 6C % 172 AC 236 EC
45 2D ENQ (enquiry) 109 6D _ 173 AD 237 ED
46 2E ACK (acknowledge) 110 6E > 174 AE 238 EE
47 2F BEL (bell) 111 6F ? 175 AF 239 EF
48 30 112 70 176 B0 240 F0 0
49 31 113 71 177 B1 241 F1 1
50 32 SYN (synchronous idle) 114 72 178 B2 242 F2 2
51 33 115 73 179 B3 243 F3 3 Usados para
52 34 PN (punch on) 116 74 180 B4 244 F4 4
53 35 RS (reader stop) 117 75 181 B5 245 F5 5
representar
54 36 UC (upper case) 118 76 182 B6 246 F6 6 números sem
55 37 EOT (end of transmission) 119 77 183 B7 247 F7 7 sinal.
56 38 120 78 184 B8 248 F8 8
57 39 121 79 ` 185 B9 249 F9 9
58 3A 122 7A : 186 BA 250 FA
59 3B CU3 (customer use 3) 123 7B # 187 BB 251 FB
60 3C DC4 (device control 4) 124 7C @ 188 BC 252 FC
61 3D NAK (negative acknowledge) 125 7D ' 189 BD 253 FD
62 3E 126 7E = 190 BE 254 FE
63 3F SUB (substitute) 127 7F " 191 BF 255 FF HIGH-VALUES
Teoria POTÊNCIA DE 2
1 Byte
2 Bytes
3 Bytes
4 Bytes