Você está na página 1de 109

DB2

DB2 Cobol

NOV/2004
SUMÁRIO

1 – Conceitos de Bases de Dados ________________________________________________________ 5


Armazenamento de dados ___________________________________________________________________ 5
File-oriented _____________________________________________________________________________________ 5
Data base oriented_________________________________________________________________________________ 5
Base de dados _____________________________________________________________________________ 6
Data base management system (DBMS) ________________________________________________________ 6
Tipos de DBMS ____________________________________________________________________________ 6
Conceitos relativos a RDB’s __________________________________________________________________ 8
Entidade ________________________________________________________________________________________ 8
Atributo _________________________________________________________________________________________ 8
Relacionamento __________________________________________________________________________________ 8
Tabelas _________________________________________________________________________________________ 8
Views __________________________________________________________________________________________ 9
Índices__________________________________________________________________________________________ 9
Keys __________________________________________________________________________________________ 10
Constraints _____________________________________________________________________________________ 10
Queries ________________________________________________________________________________________ 12
Data Base Administrator - Administrador de Base de Dados _______________________________________________ 12
BIND & PLAN __________________________________________________________________________________ 13
2 - DB2 ____________________________________________________________________________ 14
Exemplo de estrutura de uma base de dados ___________________________________________________ 14
Estrutura de uma base de dados DB2 _________________________________________________________ 14
Exemplos de tabelas DB2 ___________________________________________________________________ 15
Arquivos de configuração e controle usados pelo DB2 ___________________________________________ 18
Built-In Data Types ; formatos de Date e Time _________________________________________________ 22
DB2 no mainframe ________________________________________________________________________ 24
Execução de comandos DB2 via batch (IKJEFT01 chama DSNTEP2) _______________________________________ 24
Execução de comandos DB2 via FileAid ______________________________________________________________ 27
Execução de comandos DB2 via aplicativo Cobol (IKJEFT01 chama aplicativo Cobol) _________________________ 28
3 - SQL ____________________________________________________________________________ 29
Origem __________________________________________________________________________________ 29
Execução de comandos SQL : métodos ________________________________________________________ 30
Resumo dos principais comandos SQL ________________________________________________________ 37
DDL (Data Definition Language) statements ___________________________________________________________ 37
DCL (Data Control Language) statements _____________________________________________________________ 37
DML (Data Manipulation Language) statements ________________________________________________________ 37
Comandos declarativos auxiliares____________________________________________________________________ 37
Outros conceitos _________________________________________________________________________________ 38
(DSPL - Database Stored Procedure Language) statements _____________________________________________ 38

2
(TCL - Transaction Control Language) statements ____________________________________________________ 38
4 - DB2 em um programa COBOL ______________________________________________________ 39
Diferenças no programa e conceitos associados _________________________________________________ 39
Fluxo do processo de geração do executável ____________________________________________________ 40
Funções do Pré-compilador _________________________________________________________________ 42
Funções do Binder_________________________________________________________________________ 42
Comandos ao Pré-compilador _______________________________________________________________ 42
INCLUDES ____________________________________________________________________________________ 42
DECLARE _____________________________________________________________________________________ 43
DCLGEN ____________________________________________________________________________________ 43
SQLCA / SQLCODE ______________________________________________________________________ 45
Variáveis ________________________________________________________________________________ 48
5 – Comandos DDL - Rápida visão _____________________________________________________ 49
CREATE ________________________________________________________________________________ 49
ALTER __________________________________________________________________________________ 50
DROP ___________________________________________________________________________________ 50
COMMENT ______________________________________________________________________________ 50
GRANT _________________________________________________________________________________ 51
RENAME ________________________________________________________________________________ 51
REPLACE _______________________________________________________________________________ 51
REVOKE ________________________________________________________________________________ 52
6 – Comandos DCL – Rápida visão; Transações de Banco de Dados __________________________ 53
Conceito de transação ______________________________________________________________________ 53
Controle de transação : comandos DCL _______________________________________________________ 53
COMMIT ______________________________________________________________________________________ 53
SAVEPOINT ___________________________________________________________________________________ 53
ROLLBACK ____________________________________________________________________________________ 53
7 – Comandos DML _________________________________________________________________ 56
SELECT _________________________________________________________________________________ 56
SELECT - Uso batch em Cobol _____________________________________________________________________ 56
SEM cursor ___________________________________________________________________________________ 56
COM cursor __________________________________________________________________________________ 58
• Conceitos ______________________________________________________________________________ 58
• DECLARE , OPEN, CLOSE, FETCH ________________________________________________________ 59
SELECT – uso batch no DSNTEP2 __________________________________________________________________ 63
Parâmetros do SELECT (Embedded / Dsntep2) _________________________________________________________ 64
Exemplos sintáticos do SELECT ____________________________________________________________________ 68
Exemplos de uso (sem INTO) ______________________________________________________________________ 70

3
Exemplos de uso (com INTO) ______________________________________________________________________ 71
Exemplos de Select no DSNTEP2 ___________________________________________________________________ 72
UPDATE ________________________________________________________________________________ 77
UPDATE - Uso batch no DSNTEP2 _________________________________________________________________ 77
UPDATE - Uso batch em Cobol _____________________________________________________________________ 78
INSERT _________________________________________________________________________________ 80
INSERT - Uso batch no DSNTEP2 __________________________________________________________________ 80
INSERT - Uso batch em Cobol _____________________________________________________________________ 81
DELETE ________________________________________________________________________________ 83
DELETE - Uso batch no DSNTEP2 __________________________________________________________________ 83
DELETE - Uso batch em Cobol _____________________________________________________________________ 84
WHENEVER _____________________________________________________________________________ 85
8 - FUNÇÕES (Built-In) _____________________________________________________________ 87
APÊNDICE I - A Relational Model of Data for Large Shared Data Banks - E. F. Codd___________ 90
APÊNDICE II – Comandos SQL _______________________________________________________ 91
APÊNDICE III – Programas Exemplo __________________________________________________ 93
Completo (Fontes + Saídas) _________________________________________________________________ 93
Leitura com cursor _______________________________________________________________________ 105
APÊNDICE IV – Uso de colunas com NULL ____________________________________________ 108

4
1 – Conceitos de Bases de Dados

Armazenamento de dados

File-oriented
Dados armazenados em arquivos individuais, com todo o relacionamento resolvido pelos
aplicativos.

Vantagens
• rapidez
• facilidade para aplicações muito pequenas e rápidas
Desvantagens
• redundância
• inconsistências
• falta de integração entre diversos arquivos
• dificuldade de compatibilidade / compartilhamento (entre aplicativos / usuários)
• dificuldades nas mudanças da view física (tamanho, formato, localização)
Utilização
• exige tratamento das view’s física e lógica no aplicativo. Para os aspectos da view
física, exige conhecimento de características de hardware.

Data base oriented


Dados armazenados como um conjunto, com o relacionamento especificado durante o design e
tratado pelo DBMS.

Vantagens
• Menor redundância
• Menor / Sem inconsistências
• Integração entre diversos “arquivos”
• Compartilhamento (entre aplicativos / usuários)
• Mudanças da view física transparentes para o aplicativo
• (Mudanças da view lógica transparentes para o aplicativo)
• Gerenciamento centralizado
Desvantagens
• Custo (software , hardware , peopleware)
• Complexidade
• Dependência de ambiente de HW e SW
• Dificuldade de recuperação em determinadas falhas
Utilização
exige tratamento somente da view lógica no aplicativo.

5
Base de dados
• (Banco de dados / Database) = conjunto de arquivos relacionados entre si, gerenciados de forma
minimamente centralizada, que permitem armazenamento e acesso eficientes de informações

Data base management system (DBMS)


• Software que gerencia e controla os dados de um database e os interfaces entre esses dados e os
aplicativos e o sistema operacional.
• Data base system = database + DBMS + aplicativos.

Tipos de DBMS
• Hierárquicos
❑ Estrutura de armazenamento baseada na estrutura de dados ÁRVORE (semelhante ao organograma
de uma empresa; com hierarquia dos dados; um dado principal é a raiz de outros dados
subordinados (pertencentes) a ele
❑ Cada pai pode ter 1 a n filhos e cada filho pode ter somente um pai

• Rede
❑ Extensão do hierárquico; cada pai pode ter 1 a n filhos e cada filho pode ter 1 a n pais

• Relacionais
❑ O modelo de dados relacional é baseado na lógica de predicados e na teoria dos conjuntos
❑ Um relational database (RDB) é um database composto de um conjunto de tabelas, manipuladas
de acordo com o modelo de dados relacional.
❑ Um relational database management system – RDBMS é um software que efetua todas as
operações em um database, e que faz e permite que seja feita pelo DBA sua administração
❑ Frequentemente RDB e RDBMS são usados sem critério, para referência tanto à base de dados
quanto ao software
❑ Um RDBMS manipula um conjunto de objetos usados para que dados sejam armazenados,
acessados e mantidos.
❑ Exemplos desses objetos são : tabelas, views, indices, chaves (keys), constraints, funções, etc...
❑ Criado pelo Dr. Edgard F. Codd (IBM) no início da década de 70
❑ Um RDB é assim considerado somente se seguir as seguintes “12” regras :
0. (Modelo relacional) : as características do modelo relacional devem ser aplicadas
exclusivamente para administrar o banco de dados (não para armazenar seus dados)
1. Representação da informação : todas as informações no banco de dados devem ser representadas
somente de uma forma, por meio de valores em colunas e linhas das tabelas
2. Acesso garantido : todos os dados devem ser acessados sem ambiguidade (identificação /
individualização = tabela + coluna + primary key da linha
3. Tratamento de NULL : deve ser permitido a qualquer campo (“conteúdo” de coluna) a
possibilidade de NÃO TER conteúdo (vazio ou nulo) para indicar a ausência de informação
ou o fato de que no caso ela é inaplicável
4. Catálogo : deve existir um catálogo (com dados a respeito da estrutura do banco de dados –
metadados) baseado no modelo relacional, passível de ser acessado, por pessoas
autorizadas, com a mesma linguagem usada para acessar os dados
6
5. Linguagem : deve suportar pelo menos uma linguagem relacional que (a) tenha sintaxe linear (b)
possa ser usada tanto interativamente quanto em programas aplicativos e (c) suporte
operações de (DDL) definição de dados e seus atributos (inclusive views) , operações de
(DML) manipulação de dados (acesso e atualização) , administração de segurança e
integridade, e operações de controle das transações (begin, commit, rollback).
6. Atualização de Views : todas as views que sejam passíveis de atualização, devem ser
atualizadas pelo sistema.
7. Insert, update e delete: o sistema deve permitir operadores insert, update, e delete
8. Independência física de dados : mudanças no armazenamento de dados no nível físico não
podem implicar em mudanças nos aplicativos
9. Independência lógica de dados : mudanças na estrutura lógica (tabelas, colunas, etc) não podem
implicar em mudanças nos aplicativos
10. Independência de integridade : restrições relativas à integridade devem ser especificadas
separadamente dos aplicativos e armazenadas no catálogo; mudanças nessas regras não
podem implicar em mudanças nos aplicativos
11. Independência de distribuição : a distribuição da base de dados, caso ocorra, deve ser
transparente para os usuários (aplicativos que usam a base); caso haja mudança que
implique em mudança de distribuição, os aplicativos devem continuar a rodar sem
mudanças
12. Não-subversão : se o sistema tiver interface de baixo nível , a interface não pode ser usada para
subverter o sistema (suas regras), como por exemplo efetuar bypass de verificação de
constraint.

7
Conceitos relativos a RDB’s

Entidade
• (substantivo) ítem sobre o qual alguma informação é armazenada. Ex. cliente, produto
Atributo
• (substantivo / adjetivo - qualificativo) característica de (pertencente a) uma entidade. Ex. tipo de
cliente

Relacionamento
• (verbo / ação) associação existente entre entidades. Ex. cliente compra produto
Tabelas
• São estruturas mantidas pelo gerenciador de banco de dados.
• Uma tabela é um conjunto de linhas (ROWS)
• OU, na verdade :
Campo / Coluna / Column = dado referente a um atributo
Registro / Linha / Row = colunas (campos) com atributos de uma entidade
• Denomina-se RESULT TABLE à tabela gerada como resultado de uma QUERY.
• Manipulação de tabelas : exemplos :

❑ Criando
CREATE TABLE EMP
(EMPNUME INTEGER(5) NOT NULL,
EMPNOME CHAR(30) NOT NULL,
EMPGERE INTEGER(5) ,
EMPSERV CHAR(20) ,
EMPADMI DATE NOT NULL,
EMPSALA INTEGER(10,2),
PRIMARY KEY (EMPNUME),
FOREIGN KEY HAS (DEPNUME)
REFERENCES DEPT
ON DELETE RESTRICT
ON UPDATE CASCADE
);

❑ Acessando
SELECT EMPNUME, EMPNOME
FROM EMP
WHERE EMPNUME > 500;

8
Views
• São formas alternativas de “visualizar” / acessar dados em uma ou mais tabelas.
• Uma view é, na verdade, uma result table , uma “tabela lógica” ; ela não tem dados fisicamente, mas é
uma “máscara” por meio da qual pode-se acessar outros dados de outra(s) tabela(s) e / ou outra(s)
view(s)
• Especifica-se sua estrutura, por exemplo num SELECT, indicando a origem dos seus dados.
• Usa-se views para
✓ Restringir o acesso a dados
✓ Facilitar consultas complexas
✓ Apresentar diferents views de mesmos dados
• Tipos :
✓ Logical view - especificação de como os dados são tratados no nível do aplicativo, podendo
abranger uma ou mais tabelas (é, na verdade, uma result table). A transformação do que existe
armazenado para o que o aplicativo necessita é feita pelo SGBD.
✓ Physical view - especificação de como os dados estão fisicamente dispostos / armazenados, em
geral num segundo nível (o primeiro é tratado pelo hardware + sistema operacional). A
transformação do que existe armazenado para o que o aplicativo necessita deve ser feita pelo
próprio aplicativo.
• Manipulação de VIEW’s : exemplos

❑ Criando
CREATE VIEW EMPVU10
AS SELECT EMPNO, ENAME, JOB
FROM EMP
WHERE DEPTNO = 10;

CREATE VIEW EMPVU30


AS SELECT EMPNO NUMERO_EMPREGADO, ENAME NOME, SAL SALARIO
FROM EMP
WHERE DEPTNO = 30;

❑ Acessando
SELECT *
FROM EMPVU10;

Índices
• Conjuntos ordenados de pointers para linhas de uma tabela. São baseados nos valores que as colunas
chave contêm.
• Os índices são utilizados para : possibilitar acesso através de chaves distintas, melhorar a performance,
assegurar a unicidade de chaves.

9
Keys
• É um conjunto ordenado de coluna(s) usado para identificar e acessar determinada(s) linha(s). Uma
determinada coluna pode fazer parte de uma ou mais chaves.
• Uma composite key é composta de mais de uma coluna.
• Uma unique key é uma key é aquela que não permite mais de uma linha com valores iguais.
• Uma primary key é um caso especial de unique key, e é a que permite o armazenamento e acesso
básico a uma tabela.
• Uma foreign key é aquela definida através de um referential constraint.

Constraints
Um constraint é uma regra (propriedade) associada a uma coluna ou conjunto de colunas de uma tabela
que permite a integridade dos dados (data integrity), impedindo a inserção de valores com alguns tipos de
inconsistências. Existem os seguintes tipos de integridade de dados :
• Integridade de entidade (Entity Integrity) : assegura que não haja linhas duplicadas numa tabela
• Integridade de domínio (Domain Integrity) : restringe o valor de uma coluna por meio de especificação
de tipo, formato, ou faixa de valores possíveis. Ex.: salario > 300 e < 1000000
• Integridade referencial (Referential integrity) : assegura que linhas não sejam deletadas se estiverem
sendo usadas por outros registros (linhas). Ex.: linha que descreve uma agência de um banco numa
tabela de agências, sendo a agência usada (referenciada) numa tabela de lançamentos.
• Integridade definida pelo usuário (User-Defined Integrity) : especifica algum teste ou validação que
não se enquadre em nenhuma das 3 categorias anteriores.

Os constraints são :

PRIMARY KEY
É um identificador único para uma linha numa tabela. Toda tabela deve ter um primary key
constraint em uma coluna, e somente um primary key constraint pode ser criado para uma tabela.

UNIQUE
Um unique constraint é uma regra que proibe a duplicidade de valores em uma ou mais colunas de
uma tabela. Unique e primary keys são exemplos de unique constraints. Por exemplo, um unique
constraint pode ser definido no código de fornecedor de uma tabela de fornecedores, para
assegurar que o mesmo código de fornecedor não seja dado a dois (ou mais) fornecedores.

FOREIGN KEY
Um foreign key constraint serve para prevenir ações que possam destruir dados (com valores
iguais) que efetuem a ligação entre tabelas. Uma foreign key numa tabela aponta para uma
primary key em outra tabela. Por meio das foreign keys , por exemplo, impede-se que sejam
deletadas linhas de uma tabela em que a primary key seja foreign key em outra tabela. É a
integridade referencial. Exemplo : supor uma tabela de agências em que a primary key seja o
código de agência de um banco (supor agência 010); e que haja outra tabela com os correntistas
10
das agências; por meio da integridade referencial, não é possível deletar a linha de uma agência na
primeira tabela enquanto houver linhas na tabela de correntistas que refiram-se à agência 010.

CHECK
Um table check constraint é usado para validar valores que devam ser inseridos numa coluna. Por
meio dele, estabelece-se as restrições que definem o domínio das informações válidas para uma
coluna.Por exemplo, pode-se definir um table check constraint que impeça que seja gravado (por
inclusão ou atualização) um salário de funcionário < 180,00.

NOT NULL
Um NOT NULL constraint impede que colunas que devam obrigatoriamente ter conteúdo, sejam
gravadas sem conteúdo.

Exemplos de manipulação de constraints :

• Para a criação de constraint usa-se o comando CREATE TABLE :

CREATE TABLE EMPLOYEE(


EMPLOYEEID INT NOT NULL,
LNAME VARCHAR(30) NOT NULL,
FNAME VARCHAR(30) NOT NULL,
ADDRESS VARCHAR(100) NOT NULL,
HIREDATE DATETIME NOT NULL,
SALARY MONEY NOT NULL CONSTRAINT CHECK_SALE CHECK (SALARY > 0) )

• Para adicionar constraint em table já criada, usa-se o comando ALTER TABLE :

ALTER TABLE EMPLOYEE


ADD CONSTRAINT PK_EMPLOYEE PRIMARY KEY (EMPLOYEEID)

Pode-se incluir constraint de primary ou unique key a uma tabela já existente somente se não
houver linhas duplicadas na tabela.

• Para deletar constraint já criado em uma table , usa-se o comando ALTER TABLE :

ALTER TABLE EMPLOYEE


DROP CONSTRAINT PK_EMPLOYEE

• Para habilitar ou desabilitar constraints de FOREIGN KEY ou CHECK (para efetuar algumas
operações específicas) usar o comando ALTER TABLE :

ALTER TABLE EMPLOYEE NOCHECK CONSTRAINT CHECK_SALE

11
ALTER TABLE EMPLOYEE CHECK CONSTRAINT CHECK_SALE

• Outros exemplos :

CREATE TABLE BOOKS (


BOOKID INT NOT NULL PRIMARY KEY,
AUTHORID INT NOT NULL,
BOOKNAME VARCHAR(100) NOT NULL,
PRICE MONEY NOT NULL
)

CREATE TABLE AUTHORS (


AUTHORID INT NOT NULL PRIMARY KEY,
NAME VARCHAR(100) NOT NULL
)

ALTER TABLE BOOKS


ADD CONSTRAINT FK_AUTHOR
FOREIGN KEY (AUTHORID)
REFERENCES AUTHORS (AUTHORID) ON DELETE CASCADE

Queries

Uma query é uma ferramenta / linguagem / comando para a manipulação (recuperação / acesso / obtenção)
dos dados em um banco de dados.

Existem diversas linguagens para efetuar queries; em geral, cada SGBD tem a sua.

Uma bastante utilizada nos RDB’s é o SQL.

Data Base Administrator - Administrador de Base de Dados

• Responsável pela guarda, disponibilidade e acessibilidade das informações utilizadas nos sistemas
de informação da empresa, tanto em situações normais quanto de contingência.
• Estuda, analisa, planeja, implanta e acompanha os database systems com base nas necessidades e
objetivos da empresa
• Verifica o design de databases para assegurar segurança e eficiência no armazenamento e acesso às
informações.
• Verifica o design de aplicativos para assegurar o uso adequado do database
• Verifica a utilização dos softwares integrados / relacionados ao database para assegurar o uso
adequado do database
• Desenvolve e implementa padrões de utilização do database
• Provê suporte técnico para analistas de desenvolvimento e de produção
• Recebe notificações de erro, analisa-as e, caso não seja do aplicativo, providencia correção,
eventualmente através de contato com fornecedor(es)
• Verifica e monitora o desempenho do database
12
• Verifica o impacto de mudanças de ambiente de hardware e software na continuidade de uso do
database e no seu desempenho
• Analisa e homologa novos produtos de hardware e software relacionados ao database
• Implanta e dá manutenção a novos softwares relacionados ao database

BIND & PLAN

• Processo que constrói ‘access paths’ para tabelas DB2 (método usado para acessar os dados
solicitados via statements SQL)
• Visão geral do processo de BIND :
✓ Lê o arquivo DBRM (Data Base Request Module) gerado pelo pré-compilador
✓ Valida os statements SQL (lidos no DBRM)
✓ Verifica autoridade do usuário para manipular os objetos / tabelas indicados no DBRM
✓ Grava um plano (plan)
• Responsável pela guarda, disponibilidade e acessibilidade das informações utilizadas nos sistemas
de informação da empresa, tanto em situações normais quanto de contingência.

13
2 - DB2

Exemplo de estrutura de uma base de dados


INSTÂNCIA
DATABASE

TABLESPACE Arquivos de configuração e de


controle
TABLE

DADOS INDEX VIEW

Estrutura de uma base de dados DB2


SUB-SISTEMA
DATABASE

TABLESPACE Arquivos de configuração e controle

TABLE

DADOS INDEX VIEW

STORAGE GROUP

14
Exemplos de tabelas DB2
Creator Table Usuário
DB2T ZZA100_CADAGE ALUNO 01
DB2T ZZA101_AGECLI ALUNO 01
DB2T ZZA102_SLDCLI ALUNO 01
DB2T ZZA103_SLDCLI2 ALUNO 01
DB2T ZZA200_CADAGE ALUNO 02
DB2T ZZA201_AGECLI ALUNO 02
DB2T ZZA202_SLDCLI ALUNO 02
DB2T ZZA203_SLDCLI2 ALUNO 02
DB2T ZZA300_CADAGE ALUNO 03
DB2T ZZA301_AGECLI ALUNO 03
DB2T ZZA302_SLDCLI ALUNO 03
DB2T ZZA303_SLDCLI2 ALUNO 03
DB2T ZZA400_CADAGE ALUNO 04
DB2T ZZA401_AGECLI ALUNO 04
DB2T ZZA402_SLDCLI ALUNO 04
DB2T ZZA403_SLDCLI2 ALUNO 04
DB2T ZZA500_CADAGE ALUNO 05
DB2T ZZA501_AGECLI ALUNO 05
DB2T ZZA502_SLDCLI ALUNO 05
DB2T ZZA503_SLDCLI2 ALUNO 05
DB2T ZZA600_CADAGE ALUNO 06
DB2T ZZA601_AGECLI ALUNO 06
DB2T ZZA602_SLDCLI ALUNO 06
DB2T ZZA603_SLDCLI2 ALUNO 06
DB2T ZZA700_CADAGE ALUNO 07
DB2T ZZA701_AGECLI ALUNO 07
DB2T ZZA702_SLDCLI ALUNO 07
DB2T ZZA703_SLDCLI2 ALUNO 07
DB2T ZZA800_CADAGE ALUNO 08
DB2T ZZA801_AGECLI ALUNO 08
DB2T ZZA802_SLDCLI ALUNO 08
DB2T ZZA803_SLDCLI2 ALUNO 08
DB2T ZZA900_CADAGE ALUNO 09
DB2T ZZA901_AGECLI ALUNO 09
DB2T ZZA902_SLDCLI ALUNO 09
DB2T ZZA903_SLDCLI2 ALUNO 09
DB2T ZZB100_CADAGE ALUNO 10
DB2T ZZB101_AGECLI ALUNO 10
DB2T ZZB102_SLDCLI ALUNO 10
DB2T ZZB103_SLDCLI2 ALUNO 10
DB2T ZZB200_CADAGE ALUNO 11
DB2T ZZB201_AGECLI ALUNO 11
DB2T ZZB202_SLDCLI ALUNO 11
DB2T ZZB203_SLDCLI2 ALUNO 11
DB2T ZZB300_CADAGE ALUNO 12
DB2T ZZB301_AGECLI ALUNO 12
DB2T ZZB302_SLDCLI ALUNO 12
DB2T ZZB303_SLDCLI2 ALUNO 12
DB2T ZZB400_CADAGE ALUNO 13
DB2T ZZB401_AGECLI ALUNO 13
DB2T ZZB402_SLDCLI ALUNO 13
DB2T ZZB403_SLDCLI2 ALUNO 13
DB2T ZZB500_CADAGE ALUNO 14

15
DB2T ZZB501_AGECLI ALUNO 14
DB2T ZZB502_SLDCLI ALUNO 14
DB2T ZZB503_SLDCLI2 ALUNO 14
DB2T ZZB600_CADAGE ALUNO 15
DB2T ZZB601_AGECLI ALUNO 15
DB2T ZZB602_SLDCLI ALUNO 15
DB2T ZZB603_SLDCLI2 ALUNO 15
DB2T ZZB700_CADAGE ALUNO 16
DB2T ZZB701_AGECLI ALUNO 16
DB2T ZZB702_SLDCLI ALUNO 16
DB2T ZZB703_SLDCLI2 ALUNO 16
DB2T ZZB800_CADAGE ALUNO 17
DB2T ZZB801_AGECLI ALUNO 17
DB2T ZZB802_SLDCLI ALUNO 17
DB2T ZZB803_SLDCLI2 ALUNO 17
DB2T ZZB900_CADAGE ALUNO 18
DB2T ZZB901_AGECLI ALUNO 18
DB2T ZZB902_SLDCLI ALUNO 18
DB2T ZZB903_SLDCLI2 ALUNO 18
DB2T ZZC100_CADAGE ALUNO 19
DB2T ZZC101_AGECLI ALUNO 19
DB2T ZZC102_SLDCLI ALUNO 19
DB2T ZZC103_SLDCLI2 ALUNO 19
DB2T ZZC200_CADAGE ALUNO 20
DB2T ZZC201_AGECLI ALUNO 20
DB2T ZZC202_SLDCLI ALUNO 20
DB2T ZZC203_SLDCLI2 ALUNO 20
DB2T ZZC300_CADAGE ALUNO 21
DB2T ZZC301_AGECLI ALUNO 21
DB2T ZZC302_SLDCLI ALUNO 21
DB2T ZZC303_SLDCLI2 ALUNO 21
DB2T ZZC400_CADAGE ALUNO 22
DB2T ZZC401_AGECLI ALUNO 22
DB2T ZZC402_SLDCLI ALUNO 22
DB2T ZZC403_SLDCLI2 ALUNO 22
DB2T ZZC500_CADAGE ALUNO 23
DB2T ZZC501_AGECLI ALUNO 23
DB2T ZZC502_SLDCLI ALUNO 23
DB2T ZZC503_SLDCLI2 ALUNO 23
DB2T ZZC600_CADAGE ALUNO 24
DB2T ZZC601_AGECLI ALUNO 24
DB2T ZZC602_SLDCLI ALUNO 24
DB2T ZZC603_SLDCLI2 ALUNO 24
DB2T ZZC700_CADAGE ALUNO 25
DB2T ZZC701_AGECLI ALUNO 25
DB2T ZZC702_SLDCLI ALUNO 25
DB2T ZZC703_SLDCLI2 ALUNO 25
DB2T ZZC800_CADAGE ALUNO 26
DB2T ZZC801_AGECLI ALUNO 26
DB2T ZZC802_SLDCLI ALUNO 26
DB2T ZZC803_SLDCLI2 ALUNO 26
DB2T ZZC900_CADAGE PROFESSOR
DB2T ZZC901_AGECLI PROFESSOR
DB2T ZZC902_SLDCLI PROFESSOR
DB2T ZZC903_SLDCLI2 PROFESSOR

16
DB2T.ZZCnn0_CADAGE

CD_AGE INTEGER
NM_AGE CHAR(15)
END_AGE CHAR(30)
TEL_AGE INTEGER

DB2T.ZZCnn1_AGECLI

CD_AGE_CLI INTEGER
CD_CLI INTEGER
TP_CLI INTEGER
NM_CLI CHAR(35)
END_CLI CHAR(35)
COMPL_CLI CHAR(30)
CID_CLI CHAR(30)
UF_CLI CHAR(2)
CEP_CLI INTEGER
CMCEP_CLI INTEGER
TEL_CLI INTEGER
RG_CLI INTEGER
CPF_CGC_CLI INTEGER
DT_INCL_CLI DATE
DT_EXCL_CLI DATE
VL_SDO_CLI DECIMAL(7,2)

DB2T.ZZCnn2_SLDCLI

CD_AGE_SLD INTEGER
CD_CLI INTEGER
NM_CLI CHAR(35)
TEL_CLI INTEGER
VL_SDO_CLI DECIMAL(7,2)

DB2T.ZZCnn3_SLDCLI2

CD_AGE_SLD INTEGER
CD_CLI INTEGER
NM_CLI CHAR(35)
TEL_CLI INTEGER
VL_SDO_CLI DECIMAL(15,2)

17
Arquivos de configuração e controle usados pelo DB2

Sgbd DB2 Tem a relação de todas as


tabelas, respectivas colunas,
data types, etc. ...

Arquivos de dados: tabelas


• • •
ACT0001, etc…

Base de Dados
Arquivos de controle

SYSIBM.SYSTABLES SYSIBM.SYSCOLUMNS

SYSIBM.SYSDBAUTH SYSIBM.SYSTABAUTH

SYSIBM.SYSINDEXES SYSIBM.SYSRELS

SYSIBM.SYSTABCONST

18
SYSCOLUMNS
NAME VARCHAR(18)
TBNAME VARCHAR(18)
TBCREATOR CHAR(8)
COLNO SMALLINT
COLTYPE CHAR(8)
LENGTH SMALLINT
SCALE SMALLINT
NULLS CHAR(1)
COLCARD INTEGER
HIGH2KEY CHAR(8)
LOW2KEY CHAR(8)
UPDATES CHAR(1)
IBMREQD CHAR(1)
REMARKS VARCHAR(254)
DEFAULT CHAR(1)
KEYSEQ SMALLINT
FOREIGNKEY CHAR(1)
FLDPROC CHAR(1)
LABEL VARCHAR(30)
STATSTIME TIMESTMP
DEFAULTVALUE VARCHAR(512)
COLCARDF FLOAT(8)
COLSTATUS CHAR(1)
LENGTH2 INTEGER
DATATYPEID INTEGER
SOURCETYPEID INTEGER
TYPESCHEMA CHAR(8)
TYPENAME VARCHAR(18)
CREATEDTS TIMESTMP

TABELA ACT0001
COLUNA DESCRICAO SEQ TIPO TAM NUL
--- ---- --- ---- --- ---
NRFILIAL NUMERO FILIAL 1 DECIMAL 3 N
CDCIDADE CODIGO CIDADE 2 SMALLINT 2 N
CDNOMEFA CODIGO NOME FANTASIA 3 SMALLINT 2 N
TPFRANQU TIPO FRANQUIA 4 SMALLINT 2 N
CDOFERTA CODIGO OFERTA 5 SMALLINT 2 N
INGRHEAD INDICADOR GROUP HEAD 6 CHAR 1 N

19
SYSIBM.tabelas
SYSIBM DSNRLST01 TABLE
SYSIBM IPNAMES TABLE
SYSIBM LOCATIONS TABLE
SYSIBM LULIST TABLE
SYSIBM LUMODES TABLE
SYSIBM LUNAMES TABLE
SYSIBM MODESELECT TABLE
SYSIBM SQLTABLETYPES TABLE
SYSIBM SQLTYPEINFO TABLE
SYSIBM SYSAUXRELS TABLE
SYSIBM SYSCHECKDEP TABLE
SYSIBM SYSCHECKS TABLE
SYSIBM SYSCHECKS2 TABLE
SYSIBM SYSCOLAUTH TABLE
SYSIBM SYSCOLDIST TABLE
SYSIBM SYSCOLDIST_HIST TABLE
SYSIBM SYSCOLDISTSTATS TABLE
SYSIBM SYSCOLSTATS TABLE
SYSIBM SYSCOLUMNS TABLE
SYSIBM SYSCOLUMNS_HIST TABLE
SYSIBM SYSCONSTDEP TABLE
SYSIBM SYSCOPY TABLE
SYSIBM SYSDATABASE TABLE
SYSIBM SYSDATATYPES TABLE
SYSIBM SYSDBAUTH TABLE
SYSIBM SYSDBRM TABLE
SYSIBM SYSDUMMY1 TABLE
SYSIBM SYSFIELDS TABLE
SYSIBM SYSFOREIGNKEYS TABLE
SYSIBM SYSINDEXES TABLE
SYSIBM SYSINDEXES_HIST TABLE
SYSIBM SYSINDEXPART TABLE
SYSIBM SYSINDEXPART_HIST TABLE
SYSIBM SYSINDEXSTATS TABLE
SYSIBM SYSINDEXSTATS_HIST TABLE
SYSIBM SYSJARCONTENTS TABLE
SYSIBM SYSJAROBJECTS TABLE
SYSIBM SYSJAVAOPTS TABLE
SYSIBM SYSKEYCOLUSE TABLE
SYSIBM SYSKEYS TABLE
SYSIBM SYSLINKS TABLE
SYSIBM SYSLOBSTATS TABLE
SYSIBM SYSLOBSTATS_HIST TABLE
SYSIBM SYSPACKAGE TABLE
SYSIBM SYSPACKAUTH TABLE
SYSIBM SYSPACKDEP TABLE
SYSIBM SYSPACKLIST TABLE
SYSIBM SYSPACKSTMT TABLE
SYSIBM SYSPARMS TABLE
20
SYSIBM SYSPKSYSTEM TABLE
SYSIBM SYSPLAN TABLE
SYSIBM SYSPLANAUTH TABLE
SYSIBM SYSPLANDEP TABLE
SYSIBM SYSPLSYSTEM TABLE
SYSIBM SYSPROCEDURES TABLE
SYSIBM SYSPSM VIEW
SYSIBM SYSPSMOPTS VIEW
SYSIBM SYSRELS TABLE
SYSIBM SYSRESAUTH TABLE
SYSIBM SYSROUTINEAUTH TABLE
SYSIBM SYSROUTINES TABLE
SYSIBM SYSROUTINES_OPTS TABLE
SYSIBM SYSROUTINES_SRC TABLE
SYSIBM SYSSCHEMAAUTH TABLE
SYSIBM SYSSEQUENCES TABLE
SYSIBM SYSSEQUENCESDEP TABLE
SYSIBM SYSSTMT TABLE
SYSIBM SYSSTOGROUP TABLE
SYSIBM SYSSTRINGS TABLE
SYSIBM SYSSYNONYMS TABLE
SYSIBM SYSTABAUTH TABLE
SYSIBM SYSTABCONST TABLE
SYSIBM SYSTABLEPART TABLE
SYSIBM SYSTABLEPART_HIST TABLE
SYSIBM SYSTABLES TABLE
SYSIBM SYSTABLES_HIST TABLE
SYSIBM SYSTABLESPACE TABLE
SYSIBM SYSTABSTATS TABLE
SYSIBM SYSTABSTATS_HIST TABLE
SYSIBM SYSTRIGGERS TABLE
SYSIBM SYSUSERAUTH TABLE
SYSIBM SYSVIEWDEP TABLE
SYSIBM SYSVIEWS TABLE
SYSIBM SYSVLTREE TABLE
SYSIBM SYSVOLUMES TABLE
SYSIBM SYSVTREE TABLE
SYSIBM USERNAMES TABLE

21
Built-In Data Types ; formatos de Date e Time
Dado Obs. Formato DB2 PIC Cobol
Horário Alfanumérico TIME X(8)
ISO format = hh.mm.ss (00.00.00 a 24.00.00)
EUR format = hh.mm.ss (00.00.00 a
24.00.00)
JIS format = hh:mm:ss (00:00:00 a 24:00:00)
USA format = 00.00 xx (00.00 a 12.00);
(xx=AM ou PM )
(Pode ser LOCAL format = definido pela instalação)
Horário + data Alfanumérico TIMESTAMP X(26)
EUR format = yyyy-mm-dd-hh.mm.ss.xxxxxx
Data Alfanumérico DATE X(10)
ISO format = yyyy-mm-dd
EUR format = dd.mm.yyyy
JIS format = yyyy-mm-dd
USA format = mm/dd/yyyy
(Pode ser LOCAL format = definido pela instalação)
Número Binário ponto fixo SMALLINT S9(4) COMP
(16 bits) Ou
2 bytes S9(4) COMP-4
Número Binário ponto fixo INTEGER S9(9) COMP
(32 bits) Ou
4 bytes S9(9) COMP-4
Número Binário ponto fixo Não tem
(64 bits) BIGINT
8 bytes
Número Decimal DECIMAL(p,s) S9(p-s)V9(s) COMP-3
compactado
Número Binário ponto REAL COMP-1
flutuante precisao
simples
4 bytes
Número Binário ponto DOUBLE COMP-2
flutuante dupla Ou
8 bytes FLOAT
String Tamanho fixo CHAR(n) X(n)
Carater
String Tamanho variavel VARCHAR(n) xxx-LEN PIC S9(4) COMP.
Carater xxx-TEXT PIC X(n).
String grafico Tamanho fixo Grafico GRAPHIC
String grafico Tamanho variavel Grafico VARGRAPHIC
String grafico LOB Tamanho variavel Grafico DBCLOB
LOB
String LOB Tamanho variavel Carater CLOB
LOB
String LOB Tamanho variavel Binario BLOB
LOB
Dado externo Pointer DATALINK USAGE POINTER

22
Obs. LOB = LARGE OBJECT : desenhos, fotos, voz, (teses), (livros), etc...

23
DB2 no mainframe

IKJFT01
Sistema Gerenciador DB2 (TSO batch) DSNTEP2
Operacional (SQL batch)
comandos SQL
→resultados
Aplicativos Cobol Batch

FileAid
comandos SQL
→resultados

Outros Softwares
comandos SQL
→resultados

Execução de comandos DB2 via batch (IKJEFT01 chama DSNTEP2)

SYSTSIN indica : SYSIN


BASE DE DADOS Programa=DSNTEP2
Plano=xxxxx (SELECT * FROM
LoadLib=dsn TABELA_CLIENTES)
Etc...

Sistema IKJEFT01 DSNTEP2


Gerenciador (programa chamado pelo
Operacional DB2 IKJEFT01)

SELECT * FROM SELECT * FROM


TABELA_CLIENTES TABELA_CLIENTES
→(RESULTADO) →(RESULTADO)

SYSPRINT
(RESULTADO)
24
Job submetido :
//JOBNAME JOB (ALBERTO),ALBERTO,MSGCLASS=X,CLASS=R
//STEP001 EXEC PGM=IKJEFT01,DYNAMNBR=20,REGION=6M
//STEPLIB DD DSN=SYS1.DSNDB1D.SDSNLOAD,DISP=SHR
// DD DSN=SYS1.DSNDB1D.RUNLIB.LOAD,DISP=SHR
//DBRMLIB DD DSN=SYS1.DSNDB1D.DBRMLIB.DATA,DISP=SHR
//SYSTSPRT DD SYSOUT=*
//SYSPRINT DD SYSOUT=*
//SYSUDUMP DD SYSOUT=*
//SYSTSIN DD *
DSN SYSTEM(DB1D)
RUN PROGRAM(DSNTEP2) PLAN(DSNTEP2) -
LIB('SYS1.DSNDB1D.RUNLIB.LOAD') PARMS('/ALIGN(MID)')
END
//SYSIN DD *
SELECT * FROM DB2T.ZZZ_CADAGE

Resultado produzido :
READY
DSN SYSTEM(DB1D)
DSN
RUN PROGRAM(DSNTEP2) PLAN(DSNTEP2) LIB('SYS1.DSNDB1D.RUNLIB.LOAD')
DSN
END
READY Nome tabela
END
errado !!!
PAGE 1
***INPUT STATEMENT:
SELECT * FROM DB2T.ZZZ_CADAGE
SQLERROR ON SELECT COMMAND, PREPARE FUNCTION
RESULT OF SQL STATEMENT:
DSNT408I SQLCODE = -204, ERROR: DB2T.ZZZ_CADAGE IS AN UNDEFINED NAME
DSNT418I SQLSTATE = 42704 SQLSTATE RETURN CODE
DSNT415I SQLERRP = DSNXOTL SQL PROCEDURE DETECTING ERROR
DSNT416I SQLERRD = -500 0 0 -1 0 0 SQL DIAGNOSTIC INFORMATION
DSNT416I SQLERRD = X'FFFFFE0C' X'00000000' X'00000000' X'FFFFFFFF'
INFORMATION

Após acerto do nome da tabela, job re-submetido :


//JOBNAME JOB (ALBERTO),ALBERTO,MSGCLASS=X,CLASS=R
//STEP001 EXEC PGM=IKJEFT01,DYNAMNBR=20,REGION=6M
//STEPLIB DD DSN=SYS1.DSNDB1D.SDSNLOAD,DISP=SHR
// DD DSN=SYS1.DSNDB1D.RUNLIB.LOAD,DISP=SHR
//DBRMLIB DD DSN=SYS1.DSNDB1D.DBRMLIB.DATA,DISP=SHR
//SYSTSPRT DD SYSOUT=*
//SYSPRINT DD SYSOUT=*
//SYSUDUMP DD SYSOUT=*
//SYSTSIN DD *
DSN SYSTEM(DB1D)
RUN PROGRAM(DSNTEP2) PLAN(DSNTEP2) -
LIB('SYS1.DSNDB1D.RUNLIB.LOAD') PARMS('/ALIGN(MID)')
END
//SYSIN DD *
SELECT * FROM DB2T.ZZC900_CADAGE;

25
Resultado produzido :

PAGE 1
***INPUT STATEMENT:
SELECT * FROM DB2T.ZZC900_CADAGE;
+------------------------------------------------------------------------------------+
] CD_AGE ] NM_AGE ] END_AGE ] TEL_AGE ]
+------------------------------------------------------------------------------------+
1_] 1 ] AGENCIA 01 ] ENDER AGE 01 ] 1111111 ]
2_] 2 ] AGENCIA 02 ] ENDER AGE 02 ] 1111111 ]
3_] 3 ] AGENCIA 02 ] ENDER AGE 03 ] 1111111 ]
4_] 4 ] AGENCIA 02 ] ENDER AGE 04 ] 1111111 ]
5_] 5 ] AGENCIA 03 ] ENDER AGE 05 ] 1111111 ]
+------------------------------------------------------------------------------------+
SUCCESSFUL RETRIEVAL OF 5 ROW(S)

Caso a totalidade dos dados não coubesse na linha, eles seriam agrupados em conjuntos de colunas
que coubessem nas linhas; exemplo (de outra tabela) :
PAGE 1
*-----------------------------------------
***INPUT STATEMENT:
SELECT *
FROM DB2T.ZZC901_AGECLI;
+-----------------------------------------------------------------------------------------
] CD_AGE_CLI ] CD_CLI ] TP_CLI ] NM_CLI ]
+-----------------------------------------------------------------------------------------
1_] 1 ] 1 ] 1 ] CLIENTE 1 ]
+-----------------------------------------------------------------------------------------
PAGE 2
------------------------------------------------------------------------------------------------------------------
] END_CLI ] COMPL_CLI ] CID_CLI ] UF_CLI ]
------------------------------------------------------------------------------------------------------------------
1_] ] ] ] ]
------------------------------------------------------------------------------------------------------------------
PAGE 3
------------------------------------------------------------------------------------------------------------------
] CEP_CLI ] CMCEP_CLI ] TEL_CLI ] RG_CLI ] CPF_CGC_CLI ] DT_INCL_CLI ] DT_EXCL_CLI ]
------------------------------------------------------------------------------------------------------------------
1_] 1 ] 1 ] 1 ] 1 ] 1 ] 09.12.2003 ] 30.12.2003 ]
------------------------------------------------------------------------------------------------------------------
PAGE 4
-------------+
] VL_SDO_CLI ]
-------------+
1_] 1.00 ]
-------------+
SUCCESSFUL RETRIEVAL OF 1 ROW(S)

26
Execução de comandos DB2 via FileAid


Comandos Resultados
BASE DE DADOS

Sistema Gerenciador DB2 FileAid


Operacional
Comandos
→Resultados

Consulta

File-AID for DB2 -------- BROWSE Selection Template ---------- Row 1 to 4 of 4


COMMAND ===> SCROLL ===> CSR
SSID: DB1D
Use EXEC to continue
Use SQL to view/edit the SQL source for DB2T.ZZC100_CADAGE

Save Edit Criteria Information:


Save Template Criteria On Execute ===> NO (Yes or No)
Criteria Dataset Name ===>
Member ===>

Max Rows to Select ===> 2000 (* = ALL ROWS)

SEL COLUMN NAME TYPE(LEN) ORDER (A/D) WHERE More: >


--- ------------------ ------------------ -- - ----+---10----+---20----+
S__ CD_AGE INTEGER > 5
S__ NM_AGE CHAR(15)
___ END_AGE CHAR(30)
___ TEL_AGE INTEGER
******************************* Bottom of data
********************************

F6=EXECUTE

Resultado

File Edit View Options Open Menu Utilities Help


-----------------------------------------------------------------------------
-
File-AID for DB2 Browse DB2T.ZZC100_CADAGE 2 rows
fetched
COMMAND ===> SCROLL ===>
PAGE
CD_AGE NM_AGE
INTEGER CHAR(15)
----PRIMARY ---------------
****** **************************** TOP OF DATA
**************************** 27
000001 8 NOME AG 8
000002 10 NOME AG 10
****** ************************** BOTTOM OF DATA
***************************
Execução de comandos DB2 via aplicativo Cobol (IKJEFT01 chama aplicativo Cobol)
SYSTSIN indica :
BASE DE DADOS Programa=xxxxxxxx
Plano=xxxxx
LoadLib=dsn
Etc...

Sistema Gerenciador IKJEFT01 Aplicativo


Operacional DB2 (programa
xxxxxxxx) (chamado
pelo IKJEFT01)
SELECT * FROM
TABELA_CLIENTES

SELECT * FROM SELECT * FROM


TABELA_CLIENTES TABELA_CLIENTES
→(RESULTADO) →(RESULTADO)

Job submetido em batch:


//JOBNAME JOB (ALBERTO),ALBERTO,MSGCLASS=X,CLASS=R
//STEP001 EXEC PGM=IKJEFT01,DYNAMNBR=20,REGION=6M
//STEPLIB DD DSN=SYS1.DSNDB1D.SDSNLOAD,DISP=SHR
// DD DSN=SYS1.DSNDB1D.RUNLIB.LOAD,DISP=SHR
//DBRMLIB DD DSN=SYS1.DSNDB1D.DBRMLIB.DATA,DISP=SHR
//SYSTSPRT DD SYSOUT=*
//SYSPRINT DD SYSOUT=*
//SYSUDUMP DD SYSOUT=*
//SYSTSIN DD *
DSN SYSTEM(DB1D)
RUN PROGRAM(xxxxxxxx) PLAN(DSVPTAB) -
LIB('SYS1.DSNDB1D.RUNLIB.LOAD') PARMS('/ALIGN(MID)')
END

28
3 - SQL

Origem
1970 = modelo base de dados relacional (Dr. E. F. Codd da IBM) = como os BD são concebidos (não
como são usados) : tabelas, colunas, linhas, índices, chaves, relação entre tabelas, metadados, etc…
IBM desenvolveu SYSTEM R (protótipo de um BD relacional).

Para a criação e a manipulação dos dados do System R, a IBM desenvolveu o SEQUEL (Structured
English Query Language).

Segunda versão do SEQUEL = SEQUEL/2, depois renomeada para SQL.

Portanto, SQL é uma linguagem que provê o interface com um banco de dados (relacional), tanto para a
manipulação de dados quanto para o seu gerenciamento.

O SQL é suportado por ampla gama de RDBMS , como por exemplo : Oracle, Sybase, SQL Server,
MySql, DB2.

Apesar de ser / existir um padrão, existem diversas implementações com variações.

Alguns padrões ANSI: SQL1 (1989) , SQL2 (1992) , SQL3.

29
Execução de comandos SQL : métodos

Os 3 primeiros métodos são denominados ESTÁTICOS : Interativo, Embedded e Module

• Interactive SQL (ou invocação direta) : (bulk process) permite que comandos sejam dados em
linha de comando e o resultado aparece na tela.

• Embedded SQL : utilizada código simbólico em programas elaborados em linguagem hospedeira


(ex. C, Cobol, PL/I)); como tais comandos não são reconhecidos pelo compilador ou montador
hospedeiro, é necessário um pré-compilador (programa que detecta os comandos SQL e os
transforma em chamadas ao SGBD ); normalmente :
❑ comandos SQL são especificados como procedimentos procedurais, delimitados por
EXEC SQL
............. declaração dos procedimentos
END EXEC
❑ declaração de variáveis onde dados acessados devem ser colocados é feita por
EXEC SQL BEGIN DECLARE SECTION
............. declaração das variáveis
END EXEC
Desvantagem : tratamento do conjunto de dados retornados um a um (linha por linha)

• Module SQL : os statements SQL são compilados separadamente dos statements do código do
programa na linguagem hospedeira; os dois “programas-objeto” gerados são linkeditados
formando um único programa executável.

Outros métodos são DINÂMICOS :

• Dynamic SQL : permite a criação dos statements (e sua sintaxe e suas variáveis) durante a
execução do programa : o “string” com o comando é gerado em tempo de execução e não em
tempo de codificação; o string é passado diretamente para o SGBD ou para uma API (Aplication
Program Interface) que o repassa para o SGBD; neste último caso diz-se que o método é CLI
(Call-Level Interface).

EXEMPLOS :

30
SQL interativo


(SELECT * Resultados
FROM
TABELA_CLIE
NTE)
BASE DE DADOS

SQL Plus
Sistema SGBD
Operacional DB2
 SELECT * FROM TABELA_CLIENTE

→(RESULTADOS)

31
32
SQL dinâmico


Consulta Resultados

BASE DE DADOS

FileAid
Sistema SGBD
Operacional DB2  Consulta SQL

→Resultados

Consulta
File-AID for DB2 -------- BROWSE Selection Template ---------- Row 1 to 4 of 4
COMMAND ===> SCROLL ===> CSR
SSID: DB1D
Use EXEC to continue
Use SQL to view/edit the SQL source for DB2T.ZZC100_CADAGE

Save Edit Criteria Information:


Save Template Criteria On Execute ===> NO (Yes or No)
Criteria Dataset Name ===>
Member ===>

Max Rows to Select ===> 2000 (* = ALL ROWS)

SEL COLUMN NAME TYPE(LEN) ORDER (A/D) WHERE More: >


--- ------------------ ------------------ -- - ----+---10----+---20----+
S__ CD_AGE INTEGER > 5
S__ NM_AGE CHAR(15)
___ END_AGE CHAR(30)
___ TEL_AGE INTEGER
******************************* Bottom of data
********************************

F6=EXECUTE

Resultado
File Edit View Options Open Menu Utilities Help
-----------------------------------------------------------------------------
-
File-AID for DB2 Browse DB2T.ZZC100_CADAGE 2 rows
fetched
COMMAND ===> SCROLL ===>
PAGE
CD_AGE NM_AGE
INTEGER CHAR(15)
----PRIMARY ---------------
****** **************************** TOP OF DATA
****************************
000001 8 NOME AG 8 33
000002 10 NOME AG 10
****** ************************** BOTTOM OF DATA
***************************
SQL embedded (aplicação on-line)


Resultados
Dados
(informações
para compor
uma consulta
BASE DE DADOS ao BD) (Resultados)

Aplicativo X (rodando sob CICS)


Sistema SGBD (transforma dados em consulta SQL)
Operacional DB2
 consulta em SQL

(e faz o uso que quiser dos resultados)


→Resultados

34
SQL embedded (aplicação batch)

Avisa que :
Programa=X
Plano=xxxxx Consulta Resultados
LoadLib=dsn (no código
Etc... executável)
BASE DE DADOS
(no arquivo com
ddname SYSTSIN)

IKJEFT01 Aplicativo X
Sistema SGBD
Operacional DB2  consulta em SQL

→Resultados (faz o uso que quiser deles)

35
SQL batch

Avisa que :
Programa=DSNTEP2 Resultados
Consulta
Plano=xxxxx (SYSPRINT)
LoadLib=dsn (no arquivo com
BASE DE DADOS Etc... ddname SYSIN)
(no arquivo com
ddname SYSTSIN)

IKJEFT01 DSNTEP2
Sistema SGBD
Operacional DB2
 consulta em SQL

→(RESULTADOS)

36
Resumo dos principais comandos SQL

Principais grupos de comandos SQL : DDL, DML e DCL


• Alguns podem ser usados tanto (B) via DSNTEP2 (SQL batch) quanto (E) por programa em linguagem
hospedeira (embedded SQL), podendo apresentar ligeiras diferenças de sintaxe e / ou recursos
• Outros podem ser usados somente (E) em embedded SQL

DDL (Data Definition Language) statements


CREATE = criar objetos no database
ALTER = alterar objetos (sua estrutura / características) do database
DROP = deletar objetos do database
COMMENT = inserir comentários no data dictionary
GRANT = conceder privilégios de acesso de usuário ao database
RENAME = renomear objetos do database
REVOKE = revogar privilégios concedidos pelo GRANT

DCL (Data Control Language) statements


COMMIT = salvar efetivamente dados alterados / deletados / inseridos
SAVEPOINT = identificar um ponto numa transação para permitir posterior ROLLBACK
ROLLBACK = restaurar o database a um estado anterior (antes do último COMMIT)
RECOVER = efetuar o recover (recuperação) de um database, tablespace, etc…
SET TRANSACTION = altera as opções da transação

DML (Data Manipulation Language) statements


SELECT = efetua queries, cria tabela resultado e acessa suas linhas
✓ Sem cursor : para acessar a tabela resultado quando ela devolve com certeza uma única linha
✓ Com cursor : para acessar a tabela resultado, linha por linha, quando ela devolve n linhas
OPEN = para abrir cursor (E)
FETCH = para acessar linha de cursor (E)
CLOSE = para fechar cursor (E)
INSERT = insere dados numa table
UPDATE = atualiza dados nas linhas de uma table
DELETE = deleta linhas de uma tabela
LOCK TABLE = controlar locks (concorrência)
TRUNCATE = deleta todos os registros (e espaços alocados para eles) de uma table
WHENEVER = indica (“deixa marcado”) que o aplicativo deseja tratar determinadas condições que
ocorrerem, indicando o procedimento para onde deve ser feito um desvio (E)

Comandos declarativos auxiliares


INCLUDE = Indica ao pré compilador para buscar statements fonte em LIB’s (E)
DECLARE = Para declarar estruturas relativas a tabelas e cursores (E)

Obs.: DCLGEN = Processo via ISPF ou via IKJEFT01 para declarar estruturas relativas a tabelas (DECLARE’s)
e à linguagem hospedeira ; se for Cobol, define as variáveis com nível, nome, PIC, etc.

37
Outros conceitos

(DSPL - Database Stored Procedure Language) statements


Linguagens usadas nas stored procedures, para especificação de procedimentos / programas / rotinas a
rodar disparadas por triggers ou outros eventos; como chegaram bem posteriormente ao nascimento das
linguagens de query, ressentem-se pela falta de padrões, e, por decorrência, pela diversidade existente
entre os diversos s fornecedores.

(TCL - Transaction Control Language) statements


Em alguns contextos, comandos DCL são referenciados como TCL.

38
4 - DB2 em um programa COBOL
Diferenças no programa e conceitos associados

• Os comandos DB2/SQL são incluidos / misturados / “em linha” com os comando COBOL

• Os comandos DB2/SQL devem ser identificados por meio de delimitadores :


EXEC SQL no início
comando
END-EXEC no fim

• Convém especificar um DECLARE para cada table usada no programa (WorkingStorageSection):


EXEC SQL DECLARE nome_tabela TABLE (estrutura_tabela) END-EXEC
• Deve haver a declaração de variáveis Cobol para usar como emissoras ou receptoras em FETCHs
ou SELECTs;
• Em geral usa-se a ferramenta / procedimento DCLGEN (pelo ISPF ou pelo IKJEFT01) para gerar
DECLARE de estrutura de table e declaração de estrutura Cobol da tabela

• Pode-se usar busca de fonte DB2/SQL em bibliotecas por meio do comando INCLUDE (equivale
ao COPY do COBOL)
EXEC SQL
INCLUDE ..........
END-EXEC
• O INCLUDE é na maioria das vezes usado para incluir DECLARE’s

• Após toda operação SQL deve-se testar o código de retorno do DB2 referente a ela, disponível na
variável SQLCODE, pertencente à SQLCA

39
Fluxo do processo de geração do executável

FONTE COBOL COM COMANDOS SQL “EMBEDDED”


(delimitados por EXEC SQL / END-EXEC)

Mensagens (erros / resultados da


Saída (PRÉ-COMPILADOR)
DCLGEN análise dos comandos)
(NÃO acessa o banco de dados)

Fonte cobol com Arquivo para BIND


comandos SQL = DBRM
asteriscados e = Data Base Data
transformados em Request Module Base
comandos cobol CALL (dados para criar
um package)

Mensagens
(erros /
COMPILADOR COBOL
resultados da
NORMAL compilação)
BINDER

Programa Objeto Base de dados

PACKAGE
Mensagens (dados para
(erros / executar SQL
LINKEDITOR resultados
estático)
da
linkedição)

PROGRAMA
EXECUTÁVEL

Execução via DSNTEP2 / IKJEFT01 / Gerenciador DB2

40
41
Funções do Pré-compilador

• Resolver os INCLUDE’s , buscando-os na library indicada no JCL (ou que seja default); os
INCLUDES equivalem aos COPY’s : INCLUDE’s referem-se a dados para o DB2/SQL e são
resolvidos em tempo de pré-compilação; COPY’s referem-se a dados (ou procedimentos) do Cobol e
são resolvidos em tempo de compilação.
• Efetuar validação básica de sintaxe dos comandos DB2/SQL baseando-se nos DECLARE e não em
dicionário de dados (NÃO é feita consulta ao banco de dados em tempo de pré-compilação)
• Gerar de 2 arquivos :
✓ Fonte COBOL “puro” (com os statements DB2/SQL transformados em CALL’s ou comentados)
✓ DBRM (Data Base Request Module) : membro de um PDS que tem somente os dados DB2/SQL

Funções do Binder

• Bind = atar, amarrar, encadernar / empacotar = associação entre (código “objeto” dos) statements SQL
do programa com o código objeto do programa propriamente dito.
• Converter o DBRM gerado pelo em um package ou plano (application plan).
• Escolher os caminhos (paths) que serão usados para acessar os dados na base de dados
• Efetuar alguma validação de autorização para efetuar as operações

Comandos ao Pré-compilador
INCLUDES

• Cópia de declarações de dados de biblioteca


• COPY’s são buscados pelo compilador em bibliotecas “dele” (durante a compilação)
• INCLUDE’s são buscados pelo pré-compilador em bibliotecas “dele” (durante a pré-compilação)
DATA DIVISION.
FILE SECTION.
...
COPY ...
WORKING-STORAGE SECTION.
...
COPY ...
....
EXEC SQL INCLUDE nome_membro END-EXEC
...
PROCEDURE DIVISION.
...
...
COPY ...
...

EXEC SQL comando ... END-EXEC

42
DECLARE
• Declara estruturas (lay-outs) de tabelas em SQL (usar na Working-Storage Section) :
WORKING-STORAGE SECTION.
...
EXEC SQL INCLUDE SQLCA END-EXEC
...
EXEC SQL DECLARE EPCV01A1_PAM_EPC TABLE
( CD_PAM_SIS_EPC CHAR(10) NOT NULL,
DS_PAM_SIS_EPC CHAR(200) NOT NULL,
TS_INC TIMESTAMP NOT NULL,
CD_USU_INC CHAR(8) NOT NULL,
TS_ULT_ATU TIMESTAMP NOT NULL,
CD_USU_ULT_ATU CHAR(8) NOT NULL,
CD_PGM_MAN CHAR(8) NOT NULL
) END-EXEC.
...

DCLGEN
• Não é comando ao pré-compilador. É função utilitária do ISPF ou do IKJEFT01
• Usado por facilidade de padronização
• Ele gera as declarações em SQL (da estrutura das tabelas) e em Cobol (das variáveis que irão ser
usadas para receber dados na leitura ou para enviar dados na gravação)
WORKING-STORAGE SECTION.
...
EXEC SQL INCLUDE SQLCA END-EXEC
...
EXEC SQL INCLUDE EPCV01A1 END-EXEC
...
• A (prévia) geração do DCLGEN dos fontes SQL e Cobol numa library deve anexar ao fonte :
*****EXEC SQL INCLUDE EPCV01A1 END-EXEC.
******************************************************************
* DCLGEN TABLE(DB2DEPC.EPCV01A1_PAM_EPC) *
* LIBRARY(DSVAABLB.DB2.DCLGEN(EPCV01A1)) *
* ACTION(REPLACE) *
* LANGUAGE(COBOL) *
* STRUCTURE(EPCV01A1) *
* APOST *
* ... IS THE DCLGEN COMMAND THAT MADE THE FOLLOWING STATEMENTS *
******************************************************************
*****EXEC SQL DECLARE EPCV01A1_PAM_EPC TABLE
*****( CD_PAM_SIS_EPC CHAR(10) NOT NULL,
***** DS_PAM_SIS_EPC CHAR(200) NOT NULL,
***** TS_INC TIMESTAMP NOT NULL,
***** CD_USU_INC CHAR(8) NOT NULL,
***** TS_ULT_ATU TIMESTAMP NOT NULL,
***** CD_USU_ULT_ATU CHAR(8) NOT NULL,
***** CD_PGM_MAN CHAR(8) NOT NULL
*****) END-EXEC.
******************************************************************
* COBOL DECLARATION FOR TABLE DB2DEPC.EPCV01A1_PAM_EPC *
******************************************************************
01 EPCV01A1.
10 CD-PAM-SIS-EPC PIC X(10).
10 DS-PAM-SIS-EPC PIC X(200).
10 TS-INC PIC X(26).
10 CD-USU-INC PIC X(8).

43
10 TS-ULT-ATU PIC X(26).
10 CD-USU-ULT-ATU PIC X(8).
10 CD-PGM-MAN PIC X(8).

44
SQLCA / SQLCODE
• SQLCA (SQL Communication Area): área de comunicação entre gerenciador DB2 e aplicativo
• Declaração da SQLCA : na Working-Storage Section, em geral via INCLUDE
• SQLCODE = variável pertencente à SQLCA

O INCLUDE da SQLCA gera o seguinte • Exemplo de area para receber os return


conjunto de declarações : codes do SQL :
01 SQLCA.
05 SQLCAID PIC X(8).
77 WS-COD PIC –9999.
05 SQLCABC PIC S9(9) COMP-4.
05 SQLCODE PIC S9(9) COMP-4. Importante o picture ser desta forma, para
05 SQLERRM.
49 SQLERRML PIC S9(4) COMP-4. aparecer o sinal no display !!!!! Exemplo :
49 SQLERRMC PIC X(70).
05 SQLERRP PIC X(8). WORKING-STORAGE SECTION.
05 SQLERRD OCCURS 6 TIMES 01 WS-COD PIC -9999.
PIC S9(9) COMP-4. ...
05 SQLWARN.
EXEC SQL INCLUDE SQLCA END-EXEC
10 SQLWARN0 PIC X.
10 SQLWARN1 PIC X. ...
10 SQLWARN2 PIC X. PROCEDURE DIVISION.
10 SQLWARN3 PIC X. ...
10 SQLWARN4 PIC X. EXEC SQL comando ... END-EXEC
10 SQLWARN5 PIC X. IF SQLCODE NOT = ZERO
10 SQLWARN6 PIC X. MOVE SQLCODE TO WS-COD
10 SQLWARN7 PIC X. DISPLAY ‘ERRO!!! SQLCODE=’ WS-COD
05 SQLEXT.
END-IF
10 SQLWARN8 PIC X.
10 SQLWARN9 PIC X. ...
10 SQLWARNA PIC X.
10 SQLSTATE PIC X(5).
• CUIDADO !!! Se for dado o DISPLAY direto do SQLCODE, aparece o seguinte :
SQLCODE é exibido SQLCODE é exibido SQLCODE é exibido SQLCODE é exibido SQLCODE é exibido
-1 0000J -180 0018} -530 0053} -805 0080N -904 0090M
-2 0000K -181 0018J -532 0053K -806 0080O -911 0091J
-3 0000L -311 0031J -803 0080L -807 0080P -913 0091L
-4 0000M -501 0050J -804 0080M -811 0081J

• SQLCODES mais comuns :


SQLCODE Significado
-180 ou -181 Variável para DATE, TIME ou TIMESTAMP errada
-305 Necessário colocar indicador de NULL
-311 Insert ou Update de VARCHAR : valor do campo LEN inválido
-501 Foi dado Fetch sem ter sido dado Open no cursor
-530 Insert ou Update impossível por constraint de Integridade Referencial
-532 Delete impossível por constraint de Integridade Referencial
-803 Insert ou Update tentado com chave duplicada (linha já existente)
-811 Select com tabela resultado com mais de uma linha (sem cursor)
-904 ou –911 ou –913 Timeout ou recurso não disponível (por lock, por exemplo)

45
• SQLCA : detalhes
NAME Data type Field Values
SQLCAID Char(8) An "eye catcher" for storage dumps containing 'SQLCA'. The sixth byte is 'L' if line number
information is returned from parsing an SQL procedure body.
SQLCABC Integer Contains the length of the SQLCA, 136.
SQLCODE Integer Contains the SQL return code. For specific meanings of SQL return codes, see the message
section of the Message Reference.
Code Means
0 Successful execution (although one or more SQLWARN indicators may be set).
positive Successful execution, but with a warning condition.
negative Error condition.
SQLERRML Smallint Length indicator for sqlerrmc, in the range 0 through 70. 0 means that the value of sqlerrmc
is not relevant.
SQLERRMC Varchar (70) Contains one or more tokens, separated by X'FF', that are substituted for variables in the
descriptions of error conditions.
This field is also used when a successful connection is completed.
When a NOT ATOMIC compound SQL statement is issued, it may contain information on
up to 7 errors.
SQLERRP Char(8) Begins with a three-letter identifier indicating the product, followed by five digits indicating
the version, release, and modification level of the product. For example, SQL07010 means
DB2 Universal Database Version 7 Release 1 Modification level 0.
If SQLCODE indicates an error condition, then this field identifies the module that returned
the error.
This field is also used when a successful connection is completed.
SQLERRD Array Six INTEGER variables that provide diagnostic information. These values are generally
empty if there are no errors, except for sqlerrd(6) from a partitioned database.
SQLERRD(1) Integer If connection is invoked and successful, contains the maximum expected difference in length
of mixed character data (CHAR data types) when converted to the database code page from
the application code page.
A value of 0 or 1 indicates no expansion;
A value greater than 1 indicates a possible expansion in length;
A negative value indicates a possible contraction.
On successful return from an SQL procedure, contains the return status value from the SQL
procedure.
SQLERRD(2) Integer If connection is invoked and successful, contains the maximum expected difference in length
of mixed character data (CHAR data types) when converted to the application code page
from the database code page.
A value of 0 or 1 indicates no expansion;
A value greater than 1 indicates a possible expansion in length;
A negative value indicates a possible contraction.
If the SQLCA results from a NOT ATOMIC compound SQL statement that encountered one
or more errors, the value is set to the number of statements that failed.
SQLERRD(3) Integer If PREPARE is invoked and successful, contains an estimate of the number of rows that will
be returned. After INSERT, UPDATE, and DELETE, contains the actual number of rows
affected. If compound SQL is invoked, contains an accumulation of all sub-statement rows. If
CONNECT is invoked, contains 1 if the database can be updated; 2 if the database is read
only.
If CREATE PROCEDURE for an SQL procedure is invoked and an error is encountered
parsing the SQL procedure body, contains the line number where the error was encountered.
The sixth byte of sqlcaid must be 'L' for this to be a valid line number.
46
SQLERRD(4) Integer If PREPARE is invoked and successful, contains a relative cost estimate of the resources
required to process the statement. If compound SQL is invoked, contains a count of the
number of successful sub-statements. If CONNECT is invoked, contains 0 for a one-phase
commit from a down-level client; 1 for a one-phase commit; 2 for a one-phase, read-only
commit; and 3 for a two-phase commit.
SQLERRD(5) Integer Contains the total number of rows deleted, inserted, or updated as a result of both:
• The enforcement of constraints after a successful delete operation
• The processing of triggered SQL statements from activated triggers.
If compound SQL is invoked, contains an accumulation of the number of such rows for all
substatements. In some cases when an error is encountered, this field contains a negative
value that is an internal error pointer. If CONNECT is invoked, contains an authentication
type value of 0 for a server authentication; 1 for client authentication; 2 for authentication
using DB2 Connect; 3 for DCE security services authentication; 255 for unspecified
authentication.
SQLERRD(6) Integer For a partitioned database, contains the partition number of the partition that encountered the
error or warning. If no errors or warnings were encountered, this field contains the partition
number of the coordinator node. The number in this field is the same as that specified for the
partition in the db2nodes.cfg file.
SQLWARN Array A set of warning indicators, each containing a blank or W. If compound SQL is invoked,
contains an accumulation of the warning indicators set for all substatements.
SQLWARN0 Char(1) Blank if all other indicators are blank; contains W if at least one other indicator is not blank.
SQLWARN1 Char(1) Contains W if the value of a string column was truncated when assigned to a host variable.
Contains N if the null terminator was truncated.
Contains A if the CONNECT or ATTACH is successful and the authID for the connection is
longer than 8 bytes.
SQLWARN2 Char(1) Contains W if null values were eliminated from the argument of a function.
SQLWARN3 Char(1) Contains W if the number of columns is not equal to the number of host variables.
SQLWARN4 Char(1) Contains W if a prepared UPDATE or DELETE statement does not include a WHERE
clause.
SQLWARN5 Char(1) Reserved for future use.
SQLWARN6 Char(1) Contains W if the result of a date calculation was adjusted to avoid an impossible date.
SQLWARN7 Char(1) Reserved for future use.
If CONNECT is invoked and successful, contains 'E' if the DYN_QUERY_MGMT database
configuration parameter is enabled.
SQLWARN8 Char(1) Contains W if a character that could not be converted was replaced with a substitution
character.
SQLWARN9 Char(1) Contains W if arithmetic expressions with errors were ignored during column function
processing.
SQLWARN10 Char(1) Contains W if there was a conversion error when converting a character data value in one of
the fields in the SQLCA.
SQLSTATE Char(5) A return code that indicates the outcome of the most recently executed SQL statement.

47
Variáveis
• Dentro de embedded SQL statements : utiliza-se nomes de objetos que o SQL aceita (é o pré-
compilador quem vai analisar / resolver );
✓ Variáveis Cobol (que receberão dados de colunas ou das quais serão obtidos os dados para
inserir ou alterar nas colunas) : preceder com dois pontos. Exemplos:
:WS-NOM-CLI
:CODOPER
✓ Nomes de colunas de tabelas : não colocar dois pontos; colocar o nome da coluna onde esteja o
dado desejado. Neste caso, caso seja necessário qualificar, usar tabela • coluna (o pré-
compilador não aceita OF ou IN). Exemplos:
WS-NOM-CLI
✓ Atenção para as regras a respeito dos nomes de colunas de tabelas e para os nomes de variáveis
Cobol, colocadas nos quadros ilustrativos dos exemplos a seguir !!!!

Nomes de colunas de tabelas

Exemplos : ✓ VALE underscore, NÃO VALE hífen


EXEC SQL ✓ NÃO TEM dois pontos (:) antes
SELECT CD_AGE, NM_AGE ✓ Dentro de um comando SQL PODEM ser
FROM CADAGE referenciadas
INTO :CADAGE.CD-AGE, ✓ Fora de comando SQL (no “meio” de comandos
:CADAGE.NM-AGE Cobol) NÃO podem ser referenciadas
END-EXEC

Nomes de variáveis Cobol

✓ NÃO VALE Underscore , VALE hífen


✓ TEM QUE TER dois pontos (:) antes
✓ AQUI NO COMANDO SQL : Qualificação com pai• filho e não com OF ou IN
✓ FORA DO COMANDO SQL (no “meio” de comandos Cobol) : qualificação com OF ou IN
E NÃO com pai• filho

EXEC SQL
SELECT CD_AGE, NM_AGE
FROM CADAGE Nomes de colunas de tabelas
INTO :WS-CD-AGE,
:WS-NM-AGE
Nomes de variáveis Cobol
END-EXEC

Declarações de estruturas de tabelas : na WORKING-STORAGE SECTION


EXEC SQL
DECLARE ......
END-SQL.

48
5 – Comandos DDL - Rápida visão

CREATE
Usado para criar objetos no database ; alguns exemplos de objetos :
CREATE CLUSTER
CREATE DATABASE
CREATE INDEX
CREATE PACKAGE
CREATE PROCEDURE
CREATE TABLE
CREATE USER
CREATE VIEW

Exemplo : para criação de uma TABLE :

CREATE TABLE EMP


(EMPNUME INTEGER(5) NOT NULL,
EMPNOME CHAR(30) NOT NULL,
EMPGERE INTEGER(5) ,
EMPSERV CHAR(20) ,
EMPADMI DATE NOT NULL,
EMPSALA INTEGER(10,2),
PRIMARY KEY (EMPNUME),
FOREIGN KEY HAS (DEPNUME)
REFERENCES DEPT
ON DELETE RESTRICT
ON UPDATE CASCADE
);

Exemplos : para criação de INDEX :

CREATE UNIQUE INDEX DEPNUM ON DEPT (DEPNUME ASC);

CREATE INDEX EMPDEP ON EMP (DEPNUME ASC);

Exemplo : para criação de uma VIEW :

CREATE view [(apelido [, apelido ]...)] AS subconsulta


[WITH CHECK OPTION [CONSTRAINT restrição]]
[WITH READ ONLY];

CREATE Cria a view


View é o nome da view
Apelido especifica nomes para as expressões selecionadas pela consulta da
view (O número de apelidos deve corresponder ao número de
expressões selecionadas pela view).

49
Subconsulta é uma instrução SELECT completa (pode-se usar apelidos para as
colunas na lista SELECT).
WITH CHECK OPTION especifica que somente linhas acessíveis à view podem ser inseridas
ou atualizadas.
Restrição é o nome atribuído à restrição CHECK OPTION
WITH READ ONLY assegura que as operações DML não possam ser executadas nesta
view.

CREATE VIEW empvu10


AS SELECT empno, ename, job
FROM emp
WHERE deptno = 10;

ALTER
Usado para alterar objetos (sua estrutura / características) do database ; alguns objetos:
ALTER CLUSTER
ALTER DATABASE
ALTER INDEX
ALTER PACKAGE
ALTER PROCEDURE
ALTER TABLE
ALTER USER
ALTER VIEW

Exemplo para alterar TABLE, incluindo coluna :


ALTER TABLE DEPT ( ADD DEPSALA DECIMAL (10,2) );

DROP
Usado deletar objetos do database ; alguns exemplos de objetos :
DROP CLUSTER
DROP INDEX
DROP PACKAGE
DROP PROCEDURE
DROP TABLE
DROP USER
DROP VIEW

Exemplo para deletar TABLE :

DROP TABLE EMP;

COMMENT

50
Usado para inserir comentários no data dictionary

GRANT
Usado para conceder privilégios de acesso de usuário ao database

Sintaxe:

GRANT <privileges> ON <table name>


TO <grantee> [ { <comma> <grantee> }... ]
[ WITH GRANT OPTION ]

RENAME
Usado para renomear objetos do database

REPLACE
Usado para recriar uma view se ela já existir (substitui uma já existente por uma nova com o
mesmo nome)

Sintaxe:

REPLACE view [(apelido [, apelido ]...)] AS subconsulta


[WITH CHECK OPTION [CONSTRAINT restrição]]
[WITH READ ONLY];

View é o nome da view


Apelido especifica nomes para as expressões selecionadas pela consulta da
view (O número de apelidos deve corresponder ao número de
expressões selecionadas pela view).
Subconsulta é uma instrução SELECT completa
WITH CHECK OPTION especifica que somente linhas acessíveis à view podem ser inseridas
ou atualizadas.
Restrição é o nome atribuído à restrição CHECK OPTION
WITH READ ONLY assegura que as operações DML não possam ser executadas nesta
view.

Exemplo :
REPLACE VIEW EMPVU10R
AS SELECT EMPNO, ENAME, JOB
FROM EMP
WHERE DEPTNO = 10;

51
REVOKE
Usado para revogar privilégios concedidos pelo GRANT

Sintaxe:

REVOKE [ GRANT OPTION FOR ] <privileges> ON <object name>


FROM <grantee> [ { <comma> <grantee> }... ] <drop behavior>

52
6 – Comandos DCL – Rápida visão; Transações de Banco de Dados
Conceito de transação
• Uma transacao começa quando for executada a primeira instrução SQL executável.
• Ela termina com um dos seguintes eventos:
▪ COMMIT ou ROLLBACK é emitida
▪ Instrução DDL (proibido...) ou DCL (COMMIT, SAVEPOINT, ROLLBACK) é executada
(commit automático)
▪ Termina o programa
▪ O sistema cai
• Uma operacao que altere os dados (INSERT, UPDATE, DELETE) na verdade deixa pendente sua
efetivacao , que somente acontece no final da transacao ou no COMMIT

Controle de transação : comandos DCL


COMMIT
Sintaxe : COMMIT
Funcao : Torna permanentes todas as alterações de dados pendentes

SAVEPOINT
Sintaxe : SAVEPOINT nome
Funcao : Marca um ponto de gravação dentro da transação atual, identificando-o com nome

ROLLBACK
Sintaxe : ROLLBACK [TO SAVEPOINT nome]
Funcao :
• ROLLBACK (sem parametros) finaliza a transação atual, NAO EFETIVANDO nenhuma alteraçao
pendente desde o início da transação (primeiro comando SQL do programa ou último COMMIT);
• ROLLBACK TO SAVEPOINT nome finaliza a transação atual, NAO EFETIVANDO nenhuma
alteracao pendente DESDE o SAVEPOINT indicado (somente efetiva as pendentes ATE o
SAVEPOINT)

Inicio da transacao Final da transacao

INSERT UPDATE INSERT DELETE


Chave 15 Chave 11 Chave 16 Chave 12

COMMIT SAVEPOINT A SAVEPOINT B ROLLBACK

53
Se o ROLLBACK for solicitado SEM REFERENCIA ao SAVEPOINT,
serão desfeitos :
INSERT chave 15
UPDATE chave 11
INSERT chave 16
DELETE chave 12
portanto, somente serão efetivadas as operações efetuadas até o COMMIT (que as efetivou)

Se o ROLLBACK for solicitado indicando SAVEPOINT B,


serão desfeitos :
DELETE chave 12
portanto, ficarão efetivadas as operações :
efetuadas ate o COMMIT +
INSERT chave 15 +
UPDATE chave 11 +
INSERT chave 16

Se o ROLLBACK for solicitado indicando SAVEPOINT A,


serão desfeitos :
UPDATE chave 11
INSERT chave 16
DELETE chave 12
portanto, ficarao efetivadas as operações :
efetuadas ate o COMMIT +
INSERT chave 15

Estado dos dados antes de COMMIT ou ROLLBACK


• O Estado anterior dos dados pode ser recuperado
• O usuário atual pode revisar os resultados das operações DML usando a instrução SELECT.
• Outros usuários não poderão ver resultados das instruções DML do usuário atual.
• As linhas afetadas são bloqueadas, outros usuários não poderão alterar os dados dentro das linhas
afetadas.

Estado dos dados após COMMIT


• As alterações nos dados são feitas permanentemente no banco de dados.
• O estado anterior dos dados é perdido permanentemente.
• Todos os usuários podem ver os resultados.
• As linhas afetadas são desbloqueadas, essas linhas estão disponíveis para serem manipuladas por
outros usuários.
• Todos os savepoints são apagados.

54
Estado dos dados após o ROLLBACK
• Descarte todas as alterações pendentes usando a instrução ROLLBACK.
• As alterações nos dados são desfeitas.
• O estado anterior dos dados é restaurado.
• As linhas afetadas são desbloqueadas.

Exemplos

UPDATE EMP
SET DEPTNO = 10
WHERE EMPNO = 7782;

COMMIT;

DELETE FROM TEST;


ROLLBACK;

DELETE FROM TEST


WHERE ID = 100;
SELECT *
FROM TEST
WHERE ID = 100;

COMMIT;

**************************************************************
PROGRAMA.
PERFORM INICIAR.
PERFORM INCLUIR-E-ALTERAR-TABELAS.
PERFORM TERMINAR.
IF WS-RETURN-CODE NOT EQUAL ZERO
GO TO ROLLBECKAR
END-IF.
STOP RUN.
ROLLBECKAR.
DISPLAY 'VAI INICIAR O ROLLBACK'
EXEC SQL
ROLLBACK
END-EXEC
DISPLAY 'ROLLBACK EFETUADO'
MOVE WS-RETURN-CODE TO RETURN-CODE.
STOP RUN.
**************************************************************

55
7 – Comandos DML

SELECT
SELECT - Uso batch em Cobol

• Para efetuar Query (obter dados; obter colunas / linhas das tabelas)
• Se a tabela resultado tiver uma única linha a acessar : SELECT sem cursor
• Se a tabela resultado tiver mais de uma linha a acessar : SELECT com cursor

SEM cursor

❑ Quando for certeza que a tabela resultado tiver uma única linha
❑ Na Procedure Division, colocar o SELECT em linha, no momento necessário.
❑ Sintaxe :
SELECT [ | DISTINCT ou ALL | ]
coluna(s)-resultado
FROM tab_origem
[ WHERE condicao-filtro ]
[ GROUP BY coluna(s) ]
Tem INTO aqui
[ HAVING coluna(s) ]
[ ORDER coluna(s) ]
INTO variável-working-storage
[ OPTIMIZE FOR n ROW ]
[ FETCH FIRST [n] ROW ONLY ]

❑ Exemplo 1 :
...
...
EXEC SQL
INCLUDE SQLCA
END-EXEC
...
PROCEDURE DIVISION.
...
...
EXEC SQL
SELECT COUNT(*) FROM TABCLI INTO :W-QUANTOS
END-EXEC
...
...

❑ Exemplo 2 :
...

DATA DIVISION.
...
WORKING-STORAGE SECTION.
...
56
EXEC SQL INCLUDE SQLCA END-EXEC
...
PROCEDURE DIVISION.
...
...
EXEC SQL
SELECT CD_AGE, NM_AGE
FROM CADAGE
WHERE CD_AGE = 543
INTO :CADAGE.CD-AGE,
:CADAGE.NM-AGE
END-EXEC
EVALUATE SQLCODE
WHEN 0 DISPLAY ‘LINHA LIDA DA TABELA’
WHEN OTHER DISPLAY ‘ERRO NO SELECT’
END-EVALUATE
...
...

57
COM cursor
• Conceitos
❑ Quando um programa faz um SELECT, ele consegue acessar uma única linha por vez da result
table, diferentemente de quando o SELECT é feito de forma interativa ou por meio do DSNTEP2,
quando todas as linhas da result table são disponibilizadas (em arquivo tipo texto ou em relatório /
spool).
❑ CURSOR é um recurso do DB2 que permite acessar uma única linha da tabela resultado de um
SELECT; é usado quando o SELECT retorna mais de uma linha, para acessar linha por linha
sequencialmente (à semelhança de uma arquivo sequencial ; o cursor é como se fosse um “arquivo
sequencial virtual” : cada linha da tabela resultado seria equivalente a um registro lógico.)

❑ Declarar o Cursor na Working-Storage Section (comando SQL DECLARE)


...
WORKING-STORAGE SECTION.
...
EXEC SQL
DECLARE C1 CURSOR FOR
SELECT CD_AGE, NM_AGE
FROM DB2T.ZZA500_CADAGE
ORDER BY NM_AGE
END-EXEC

❑ Comandar OPEN, FETCH e CLOSE do cursor na Procedure Division :


o Para obter as linhas precisa inicialmente abrir (OPEN) o cursor
o Para acessar cada linha da tabela resultado (após o OPEN), dar o comando FETCH : ele
disponibilizará uma linha do cursor para o aplicativo processar
o Após os FETCH’s precisa finalizar com CLOSE do cursor
o Precisa cláusula INTO no FETCH, para indicar em quais variáveis serão colocados os
valores de cada coluna da linha
PROCEDURE DIVISION.
...
EXEC SQL OPEN C1 END-EXEC
EVALUATE SQLCODE
WHEN 0 DISPLAY ‘CURSOR ABERTO OK’
WHEN OTHER DISPLAY ‘ERRO NO OPEN DO CURSOR’
MOVE ‘S’ TO W-FLAG-PARAR
END-EVALUATE
...
EXEC SQL FETCH C1 INTO
:CADAGE.CD-AGE, :CADAGE.NM-AGE,
END-EXEC
EVALUATE SQLCODE
WHEN 0 DISPLAY ‘LINHA LIDA DA TABELA’
WHEN 100 DISPLAY ‘EOF DA TABELA RESULTADO DO SELECT’
MOVE ‘S’ TO W-FLAG-PARAR
WHEN OTHER DISPLAY ‘ERRO NO FETCH’
MOVE ‘S’ TO W-FLAG-PARAR
END-EVALUATE
...

58
EXEC SQL CLOSE C1 END-EXEC
EVALUATE SQLCODE
WHEN 0 DISPLAY ‘CURSOR ABERTO OK’
WHEN OTHER DISPLAY ‘ERRO NO OPEN DO CURSOR’
MOVE ‘S’ TO W-FLAG-PARAR
END-EVALUATE
...

• DECLARE , OPEN, CLOSE, FETCH


DECLARE cursor-name CURSOR [ WITH HOLD ]
FOR select-statement

cursor-name
Indica o nome do cursor (para referência no Open, Fetch e Close).

WITH HOLD
• Indica que os recursos (linhas) devem ficar disponíveis mesmo após o término de uma
transação DB2
• Transações que terminam com COMMIT:
o Cursores que tenham WITH HOLD na definição e que estejam abertos quando for
dado o COMMIT permanecem abertos mesmo depois do COMMIT; ele fica
posicionado na próxima linha a ser acessada
o Após o COMMIT, somente podem ser dados os comandos FETCH e CLOSE para o
cursor
• Transações que terminam com ROLLBACK: todos os cursores abertos são fechados
(não podem ser usados depois do ROLLBACK)

FOR
• Especifica o SELECT que deve ser efetuado para obter uma result table, da qual serão
obtidas as linhas que serão acessadas pelo cursor.

Sintaxe do SELECT declarado no Cursor :


SELECT [ | DISTINCT ou ALL | ]
coluna(s)-resultado
FROM tab_origem
[ WHERE condicao-filtro ]
[ GROUP BY coluna(s) ] Tem INTO aqui
[ HAVING coluna(s) ]
[ ORDER coluna(s) ]
INTO variável-working-storage
[ OPTIMIZE FOR n ROW ]
[ FETCH FIRST [n] ROW ONLY ]

Exemplos :
59
✓ Só DECLARE :

DECLARE C1 CURSOR FOR


SELECT DEPTNO, DEPTNAME, MGRNO
FROM DEPARTMENT
WHERE ADMRDEPT = 'A00';

DECLARE UP_CUR CURSOR FOR


SELECT PROJNO, PRSTDATE, PRENDATE
FROM PROJECT
FOR UPDATE OF PRSTDATE, PRENDATE;

✓ DECLARE + + OPEN + FETCH + CLOSE


...
WORKING-STORAGE SECTION.
...
EXEC SQL
DECLARE C1 CURSOR FOR
SELECT CD_AGE, NM_AGE
FROM DB2T.ZZA500_CADAGE
ORDER BY NM_AGE
END-EXEC
...
...
PROCEDURE DIVISION.
...
...
EXEC SQL OPEN C1 END-EXEC
EVALUATE SQLCODE
WHEN 0 DISPLAY ‘CURSOR ABERTO OK’
WHEN OTHER DISPLAY ‘ERRO NO OPEN DO CURSOR’
MOVE ‘S’ TO W-FLAG-PARAR
END-EVALUATE
...
EXEC SQL FETCH C1 INTO
:CADAGE.CD-AGE, :CADAGE.NM-AGE,
END-EXEC
EVALUATE SQLCODE Loop de leitura
WHEN 0 DISPLAY ‘LINHA LIDA DA TABELA’
WHEN 100 DISPLAY ‘EOF DA TABELA RESULTADO DO SELECT’
MOVE ‘S’ TO W-FLAG-PARAR
WHEN OTHER DISPLAY ‘ERRO NO FETCH’
MOVE ‘S’ TO W-FLAG-PARAR
END-EVALUATE
...
EXEC SQL CLOSE C1 END-EXEC
EVALUATE SQLCODE
WHEN 0 DISPLAY ‘CURSOR ABERTO OK’
WHEN OTHER DISPLAY ‘ERRO NO OPEN DO CURSOR’
MOVE ‘S’ TO W-FLAG-PARAR
END-EVALUATE
...
...

60
OPEN nome_cursor

nome_cursor : indica o nome do cursor (declarado por DECLARE).


CLOSE nome_cursor

nome_cursor : indica o nome do cursor (declarado por DECLARE).

FETCH nome_cursor INTO lista_variáveis_receptoras

nome_cursor : indica o nome do cursor (declarado por DECLARE).

INTO
• Especifica as variáveis dentro das quais será colocado o conteúdo de cada coluna
solicitada no DECLARE
• Deve haver uma variável para cada coluna
• As variáveis devem ser especificadas na mesma ordem em que as colunas foram
especificadas no DECLARE
• As variáveis deve obrigatoriamente ter PIC compatível com os data-types da coluna
• Se a quantidade de variáveis receptoras for menor que a quantidade de colunas, na
variável SQLWARN3 de SQLDA é colocado ‘W’
• Se a quantidade de variáveis receptoras for maior que a quantidade de colunas não é
dado nenhum aviso
• Ao efetuar uma tentativa de obter linha quando todas já foram obtidas, é colocado +100
no SQLCODE e ‘02000’no SQLSTATE ; as variáveis receptoras não são alteradas

Exemplos :

EXEC SQL
DECLARE C1 CURSOR FOR
SELECT DEPTNO, DEPTNAME, MGRNO FROM TDEPT
WHERE ADMRDEPT = 'A00'
END-EXEC
...
EXEC SQL
OPEN C1 END-EXEC
END-EXEC
...
PERFORM UNTIL SQLCODE NOT =0
EXEC SQL
FETCH C1
INTO :DNUM, :DNAME, :MNUM
END-EXEC

61
END-PERFORM
...
EXEC SQL
CLOSE C1
END-EXEC

62
SELECT – uso batch no DSNTEP2

• Para efetuar Query


• Execução batch de uma query SQL : a query é lido via SYSIN e o resultado é impresso na SYSPRINT
• Resultados (tabela resultado) são devolvidos em spool (SYSPRINT; podem ser direcionados para
DSN=......., mas precisariam ser re-formatados para uso estruturado)
• Não tem cláusula INTO
• Em geral usado para desenvolvimento
• Sintaxe :
SELECT [ | DISTINCT | ALL | ]
coluna(s)-resultado
FROM tab_origem
[ WHERE condicao-filtro ] Não tem INTO aqui
[ GROUP BY coluna(s) ] (para SQL batch)
[ HAVING coluna(s) ]
[ ORDER coluna(s) ]
[ OPTIMIZE FOR n ROW ]
[ FETCH FIRST [n] ROW ONLY ]

• Exemplo :
SELECT CD_AGE_SLD, SLD_CLI AS VALOR_DEBITO
FROM DB2T.ZZZ333_SLDNEG;

63
Parâmetros do SELECT (Embedded / Dsntep2)
Importante :

Na especificação de parâmetros que sejam uma lista de elementos (para especificar uma relação de
colunas, por exemplo), deve-se colocar vírgula separando um elemento de outro (mas não colocar vírgula
após o último elemento, antes do próximo parâmetro ou do final do comando). Exemplo :

SELECT COLUNA1 , COLUNA2 , COLUNA3 FROM TABEXEMPLO

DISTINCT ou ALL refere-se a QUAIS LINHAS devem formar a tabela resultado


Indica se é para trazer linhas com conteúdo duplicado (ALL) ou não (DISTINCT)
Se for especificado DISTINCT , quando houver linhas com conteúdo duplicado, somente a primeira é
devolvida (entregue) pelo SELECT.
Se for especificado ALL, o SELECT entrega TODAS as linhas, inclusive as que tiverem dados em
duplicidade.
Se não for especificado nenhum dos dois , assume ALL

Coluna(s)-resultado
• Indica-se o(s) elemento(s) que forma(m) a tabela-resultado. Pode-se especificar :
* (indica TODAS as colunas) ou
nome_coluna [AS nome_temporário] ou
função [AS nome_temporário] ou
expressão [AS nome_temporário]
• Pode-se atribuir nomes (temporários) aos elemento(s) resultado, utilizando a cláusula AS :
SELECT COUNT(*) AS QUANTAS_LINS FROM .......
Neste caso a coluna da tabela resultado que irá ter a informação COUNT(*) terá o
nome de QUANTAS_LINS .
Se não fosse especificada a cláusula AS com o nome QUANTAS_LINS, a referida
coluna não teria nome
SELECT MAX(SALARIO) AS MAIOR_SALARIO FROM ......
SELECT (SALARIO * 1.2) AS COM_REAJUSTE FROM ......

• Se entre os elementos que compõem a tabela-resultado for especificado uma função que faça tratamento
de grupos de linhas , é necessário :
❑ especificar as colunas como coluna(s)-resultado e
❑ especificar a cláusula GROUP BY indicando as mesmas colunas como elementos chave de
agrupamento
• As funções que tratam grupos de linhas (funções agregadas) são :
❑ COUNT(coluna) = retorna o número (quantidade) de colunas que sejam NOT NULL .
COUNT(*) = retorna o número (quantidade) de colunas, sejam NULL ou NOT NULL
❑ MAX(coluna) = retorna o maior valor que a coluna tenha em qualquer de suas linhas
❑ MIN(coluna) = retorna o menor valor que a coluna tenha em qualquer de suas linhas
❑ SUM(coluna) = retorna a somatória de todos os valores que a coluna tenha em todas suas linhas
❑ AVG(coluna) = retorna a média aritmética de todos os valores que a coluna tenha em todas suas linhas

64
FROM tab_origem
• pode-se especificar :
❑ nome de uma tabela
❑ nome de mais de uma tabela
❑ outro SELECT (na verdade é uma result table)

WHERE condição-filtro (de linhas individuais)


• pode-se especificar condicao ou NOT condicao
• pode-se especificar os conectores logicos AND e/ou OR para compor condicoes
• a especificação de uma condição deve ser feita da seguinte forma : dado operador operando
dado = pode-se especificar coluna ou função ou expressão a ser comparada com operando
operador = indica o teste a efetuar; pode ser:
Operador Tipo de comparação Exemplo
IS NULL É nulo CEP IS NULL
= Igual a CEP = '01313001'
<> Não igual a (diferente de) CEP <> '01313001'
CEP < ‘04000000’
< Menor que
AVG(SALDO) < 10000
<= Menor que ou Igual a (Não maior que) IDADE <= 16
>= Maior que ou Igual a (Não menor que) IDADE >= 21
> Maior que SALARIO > 2000
>= Maior que ou Igual a (Não menor que) SALARIO >= 5000
<= Menor que ou Igual a (Não maior que) SALARIO <= 5000
LIKE Contenha o valor indicado NOME LIKE '%SILVA%'
DATANASC < '1969-07-21' OR
OR Conector de condições lógico OU
SALARIO < 16000
DATANASC < '1969-07-21' AND
AND Conector de condições lógico E
SALARIO < 16000
BETWEEN Entre 2 valores (faixa de domínios) IDADE BETWEEN 16 AND 18
IN (X, Y, Z) Igual a algum valor da lista SEXO IN ('M', 'F', 'S', ‘G’)

Operador LIKE ::
LIKE ‘%literal%’ : se o conteúdo tiver a literal em qualquer posição
LIKE ‘literal%’ : se o conteúdo tiver a literal no início (posição 1)
LIKE ‘%literal’ : se o conteúdo tiver a literal no fim (terminar com ela)
LIKE ‘literal_’ : se o conteúdo tiver a literal em qualquer posição, seguida de qualquer caracter
LIKE ‘_literal’ : se o conteúdo tiver a literal em qualquer posição, precedida de qualquer caracter

operando = depende do operador; pode ser:

| NULL | literal | literal com wildcards | literal AND literal | lista |

GROUP BY coluna(s)-agrupamento

65
indica-se a(s) coluna(s) cujas linhas devem ser agrupadas para que do grupo seja extraido um resultado.
Obrigatório se for usada funcão(ões) na(s) coluna(s) resultado. Deve-se especificar os nomes das colunas
(não de função) indicados também na(s) coluna(s) resultado .
Se usada, a cláusula GROUP BY deve seguir a cláusula FROM (e a WHERE, se houver), e deve preceder a
cláusula ORDER BY.
Pode-se, também, agrupar mais de um grupo de colunas.

HAVING condição-filtro (de grupos de linhas)


semelhante ao WHERE, mas aplicado a grupos de linhas (relativos a colunas usadas em funções agregadas)
; as funções agragadas devem ter sido especificadas como coluna(s) resultado.

ORDER coluna(s)-ordenação
Especificar a ordem de classificação.
Pode ser feita através do nome da coluna, ou de um inteiro que indique seu número, ou uma
expressão.
O DB2 ordena primeiro pela primeira chave (coluna) especificada, depois pela segunda, e assim
por diante.
Pode-se especificar ordem ascendente ou descendente. Dados nulos aparecem por ultimo (na
ordem ascendente) ou no início (se a ordem solicitada for descendente).
INTO
Nomes das variáveis onde serão colocados os valores obtidos da tabela.
Especificar na execução do DB2 chamado por programa em linguagem hospedeira.
Não especificar na execução do DB2 sozinho.
OPTIMIZE FOR n ROW
Indica que o DB2 deve efetuar acesso diferenciado aos dados, para, de alguma forma, otimizar o
desempenho. Pode-se especificar : OPTIMIZE FOR n ROWS
A cada n linhas o DB2 libera um bloco com essas n linhas para que possam ser processadas, permitindo
que o aplicativo ganhe controle a cada intervalo de tempo menor do que ganharia caso tivesse que esperar o
fim do acesso a todas as linhas da result table do SELET. Exemplo :
SELECT CODFUNC, NOMEFUNC, SALARIO
FROM TABFUNCS
ORDER BY SALARIO DESC
OPTIMIZE FOR 20 ROWS;

FETCH FIRST [n] ROW ONLY


Indica que deve ser retornado pelo DB2 somente as n primeiras linhas da tabela resultado.
Pode-se especificar :
FETCH FIRST ROW ONLY = traz somente a primeira linha
FETCH FIRST ROWS ONLY = traz somente a primeira linha
FETCH FIRST 1 ROW ONLY = traz somente a primeira linha
FETCH FIRST 1 ROWS ONLY = traz somente a primeira linha
FETCH FIRST n ROW ONLY = traz somente as n primeiras linhas
FETCH FIRST n ROWS ONLY = traz somente as n primeiras linhas
Exemplos :
66
Para obter os 10 maiores salários de uma empresa :
SELECT CODFUNC, NOMEFUNC, SALARIO
FROM TABFUNCS
ORDER BY SALARIO DESC
FETCH FIRST 10 ROWS ONLY;

É equivalente a
SELECT CODFUNC, NOMEFUNC, SALARIO
FROM TABFUNCS A
WHERE 10 > (SELECT COUNT(*)
FROM TABFUNCS B
WHERE A.SALARIO < B.SALARIO
AND B.SALARIO IS NOT NULL)
ORDER BY SALARY DESC;
Mas com FETCH FIRST é bem mais eficiente
Para obter os 5 menores salários de uma empresa :
SELECT CODFUNC, NOMEFUNC, SALARIO
FROM TABFUNCS.EMP
ORDER BY SALARIO
FETCH FIRST 5 ROWS ONLY;

67
Exemplos sintáticos do SELECT

SELECT coluna(s) FROM tab_origem


Devolve : Colunas : as indicadas
Linhas : todas (inclusive as duplicadas)
Ordem : chave primária

SELECT ALL coluna(s) FROM tab_origem


Devolve : idem anterior (ALL refere-se a TODAS as linhas, inclusive as duplicadas)
ou seja : Colunas : as indicadas
Linhas : todas (inclusive as duplicadas)
Ordem : chave primária

SELECT DISTINCT coluna(s) FROM tab_origem


Devolve : Colunas : as indicadas
Linhas : elimina as que tem dados duplicados na(s) coluna(s)
Se tiver mais de uma linha da result table com dados iguais na(s)
coluna(s) resultado, entrega somente a primeira ocorrência
Ordem : chave primária

SELECT * FROM tab_origem


Devolve : Colunas : todas
Linhas : todas (inclusive as duplicadas)
Ordem : chave primária

SELECT ALL * FROM tab_origem


Devolve : idem anterior (ALL refere-se a TODAS as linhas, inclusive as duplicadas)
ou seja : Colunas : todas
Linhas : todas (inclusive as duplicadas)
Ordem : chave primária

SELECT DISTINCT * FROM tab_origem


Devolve : Colunas : todas
Linhas : elimina as que tem dados duplicados na(s) coluna(s)
Se tiver mais de uma linha da result table com dados iguais na(s)
coluna(s) resultado, entrega somente a primeira ocorrência
Ordem : chave primária

SELECT [ | DISTINCT | ALL | ]


{ | * | coluna(s) | }
FROM tab_origem
WHERE condicao-filtro
Devolve : Colunas : conforme solicitado
Linhas : aquelas que satisfizerem a condição-filtro
Ordem : chave primária

68
SELECT [ | DISTINCT | ALL | ]
{ | * | coluna(s) | }
FROM tab_origem
WHERE condicao-filtro
Devolve : Colunas : conforme solicitado
Linhas : aquelas que satisfizerem a condição-filtro
Ordem : chave primária

SELECT [ | DISTINCT | ALL | ]


{ | * | coluna(s) | }
FROM tab_origem
GROUP BY coluna(s)
Devolve : Colunas : conforme solicitado
Linhas : aquelas que satisfizerem a condição-filtro
Ordem : chave primária

SELECT [ | DISTINCT | ALL | ]


{ | * | coluna(s) | }
FROM tab_origem
GROUP BY coluna(s)
WHERE condicao-filtro
Devolve : Colunas : conforme solicitado
Linhas : aquelas que satisfizerem a condição-filtro
Ordem : chave primária

SELECT [ | DISTINCT | ALL | ]


{ | * | coluna(s) | }
FROM tab_origem
GROUP BY coluna(s)
WHERE condicao-filtro
ORDER coluna(s)
Devolve : Colunas : conforme solicitado
Linhas : aquelas que satisfizerem a condição-filtro
Ordem : chave primária

69
Exemplos de uso (sem INTO)

SELECT * FROM TABCLI


Devolve : Colunas : todas da tabela TABCLI
Linhas : todas (inclusive as duplicadas)
Ordem : chave primária

SELECT ALL * FROM TABCLI


Devolve : Colunas : todas da tabela TABCLI
Linhas : todas (inclusive as duplicadas)
Ordem : chave primária

SELECT DISTINCT * FROM TABCLI


Devolve : Colunas : todas da tabela TABCLI
Linhas : as que não tiverem dados duplicados +
a primeira de cada grupo que tenha dados duplicados
Ordem : chave primária

SELECT COD_CLI, NOME_CLI FROM TABCLI


Devolve : Colunas : COD_CLI e NOME_CLI da tabela TABCLI
Linhas : todas (inclusive as duplicadas)
Ordem : chave primária

SELECT ALL COD_CLI, NOME_CLI FROM TABCLI


Devolve : Colunas : COD_CLI e NOME_CLI da tabela TABCLI
Linhas : (inclusive as duplicadas)
Ordem : chave primária

SELECT DISTINCT COD_CLI, NOME_CLI FROM TABCLI


Devolve : Colunas : COD_CLI e NOME_CLI da tabela TABCLI
Linhas : as que não tiverem dados duplicados +
a primeira de cada grupo que tenha dados duplicados
Ordem : chave primária

SELECT JOB, MIN(SALARY), MAX(SALARY) FROM EMPLOYEE GROUP BY JOB


Devolve : Colunas : JOB, valor mínimo de SALARY, valor máximo de SALARY,
da tabela EMPLOYEE
Linhas : TODAS
Ordem : chave primária

70
Exemplos de uso (com INTO)
SELECT TBNAME, NAME, COLTYPE, COLNO +
FROM SYSIBM.SYSCOLUMNS +
WHERE TBNAME = ‘TABCLI’ AND +
COLNO = 1 +
INTO :W-NOMETAB, +
:W-NOMECOL, +
:W-TIPOCOL +
:W-NROCOL
Devolve : Colunas : TBNAME (coloca na variável W-NOMETAB) e
NAME (coloca na variável W-NOMECOL) e
COLTYPE (coloca na variável W-TIPOCOL) e
COLNO (coloca na variável W-NROCOL)
da tabela SYSIBM.SYSCOLUMNS
Linhas : a que tiver TBNAME = ‘TABCLI’ e COLNO = 1

SELECT TBNAME, +
NAME, +
COLNO, +
COLTYPE, +
LENGTH, +
SCALE, +
DEFAULT, +
REMARKS +
FROM SYSIBM.SYSCOLUMNS +
WHERE TBNAME = :CH-TBNAME +
ORDER BY COLNO +
INTO +
:TBNAME-X, +
:NAME-X, +
:COLNO-B, +
:COLTYPE-X, +
:LENGTH-B, +
:SCALE-B, +
:NULLS-X, +
:REMARKS-X

71
Exemplos de Select no DSNTEP2

Função Selecionar
Tabela : DB2T.ZZZ102_SLDCLI
Linhas : Todas
Colunas : Todas
Comando SELECT * FROM DB2T.ZZZ102_SLDCLI;
Resultado
+-------------------------------------------------------------------------------------------------------------+
| CD_AGE_SLD | CD_CLI | NM_CLI | TEL_CLI | VL_SDO_CLI |
+-------------------------------------------------------------------------------------------------------------+
1_| 110 | 920 | MAURO LOPES | 99106925 | 4550.00 |
2_| 110 | 900 | JOSE XAVIER MARQUES | 99106688 | 565.30 |
3_| 80 | 130 | 123 oliveira 4 | 99190011 | 4233.09 |
4_| 40 | 320 | BIA MOREIRA FILHA | 8563212 | 0.00 |
5_| 50 | 130 | VOLTAIRE DA SILVA | 99103607 | 3550.70 |
6_| 40 | 120 | BIA MOREIRA | 8563212 | 0.00 |
+-------------------------------------------------------------------------------------------------------------+
SUCCESSFUL RETRIEVAL OF 6 ROW(S)

Função Selecionar
Tabela : DB2T.ZZZ102_SLDCLI
Linhas : Todas
Colunas : CD_AGE_SLD, CD_CLI
Comando SELECT CD_AGE_SLD, CD_CLI FROM DB2T.ZZZ102_SLDCLI;
Resultado
+---------------------------------+
| CD_AGE_SLD | CD_CLI |
+---------------------------------+
1_| 110 | 920 |
2_| 110 | 900 |
3_| 80 | 130 |
4_| 40 | 320 |
5_| 50 | 130 |
6_| 40 | 120 |
+---------------------------------+
SUCCESSFUL RETRIEVAL OF 6 ROW(S)

Função Selecionar
Tabela : DB2T.ZZZ102_SLDCLI
Linhas : Aquelas cuja coluna CD_CLI tenha 320
Colunas : Todas
Comando SELECT * FROM DB2T.ZZZ102_SLDCLI WHERE CD_CLI = 320;
Resultado
+-------------------------------------------------------------------------------------------------------------+
| CD_AGE_SLD | CD_CLI | NM_CLI | TEL_CLI | VL_SDO_CLI |
+-------------------------------------------------------------------------------------------------------------+
1_| 40 | 320 | BIA MOREIRA FILHA | 8563212 | 0.00 |
+-------------------------------------------------------------------------------------------------------------+
SUCCESSFUL RETRIEVAL OF 1 ROW(S)

Função Selecionar
Tabela : DB2T.ZZZ102_SLDCLI

72
Linhas : Aquelas cuja coluna CD_CLI tenha 320
Colunas : CD_CLI, NM_CLI
Comando
SELECT CD_CLI, NM_CLI FROM DB2T.ZZZ102_SLDCLI WHERE CD_CLI = 320;
Resultado
+------------------------------------------------------+
| CD_CLI | NM_CLI |
+------------------------------------------------------+
1_| 320 | BIA MOREIRA FILHA |
+------------------------------------------------------+
SUCCESSFUL RETRIEVAL OF 1 ROW(S)

Função Selecionar
Tabela : DB2T.ZZZ102_SLDCLI
Linhas : Todas
Colunas : NM_CLI , e a coluna derivada [não existente, sem nome, resultado da aplicação de operação sobre
coluna(s) existentes] resultante da soma entre as colunas VL_SDO_CLI e TEL_CLI
Comando SELECT NM_CLI, (VL_SDO_CLI + TEL_CLI) FROM DB2T.ZZZ102_SLDCLI;
Resultado
+----------------------------------------------------------+
| NM_CLI | |
+----------------------------------------------------------+
1_| MAURO LOPES | 99111475.00 |
2_| JOSE XAVIER MARQUES | 99107253.30 |
3_| 123 oliveira 4 | 99194244.09 |
4_| BIA MOREIRA FILHA | 8563212.00 |
5_| VOLTAIRE DA SILVA | 99107157.70 |
6_| BIA MOREIRA | 8563212.00 |
+----------------------------------------------------------+
SUCCESSFUL RETRIEVAL OF 6 ROW(S)

Função Selecionar
Tabela : DB2T.ZZZ102_SLDCLI
Linhas : Todas (se houver linhas em duplicidade, exibir a primeira e as demais eliminar)
Colunas : CD_CLI
Comando SELECT DISTINCT CD_CLI FROM DB2T.ZZZ102_SLDCLI;
Resultado
+----------------+
| CD_CLI |
+----------------+
1_| 120 |
2_| 130 |
3_| 320 |
4_| 900 |
5_| 920 |
+----------------+
SUCCESSFUL RETRIEVAL OF 5 ROW(S)

73
Função Selecionar
Tabela : DB2T.ZZZ102_SLDCLI
Linhas : Todas (se houver linhas em duplicidade, exibir a primeira e as demais eliminar)
Colunas : CD_AGE_SLD, MINIMO (Coluna derivada resultante da determinação do menor valor existente na
coluna VL_SDO_CLI), sem nome (Coluna derivada resultante da determinação do maior valor existente em
VL_SDO_CLI), MEDIA (Coluna derivada resultante da determinação da média aritmética dos valores existentes
na coluna VL_SDO_CLI)
Observar que CD_AGE_SLD e os mínimo, máximo e média de VL_SDO_CLI devem ser agrupados por
CD_AGE_SLD.
Comando SELECT CD_AGE_SLD, MIN(VL_SDO_CLI) AS MINIMO,
MAX(VL_SDO_CLI), AVG(VL_SDO_CLI) AS MEDIA
FROM DB2T.ZZZ102_SLDCLI
GROUP BY CD_AGE_SLD;
Resultado
+-------------------------------------------------------------------------------+
| CD_AGE_SLD | MINIMO | | MEDIA |
+-------------------------------------------------------------------------------+
1_| 40 | 0.00 | 0.00 | 0.00 |
2_| 50 | 3550.70 | 3550.70 | 3550.70 |
3_| 80 | 4233.09 | 4233.09 | 4233.09 |
4_| 110 | 565.30 | 4550.00 | 2557.65 |
+-------------------------------------------------------------------------------+
SUCCESSFUL RETRIEVAL OF 4 ROW(S)

Função Selecionar
Tabela : DB2T.ZZZ102_SLDCLI
Linhas : Todas , ordenados por nome(NM_CLI)
Colunas : CD_AGE_SLD e NM_CLI
Comando SELECT CD_AGE_SLD, NM_CLI FROM DB2T.ZZZ102_SLDCLI ORDER BY NM_CLI;
Resultado
+------------------------------------------------------+
| CD_AGE_SLD | NM_CLI |
+------------------------------------------------------+
1_| 40 | BIA MOREIRA |
2_| 40 | BIA MOREIRA FILHA |
3_| 110 | JOSE XAVIER MARQUES |
4_| 110 | MAURO LOPES |
5_| 50 | VOLTAIRE DA SILVA |
6_| 80 | 123 oliveira 4 |
+------------------------------------------------------+
SUCCESSFUL RETRIEVAL OF 6 ROW(S)

Função Selecionar
Tabela : DB2T.ZZZ100_CADAGE
Linhas : (a única da tabela resultado)
Colunas : Coluna derivada resultante da determinação de count(*) : quantidade de linhas
Comando SELECT COUNT(*) FROM DB2T.ZZZ100_CADAGE;
Resultado
+----------------+
| |
+----------------+
1_| 33 |
+----------------+
SUCCESSFUL RETRIEVAL OF 1 ROW(S)

74
Função Selecionar
Tabela : DB2T.ZZZ100_CADAGE
Linhas : (a única da tabela resultado)
Colunas : Coluna derivada resultante da determinação de count(distinct NM_AGE) : quantidade de linhas sem
repetição
Comando SELECT COUNT(DISTINCT NM_AGE) FROM DB2T.ZZZ100_CADAGE;
Resultado +----------------+
| |
+----------------+
1_| 29 |
+----------------+
SUCCESSFUL RETRIEVAL OF 1 ROW(S)

Função Selecionar
Tabela : DB2T.ZZZ100_CADAGE
Linhas : (a única da tabela resultado)
Colunas : Coluna derivada resultante da determinação de count(*) where CD_AGE IS NULL : quantidade de
linhas em que CD_AGE é nula.
Comando SELECT COUNT(*) FROM DB2T.ZZZ100_CADAGE WHERE CD_AGE IS NULL;
Resultado +----------------+
| |
+----------------+
1_| 0 |
+----------------+
SUCCESSFUL RETRIEVAL OF 1 ROW(S)

Função Selecionar
Tabela : DB2T.ZZZ100_CADAGE
Linhas : (a única da tabela resultado)
Colunas : Coluna derivada resultante da determinação de count(*) where CD_AGE IS NOT NULL : quantidade
de linhas em que CD_AGE não é nula.
Comando SELECT COUNT(*) FROM DB2T.ZZZ100_CADAGE WHERE CD_AGE IS NOT NULL;
Resultado +----------------+
| |
+----------------+
1_| 29 |
+----------------+
SUCCESSFUL RETRIEVAL OF 1 ROW(S)

Função 1ọ Criar tabela resultado do SELECT CODFUNC FROM FUNCS WHERE DEPTO = ‘VENDAS’ :
Tabela : FUNCS
Linhas : Todas em que a coluna DEPTO tem valor ‘VENDAS’
Colunas : CODFUNC
2ọ Selecionar
Tabela : EMP_ACT
Linhas : todas cuja coluna CODFUNC tenha como valor um código de funcionário que seja um dos que
façam parte da tabela resultado do primeiro SELECT
Colunas : todas
Comando SELECT * FROM EMP_ACT
WHERE CODFUNC IN (SELECT CODFUNC FROM FUNCS WHERE DEPTO = 'VENDAS')
Resultado Tabela resultado com todas as colunas de EMP_ACT e cujas linhas são de funcionários que estejam cadastrados
como sendo do depto de ‘VENDAS’ em FUNCS

75
Função Efetuar Join das tabelas EMP_ACT e EMPLOYEE, selecionando todas as colunas da tabela EMP_ACT, e a
coluna LASTNAME da tabela EMPLOYEE.
Comando SELECT EMP_ACT.*, LASTNAME FROM EMPLOYEE
WHERE EMP_ACT.EMPNO = EMPLOYEE.EMPNO
Resultado Tabela resultado com todas as colunas de EMP_ACT e com a coluna LASTNAME de EMPLOYEE, cujas linhas são
aquelas em que há correspondência entre o codigo do funcionário (EMPNO) nas duas tabelas

Função Efetuar Join das tabelas EMPLOYEE e DEPARTMENT, selecionando EMPNO, LASTNAME e WORKDEPT
na tabela EMPLOYEE e DEPTNO na tabela DEPARTMENT, de todos os funcionários com BIRTHDATE
anterior a 1930.
Comando SELECT EMPNO, LASTNAME, WORKDEPT, DEPTNAME
FROM EMPLOYEE, DEPARTMENT
WHERE WORKDEPT = DEPTNO
AND YEAR(BIRTHDATE) < 1930
Resultado Tabela resultado com 4 colunas e cujas linhas são aquelas em que há correspondência entre o codigo do
departamento nas duas tabelas e em que o ano da data de nascimento do funcionário seja < 1930

Função Efetuar Join das tabelas DB2T.ZZZ101_AGECLI e DB2T.ZZZ100_CADAGE , selecionando codigo de agencia
e nome de agencia.
Comando SELECT CD_AGE_CLI, NM_AGE
FROM DB2T.ZZZ101_AGECLI, DB2T.ZZZ100_CADAGE
WHERE CD_AGE_CLI = CD_AGE;
Ou
SELECT CD_AGE_CLI, NM_AGE
FROM DB2T.ZZZ100_CADAGE, DB2T.ZZZ101_AGECLI
WHERE CD_AGE = CD_AGE_CLI;
Resultado Tabela resultado com agencias e seus respectivos nomes

76
UPDATE
UPDATE - Uso batch no DSNTEP2

• Para efetuar atualização de dados em tabelas


• Atualiza os dados colocando como novo conteúdo o especificado na cláusula SET (literal ou
expressão); pode ser alterado para NULL
• Atualiza os dados nas linhas que satisfizerem a(s) condição(ões) especificada(s) no WHERE
• Se a cláusula WHERE for omitida, serão alteradas TODAS as linhas.
• Se houver algum erro durante a atualização, ela é interrompida, e as colunas já alteradas não são
restauradas.
• Se o update for bem sucedido, é colocado na a variável SQLERRD(3) a quantidade de linhas alteradas.
UPDATE DB2T.ZZZ102_SLDCLI
SET VL_SDO_CLI = 11
WHERE VL_SDO_CLI = 0;

***INPUT STATEMENT:
UPDATE DB2T.ZZZ102_SLDCLI
SET VL_SDO_CLI = 11
WHERE VL_SDO_CLI = 0;
RESULT OF SQL STATEMENT:
DSNT400I SQLCODE = 000, SUCCESSFUL EXECUTION
DSNT416I SQLERRD = 0 0 2 -1 0 0 SQL DIAGNOSTIC INFORMATION
DSNT416I SQLERRD = X'00000000' X'00000000' X'00000002' X'FFFFFFFF'
INFORMATION
SUCCESSFUL UPDATE OF 2 ROW(S)

Se listarmos as linhas após o UPDATE veremos que foram alteradas :


SELECT CD_CLI, VL_SDO_CLI
FROM DB2T.ZZZ102_SLDCLI;

***INPUT STATEMENT:
SELECT CD_CLI, VL_SDO_CLI
FROM DB2T.ZZZ102_SLDCLI;

+-------------------------------------+
| CD_CLI | VL_SDO_CLI |
+-------------------------------------+
1_| 920 | 4550.00 |
2_| 900 | 565.30 |
3_| 130 | 4233.09 |
4_| 320 | 11.00 |
5_| 130 | 3550.70 |
6_| 120 | 11.00 |
+-------------------------------------+
SUCCESSFUL RETRIEVAL OF 6 ROW(S)

77
UPDATE - Uso batch em Cobol

• Para efetuar atualização de dados em tabelas

*-------------------------------------------------------
*
* DECLARACAO ESTRUTURA TABELA EPCV05A1_IND_PPT
*
EXEC SQL
INCLUDE EPCV05A1
END-EXEC.
*
* DECLARACAO ESTRUTURA TABELA EPCV10A1_PPT_CRE
*
EXEC SQL
INCLUDE EPCV10A1
END-EXEC.
*
* DECLARACAO ESTRUTURA TABELA EPCV30A1_BRD_LFI
*
EXEC SQL
INCLUDE EPCV30A1
END-EXEC.
*-------------------------------------------------------
*
* ATUALIZACAO DADOS TABELA EPCV05A1_IND_PPT
*
EXEC SQL
UPDATE EPCV05A1_IND_PPT
SET
CD_STA_PPT_CRE = 'LB'
,IC_GAR_CMP = '3'
,TS_ULT_ATU = CURRENT TIMESTAMP
,CD_USU_ULT_ATU = 'APOIO'
,CD_PGM_MAN = 'EPCBX11'
WHERE NO_APV_PPT_CRE BETWEEN 11111111 AND 22222222
END-EXEC
IF SQLCODE NOT EQUAL ZEROS AND 100
MOVE SQLCODE TO W-COD
DISPLAY 'ERRO UPDATE EPCV05A1_IND_PPT. SQLCODE=' W-COD
END-IF
*
* ATUALIZACAO DADOS TABELA EPCV10A1_PPT_CRE
*
EXEC SQL
UPDATE EPCV10A1_PPT_CRE
SET
CD_STA_PPT_CRE = 'LB',
IC_GAR_CMP = '3',
TS_ULT_ATU = CURRENT TIMESTAMP,
CD_USU_ULT_ATU = 'APOIO',
CD_PGM_MAN = 'EPCBX11'
WHERE NO_APV_PPT_CRE BETWEEN 11111111 AND 22222222
END-EXEC
MOVE SQLCODE TO W-COD
IF SQLCODE NOT EQUAL ZEROS AND 100
DISPLAY 'ERRO UPDATE EPCV10A1_PPT_CRE. SQLCODE=' W-COD
ELSE
78
IF SQLCODE EQUAL 100
DISPLAY 'LINHA NAO ACHADA. SQLCODE=' W-COD
ELSE
DISPLAY 'UPDATE OK'
END-IF
END-IF
*
* ATUALIZACAO DADOS TABELA EPCV30A1_BRD_LFI
*
EXEC SQL
UPDATE EPCV30A1_BRD_LFI
SET
CD_STA_BRD_LIB_FIN = 'LB'
,TS_ULT_ATU = CURRENT TIMESTAMP
,CD_USU_ULT_ATU = 'APOIO'
,CD_PGM_MAN = 'EPCBX11'
WHERE NO_APV_PPT_CRE BETWEEN 11111111 AND 22222222

END-EXEC.
MOVE SQLCODE TO W-COD
IF SQLCODE NOT EQUAL ZEROS AND 100
DISPLAY 'ERRO UPDATE EPCV30A1_BRD_LFI. SQLCODE=' W-COD
ELSE
IF SQLCODE EQUAL 100
DISPLAY 'LINHA NAO ACHADA. SQLCODE=' W-COD
ELSE
DISPLAY 'UPDATE OK'
END-IF
END-IF
*-------------------------------------------------------

79
INSERT

INSERT - Uso batch no DSNTEP2

• Utilizado para inserir linhas numa tabela.


INSERT INTO DB2T.ZZZ100_CADAGE
(CD_AGE, NM_AGE, END_AGE, TEL_AGE)
VALUES (77,'PARI','RUA XX 555',5555678);

PAGE 1
***INPUT STATEMENT:
INSERT INTO DB2T.ZZZ100_CADAGE
(CD_AGE, NM_AGE, END_AGE, TEL_AGE)
VALUES (77,'PARI','RUA XX 555',5555678);
RESULT OF SQL STATEMENT:
DSNT400I SQLCODE = 000, SUCCESSFUL EXECUTION
DSNT416I SQLERRD = 0 0 1 -1 0 0 SQL DIAGNOSTIC INFORMATION
DSNT416I SQLERRD = X'00000000' X'00000000' X'00000001' X'FFFFFFFF'
INFORMATION
SUCCESSFUL INSERT OF 1 ROW(S)

Se listarmos as linhas após o INSERT veremos que foram inseridas :


***INPUT STATEMENT:
SELECT *
FROM DB2T.ZZZ100_CADAGE
WHERE CD_AGE = 77;

+-----------------------------------------------------------------------------------+
| CD_AGE | NM_AGE | END_AGE | TEL_AGE |
+-----------------------------------------------------------------------------------+
1_| 77 | PARI | RUA XX 555 | 5555678 |
+-----------------------------------------------------------------------------------+

SUCCESSFUL RETRIEVAL OF 1 ROW(S)

80
INSERT - Uso batch em Cobol

• Utilizado para inserir linhas numa tabela.


*
* DECLARACAO ESTRUTURA EPCV51A1_LFI_PAT
*
EXEC SQL INCLUDE EPCV51A1 END-EXEC.
*...
PROGRAMA-EPCXB54 SECTION.
PERFORM INICIAR.
PERFORM PROCESSAR.
PERFORM TERMINAR.
IF WS-RETURN-CODE NOT EQUAL ZERO
GO TO ROLLBACKAR
END-IF.
STOP RUN.
ROLLBACKAR.
DISPLAY 'VAI INICIAR O ROLLBACK'
EXEC SQL
ROLLBACK
END-EXEC
DISPLAY 'ROLLBACK EFETUADO'
MOVE WS-RETURN-CODE TO RETURN-CODE.
STOP RUN.
*****************************************************************
...
* --------------------------------------- MOVE DADOS - TABELA 51
MOVE EPCB002-EMPRESA TO CD-EMP OF EPCV51A1
MOVE WS-NO-PPT-CRE TO NO-PPT-CRE OF EPCV51A1
MOVE 7 TO CD-TPO-VIN-PAT OF EPCV51A1
MOVE 1 TO CD-SEQ-TPO-VIN-PAT OF EPCV51A1
MOVE EPCB002-VL-LIBERADO TO VL-LIB-FIN OF EPCV51A1
MOVE SPACES TO CD-CTL-PAT OF EPCV51A1
MOVE WS-TS-TB01 TO TS-INC OF EPCV51A1
MOVE WS-TS-TB01 TO TS-ULT-ATU OF EPCV51A1
MOVE '51' TO WS-QUALTAB.
* -------------------------------------- INCLUI LINHA - TABELA 51
EXEC SQL
INSERT INTO EPCV51A1_LFI_PAT
(CD_EMP,
NO_PPT_CRE,
CD_TPO_VIN_PAT,
CD_SEQ_TPO_VIN_PAT,
VL_LIB_FIN,
CD_CTL_PAT,
TS_INC,
CD_USU_INC,
TS_ULT_ATU,
CD_USU_ULT_ATU,
CD_PGM_MAN)
VALUES
(:EPCV51A1.CD-EMP,
:EPCV51A1.NO-PPT-CRE,
:EPCV51A1.CD-TPO-VIN-PAT,
:EPCV51A1.CD-SEQ-TPO-VIN-PAT,
:EPCV51A1.VL-LIB-FIN,
:EPCV51A1.CD-CTL-PAT,
81
:EPCV51A1.TS-INC,
'MIGRACAO',
:EPCV51A1.TS-ULT-ATU,
'MIGRACAO',
'EPCBX55')
END-EXEC.
*
MOVE SQLCODE TO WS-SQLC
IF SQLCODE EQUAL ZEROS
DISPLAY 'INSERT OK'
ADD 1 TO WS-INCLUIDOS-TAB51
ELSE
MOVE SQLCODE TO WS-RETURN-CODE
IF SQLCODE = -803
DISPLAY 'LINHA JA EXISTIA. SQLCODE=' WS-SQLC
ELSE
DISPLAY 'ERRO NO INSERT. SQLCODE=' WS-SQLC
END-IF

82
DELETE

DELETE - Uso batch no DSNTEP2

• Utilizado para ELIMINAR linhas de uma tabela.

DELETE FROM DB2T.ZZZ100_CADAGE


WHERE CD_AGE = 77’;

***INPUT STATEMENT:
DELETE FROM DB2T.ZZZ100_CADAGE
WHERE CD_AGE = 77;
RESULT OF SQL STATEMENT:
DSNT400I SQLCODE = 000, SUCCESSFUL EXECUTION
DSNT416I SQLERRD = 0 0 1 -1 0 0 SQL DIAGNOSTIC INFORMATION
DSNT416I SQLERRD = X'00000000' X'00000000' X'00000001' X'FFFFFFFF'
INFORMATION
SUCCESSFUL DELETE OF 1 ROW(S)

Se listarmos as linhas após o DELETE veremos que foram deletadas :


***INPUT STATEMENT:
SELECT *
FROM DB2T.ZZZ100_CADAGE
WHERE CD_AGE = 77;
SUCCESSFUL RETRIEVAL OF 0 ROW(S)

83
DELETE - Uso batch em Cobol

Utilizado para ELIMINAR linhas de uma tabela.


*-------------------------------------------------------
*
* DECLARACAO ESTRUTURA TABELA EPCV00A1_RTT_EPC
*
EXEC SQL
INCLUDE EPCV00A1
END-EXEC.
*
* DECLARACAO ESTRUTURA TABELA EPCV01A1_PAM_EPC
*
EXEC SQL
INCLUDE EPCV01A1
END-EXEC.
*-------------------------------------------------------
*
* DELETE DE LINHA(S) TABELA EPCV00A1_RTT_EPC
*
EXEC SQL
DELETE FROM EPCV00A1_RTT_EPC
WHERE CD_RNA_BAT = :CD-RNA-BAT
AND CD_PGM_PCM = :CD-PGM-PCM
END-EXEC.
MOVE SQLCODE TO W-COD
IF SQLCODE EQUAL ZEROS
DISPLAY 'DELETE OK'
ELSE
IF SQLCODE EQUAL 100
DISPLAY 'LINHA NAO ACHADA. SQLCODE=' W-SQLC
ELSE
DISPLAY 'ERRO NO DELETE. SQLCODE=' W-SQLC
END-IF
END-IF
*
* DELETE DE LINHA(S) TABELA EPCV01A1_PAM_EPC
*
EXEC SQL
DELETE FROM EPCV01A1_PAM_EPC
WHERE CD_PAM_SIS_EPC = :EPCV01A1.CD-PAM-SIS-EPC
END-EXEC.
*
EVALUATE SQLCODE
WHEN 0 DISPLAY 'DELETE OK'
WHEN 100 DISPLAY 'LINHA NAO ACHADA. SQLCODE=' W-SQLC
WHEN OTHER DISPLAY 'ERRO NO DELETE. SQLCODE=' W-SQLC
END-EVALUATE

84
WHENEVER

Comando usado para indicar que o programa deseja efetuar tratamento próprio quando ocorrer
determinados tipos de erro.

O comando somente “marca” que o programa deseja efetuar determinado procedimento CASO OCORRA
o(s) erro(s) indicado(s).

A execução efetiva das ações que tratam o(s) erro(s) somente acontece quando ocorrer o(s) erro(s)
indicado(s), se ocorrer.

O comando normalmente é especificado para execução (“marcação”) no início do programa; enquanto ele
não for executado, se ocorrer qualquer erros, o procedimento é o padrão : o DB2 trata.

Uso para “setar” :


WHENEVER { | NOT FOUND | SQLERROR | SQLWARNING | }
{ | CONTINUE | GOTO label | GO TO label | }

{ | NOT FOUND | SQLERROR | SQLWARNING | }


Indica em qual condição o programa deseja assumir controle para tratar :
NOT FOUND
Indica que o programa deseja tratar qualquer condição de SQLCODE = +100 ou
SQLSTATE ='02000' resultante de um comando SQL.
SQLERROR
Indica que o programa deseja tratar qualquer condição de SQLCODE negativo resultante
de um comando SQL.
SQLWARNING
Indica que o programa deseja tratar qualquer condição de SQLWARN0 = 'W' ou de
SQLCODE positivo e ≠ +100 resultante de um comando SQL ou SQLSTATE . dentifies
any condition that results in a warning condition (SQLWARN0 is 'W'), or that results in a
positive SQLCODE other than +100 or in an SQLSTATE = ‘01xxx’
{ | CONTINUE | GOTO label | GO TO label | }
Indica o procedimento a ser efetuado :
CONTINUE
Indica para continuar na instrução seguinte ao comando SQL que gerou a condição (NOT
FOUND ou SQLERROR ou SQLWARNING) : o erro é bypassado (a não ser que as
instruções seguintes testem o SQLCODE).
GO TO label ou
GOTO label
Indica para onde (qual procedure name deve ser efetuado um desvio em caso de ocorrer a
condição (NOT FOUND ou SQLERROR ou SQLWARNING).

85
Exemplos :

EXEC SQL WHENEVER SQLERROR GOTO MEU-TRATAMENTO-DE-ERRO END-EXEC.

Indica para desviar para o procedure name MEU-TRATAMENTO-DE-ERRO se a execução de um


comando SQL subsequente ocasionar um SQLCODE negativo.

EXEC SQL WHENEVER NOT FOUND GOTO NAO-TEM-LINHA END-EXEC.

Indica para desviar para o procedure name NAO-TEM-LINHA se a execução de um comando SQL
subsequente (provavelmente um FETCH) ocasionar um SQLCODE = +100.

86
8 - FUNÇÕES (Built-In)
SINTAXE DESCRIÇÃO / EXEMPLO
ABS(expressao) Retorna o valor absoluto (módulo).
ABS(SALDO)
AVG([DISTINCT] [ALL] expressao) Retorna a média.
AVG(SALARIO)
CEILING(expressao) Retorna o inteiro maior mais proximo do resultado da expressao.
CEILING(3.14) retorna 4
CHAR(|string|coluna| Converte date, time, timestamp, ROWID, valor (floating point,
[,|ISO|USA|EUR|JIS|LOCAL|]) integer, ou decimal) para (string) caracter
CHAR(DATANASC,EUR)
CHAR(DATE(‘2004-11-30’),ISO) retorna ‘2004-11-30’
CHAR(DATE(‘2004-11-30’),USA) retorna ‘11/30/2004’
CHAR(DATE(‘2004-11-30’),EUR) retorna ’30.11.2004’
CHAR(DATE(‘2004-11-30’),JIS) retorna ‘2004:11:30’
CHAR(TIME(‘21.22.23’),ISO) retorna ‘21.22.23’
CHAR(TIME(‘21.22.23’),USA) retorna ‘09.22 PM’
CHAR(TIME(‘21.22.23’),EUR) retorna ‘21.22.23’
CHAR(TIME(‘21.22.23’),JIS) retorna ‘21:22:23’
CONCAT(string1,string2) Concatena 2 strings/colunas. Ex.: CONCAT(TITULO,NOMECLI)
COUNT([DISTINCT] [ALL] expressao/*) Retorna a quantidade (quantas vezes não é nulo).
COUNT(SALARIO)
DATE(string) Retorna a data que consta no string.
DATE(‘2004-11-05’)
DAY(|date|timestamp|) Retorna o dia de uma data ou timestamp
DAY(DATANASC)
DAY(‘DATE(‘2004-11-30’))
DAYOFYEAR(|time|timestamp|string|) Retorna o dia juliano de uma data em um date ou timestamp ou
string (indicando date ou timestamp)
DAYOFYEAR(DATANASC)
DAYOFYEAR(‘DATE(‘2004-11-30’))
DAYOFWEEK(|date|timestamp|) Retorna um número que indica o dia da semana representado na data
informada via date, timestamp ou string (com date ou timestamp)
1=Domingo; 2=Segunda; 3=Terça; 4=Quarta; 5=Quinta; 6=Sexta;
7=Sábado
DAYOFWEEK(DATANASC)
DAYOFWEEK(‘DATE(‘2004-11-30’))
DAYS(|date|timestamp|) Retorna a quantidade de dias transcorridos desde 01/jan/0001 até a
data indicada em date ou timestamp
DAYS(DATANASC)
DAYS(‘DATE(‘2004-11-30’))
EXP(expressao) Retorna expressao ** e
FLOOR(expressao) Retorna o inteiro menor mais proximo do resultado da expressao.
FLOOR(3.14) retorna 3
HEX(coluna) Retorna o conteúdo, em hexadecimal, da coluna especificada. Ex.:
HEX(CD_AGE) = 00000A (Se CD_AGE for 10)
HEX(‘ABC’) = C1C2C3
HOUR(|time|timestamp|) Retorna a hora de um horário em um time ou timestamp
HOUR(TIME(’20.05.00’)) retona 20
LENGTH(|string|coluna|) Retorna os tamanho do string.
LENGTH(NOMECLI)

87
LOCATE(string1,|string2|coluna|) Retorna a posição (ou zero, se não houver) em que string1 está em
string2
LOCATE(‘BER’,’ALBERT’) retorna 3
LOG(expressao) Retorna log neperiano de expressao

LOWER(|string|coluna|) Retorna o string convertido para minúsculo

LTRIM(|string|coluna|) Retorna o string sem brancos à esquerda

MAX([DISTINCT] [ALL] expressao) Retorna o valor máximo.


MAX(SALARIO)
MICROSECOND(|timestamp|string|) Retorna os microsegundos de um horário timestamp ou string
indicando timestamp
MICROSECOND(TIMESTAMP(‘2004-11-05-22.00.00.000003’))
retorna 3
MIN([DISTINCT] [ALL] expressao) Retorna o valor minimo.
MIN(SALARIO)
MINUTE(|time|timestamp|) Retorna os minutos de um horário em um time ou timestamp
MINUTE(TIME(’20.05.00’)) retona 5
MONTH(|date|timestamp|) Retorna o mes dia de uma data ou timestamp
MONTH(DATANASC)
MONTH(‘DATE(‘2004-11-30’))
RAND() Retorna um número aleatório entre 0 e 1
REPEAT(|string|coluna|,vezes) Retorna um string composto de n vezes o string informado
RIGHT(|string|coluna|,qtdd) Retorna os n caracteres mais à direita.
RIGHT(NOMECLI)
RTRIM(|string|coluna|) Retorna o string sem brancos à direita
SECOND(|time|timestamp|) Retorna os segundos de um horário em um time ou timestamp
SECOND(TIMESTAMP(‘2004-11-05-22.00.02.000003’)) retorna 2
SIGN(expressao) Retorna –1, 0 ou 1 (se expressão for negativa, zero ou positiva). Ex.:
SIGN(3.14) retorna 1
SQRT(expressao) Retorna a raiz quadrada .
SQRT(4) retorna 2
SUBSTR(|string|coluna|,pos.ini,tam) Retorna um substring .
SUBSTR(NOMECLI,2,10)
SUM([DISTINCT] [ALL] expressao) Retorna a somatoria.
SUM(SALARIO)
TIME(string) Retorna a hora que consta no string.
TIME(’20.05.00’)
TIMESTAMP(string) Retorna o timestamp que consta no string.
TIMESTAMP(‘2004-11-05-22.00.00.000000’)
UPPER(|string|coluna|) Retorna o string convertido para maiúsculo
WEEK(|date|timestamp|string|) Retorna o número da semana dentro do ano (sendo Domingo o
primeiro dia da semana).
1=primeira semana; 2=Segunda semana e assim por diante
WEEK(DATE(‘2004-11-30’)) retorna 45
WEEK_ISO(|date|timestamp|string|) Retorna o número da semana dentro do ano (sendo Segundda-Feira
o primeiro dia da semana).
1=primeira semana; 2=Segunda semana e assim por diante
WEEK_ISO(DATE(‘2004-11-30’)) retorna 45
YEAR(|date|timestamp|) Retorna o ano de uma data ou timestamp
YEAR(DATANASC)
88
YEAR(‘DATE(‘2004-11-30’))

89
APÊNDICE I - A Relational Model of Data for Large Shared Data Banks - E. F.
Codd

Reprinted from Communications of the ACM, Vol. 13, No.


6, June 1970, pp. 377-387. Copyright © 1970, Association
for Computing Machinery, Inc.

Edgard Frank Codd (1923-2003)

http://portal.acm.org/

http://portal.acm.org/citation.cfm?id=357980.358007&coll=GUIDE&dl=GUIDE&idx=357980&pa
rt=periodical&WantType=periodical&title=Communications%20of%20the%20ACM&CFID=30679851
&CFTOKEN=8548765

Abstract
Future users of large data banks must be protected from having to know how the data is organized in the
machine (the internal representation). A prompting service which supplies such information is not a
satisfactory solution. Activities of users at terminals and most application programs should remain
unaffected when the internal representation of data is changed and even when some aspects of the external
representation are changed. Changes in data representation will often be needed as' a result of changes in
query, update, and report traffic and natural growth in the types of stored information.
Existing non inferential, formatted data systems provide users with tree-structured files or slightly more
general network models of the data. In Section 1, inadequacies of these models are discussed. A model
based on n-ary relations, a normal form for data base relations, and the concept of a universal data sub
language are introduced. In Section 2, certain operations on relations (other than logical inference) are
discussed and applied to the problems of redundancy and consistency in the user's model.
Key Words and Phrases
data bank, data base, data structure, data organization;, hierarchies of data, network of data, relations, derivability,
redundancy, consistency, composition, join, retrieval language, predicate calculus, security, data integrity

90
APÊNDICE II – Comandos SQL

ABORT Aborts the current transaction


ALTER Modifies table properties
BEGIN Begins a transaction in chained mode
CHECKPOINT Force transaction log checkpoint
CLOSE To disable a cursor, releasing the resources it holds.
CLUSTER Gives storage clustering advice to the server
COMMENT Add comment to an object
COMMIT To end the current transaction, making all database change permanent (optionally
frees resources and disconnects from the database)
CONTEXT ALLOCATE To allocate memory for a SQLLIB runtime context.
CONTEXT FREE To free memory for a SQLLIB runtime context.
CONTEXT USE To specify which SQLLIB runtime context to use for subsequent executable SQL
statements when multiple threads are used.
COPY Copies data between files and tables
CREATE Defines a new aggregate function
DECLARE Defines a cursor for table access, associating it with a query
DECLARE DATABASE To declare an identifier for a non-default database to be accessed in subsequent
embedded SQL statements.
DECLARE STATEMENT To assign a SQL variable name to a SQL statement.
DECLARE TABLE To declare the table structure for semantic checking of embedded SQL statements
DELETE To remove rows from a table or from a view's base table.
DESCRIBE To initialize a descriptor, a structure holding host variable descriptions.
DROP Removes the definition of an aggregate function
ENABLE THREADS To initialize a process that supports multiple threads.
END Commits the current transaction
EXECUTE To execute a prepared dynamic SQL statement.
EXECUTE IMMEDIATE To prepare and execute a SQL statement with no host variables.
EXECUTE...END-EXEC To execute an anonymous PL/SQL block.
EXPLAIN Shows statement execution details
FETCH Gets rows using a cursor
FREE To free memory allocated in the object cache
GRANT Grants access privilege to a user, a group or all users
INSERT Inserts new rows into a table or to a view's base table.
LOAD Dynamically loads an object file
LOCK Explicit lock of a table inside a transaction
MOVE Moves cursor position
OBJECT CREATE To create a referenceable object in the cache.
OBJECT DELETE To mark an object as deleted.
OBJECT DEREF To dereference an object.
OBJECT FLUSH To transmit persistent objects to server.
OBJECT GET To convert an object attribute to a C type.
OBJECT RELEASE To "unpin" an object in the cache.
OBJECT SET To update object attributes in the cache.
OBJECT UPDATE To mark an object in the cache as updated.
OPEN To execute the query associated with a cursor.
PREPARE To parse a dynamic SQL statement.

91
REINDEX Recover corrupted system indexes under standalone PostgreSQL
RESET Restores run-time parameters for session to default values
REVOKE Revokes access privilege from a user, a group or all users.
ROLLBACK To end the current transaction, discard all changes in the current transaction, and
release all locks (optionally release resources and disconnect from the database).
SAVEPOINT To identify a point in a transaction to which you can later roll back.
SELECT To retrieve data from one or more tables, views, or snapshots, assigning the selected
values to host variables.
SET Set run-time parameters for session
SHOW Shows run-time parameters for session
TRUNCATE Empty a table
UPDATE To change existing values in a table or in a view's base table.
WHENEVER To specify handling for error and warning conditions.

92
APÊNDICE III – Programas Exemplo

Completo (Fontes + Saídas)

***********************************************************************************************************************
***********************************************************************************************************************
** *
** TTTTTTTTTTTT AAAAAAAAAA BBBBBBBBBBB TTTTTTTTTTTT RRRRRRRRRRR 9999999999 ZZZZZZZZZZZZ 9999999999 *
** TTTTTTTTTTTT AAAAAAAAAAAA BBBBBBBBBBBB TTTTTTTTTTTT RRRRRRRRRRRR 999999999999 ZZZZZZZZZZZZ 999999999999 *
** TT AA AA BB BB TT RR RR 99 99 ZZ 99 99 *
** TT AA AA BB BB TT RR RR 99 99 ZZ 99 99 *
** TT AA AA BB BB TT RR RR 99 99 ZZ 99 99 *
** TT AAAAAAAAAAAA BBBBBBBBBB TT RRRRRRRRRRRR 999999999999 ZZ 999999999999 *
** TT AAAAAAAAAAAA BBBBBBBBBB TT RRRRRRRRRRR 999999999999 ZZ 999999999999 *
** TT AA AA BB BB TT RR RR 99 ZZ 99 *
** TT AA AA BB BB TT RR RR 99 ZZ 99 *
** TT AA AA BB BB TT RR RR 99 99 ZZ 99 99 *
** TT AA AA BBBBBBBBBBBB TT RR RR 999999999999 ZZZZZZZZZZZ 999999999999 *
** TT AA AA BBBBBBBBBBB TT RR RR 9999999999 ZZZZZZZZZZZZ 9999999999 *
** *
***********************************************************************************************************************
***********************************************************************************************************************

*********************************************
*********************************************
** ******** UPDATE ******** **
** **
** USER ID......... TORI276 **
** DATE............ 12NOV04 14:29 **
** ENDEVOR RC...... 0012 **
** **
** ENVIRONMENT..... DESENV **
** STAGE........... DSV **
** SYSTEM.......... TAB **
** SUBSYSTEM....... TAB **
** ELEMENT......... TABTR9Z9 **
** VV.LL........... 01.01 **
** TYPE............ COBPBD **
** PROC GROUP...... COBPBD **
** PROCESSOR....... GCOBPBD **
** CONWRITE...... RC=0000 **
** ALLOCLST...... RC=0000 **
** PRE........... RC=0000 **
** COMP.......... RC=0000 **
** LKED.......... RC=0000 **
** CPYLOAD....... RC=0000 **
** MNTBND........ RC=0000 **
** **BINDD......... RC=0008 > MAXRC **
** SAVLST........ RC=0000 **
** **
*********************************************
*********************************************
DB2 SQL PRECOMPILER VERSION 7 REL. 1.0 PAGE 1
OPTIONS SPECIFIED: HOST(COB2),APOST,SOURCE
OPTIONS USED - SPECIFIED OR DEFAULTED
APOST
APOSTSQL
ATTACH(TSO)
CONNECT(2)
DEC(15)
FLAG(I)
HOST(COB2)
NOT KATAKANA
LINECOUNT(60)
MARGINS(8,72)
ONEPASS
OPTIONS
PERIOD
SOURCE
STDSQL(NO)
SQL(DB2)
NOXREF

93
DB2 SQL PRECOMPILER VERSION 7 REL. 1.0 PAGE 2
1 ID DIVISION. 00002002
2 PROGRAM-ID. TABTR9Z9. 00003002
3 ENVIRONMENT DIVISION. 00038000
4 CONFIGURATION SECTION. 00039000
5 SPECIAL-NAMES. DECIMAL-POINT IS COMMA.
6 INPUT-OUTPUT SECTION. 00046000
7 FILE-CONTROL.
8 DATA DIVISION. 00066000
9 FILE SECTION.
10 WORKING-STORAGE SECTION. 00095000
11 *---------------------------------------------------------------*
12 * AREA DB2
13 *---------------------------------------------------------------*
14 *
15 01 FILLER PIC X(32) VALUE 'SQLCA'.
16
17 EXEC SQL
18 INCLUDE SQLCA
19 END-EXEC.
20
21 01 FIM-CURSOR PIC X(1) VALUE 'N'.
22
23 01 WS-CADAGE.
24 05 CD-AGE PIC S9(09) COMP.
25 05 NM-AGE PIC X(15).
26 05 END-AGE PIC X(30).
27 05 TEL-AGE PIC S9(09) COMP.
28
29 01 WS-AGECLI.
30 05 CD-AGE-CLI PIC S9(09) COMP.
31 05 CD-CLI PIC S9(09) COMP.
32 05 TP-CLI PIC S9(09) COMP.
33 05 NM-CLI PIC X(35).
34 05 END-CLI PIC X(35).
35 05 COMPL-CLI PIC X(30).
36 05 CID-CLI PIC X(30).
37 05 UF-CLI PIC X(02).
38 05 CEP-CLI PIC S9(09) COMP.
39 05 CMCEP-CLI PIC S9(09) COMP.
40 05 TEL-CLI PIC S9(09) COMP.
41 05 RG-CLI PIC S9(09) COMP.
42 05 CPF-CGC-CLI PIC S9(09) COMP.
43 05 DT-INCL-CLI PIC X(10).
44 05 DT-EXCL-CLI PIC X(10).
45 05 VL-SDO-CLI PIC S9(05)V9(02) COMP-3.
46
47 01 WS-SLDCLI.
48 05 CD-AGE-SLD PIC S9(09) COMP.
49 05 CD-CLI PIC S9(09) COMP.
50 05 NM-CLI PIC X(35).
51 05 TEL-CLI PIC S9(09) COMP.
52 05 VL-SDO-CLI PIC S9(05)V9(02) COMP-3.
53
54 *****************************************************************
55 * AREA DB2
56 *****************************************************************
57
58 EXEC SQL DECLARE C01 CURSOR FOR
DB2 SQL PRECOMPILER VERSION 7 REL. 1.0 PAGE 3
59 SELECT CD_AGE_SLD,
60 CD_CLI,
61 NM_CLI,
62 TEL_CLI,
63 VL_SDO_CLI
64 FROM DB2T.ZZB302_SLDCLI
65 WHERE VL_SDO_CLI > :WS-SLDCLI.VL-SDO-CLI
66 END-EXEC
67 *
68 *---------------------------------------------------------------*
69 PROCEDURE DIVISION. 00479000
70 *---------------------------------------------------------------*
71
72 *---------------------------------------------------------------*
73 001-INICIO SECTION.
74 *---------------------------------------------------------------*

94
75 PERFORM 002-INICIALIZAR.
76 PERFORM 003-PROCESSAR.
77 PERFORM 999-FINALIZAR.
78 STOP RUN.
79
80 *---------------------------------------------------------------*
81 002-INICIALIZAR SECTION.
82 *---------------------------------------------------------------*
83 MOVE 1 TO VL-SDO-CLI OF WS-SLDCLI.
84 EXEC SQL OPEN C01 END-EXEC.
85 IF SQLCODE NOT EQUAL ZEROS
86 DISPLAY 'ERRO NO OPEN CURSOR'
87 STOP RUN
88 END-IF
89 CONTINUE.
90 002-FIM. EXIT.
91
92 *---------------------------------------------------------------*
93 003-PROCESSAR SECTION.
94 *---------------------------------------------------------------*
95
96 MOVE 'N' TO FIM-CURSOR.
97 PERFORM UNTIL FIM-CURSOR = 'S'
98 EXEC SQL FETCH C01
99 INTO :WS-SLDCLI.CD-AGE-SLD,
100 :WS-SLDCLI.CD-CLI,
101 :WS-SLDCLI.NM-CLI,
102 :WS-SLDCLI.TEL-CLI,
103 :WS-SLDCLI.VL-SDO-CLI
104 END-EXEC
105 IF SQLCODE NOT EQUAL ZEROS
106 MOVE 'S' TO FIM-CURSOR
107 ELSE
108 DISPLAY 'FETCH OK'
109 DISPLAY WS-SLDCLI
110 END-IF
111 END-PERFORM
112 CONTINUE.
113 003-FIM. EXIT.
114
115 *---------------------------------------------------------------*
116 999-FINALIZAR SECTION.
DB2 SQL PRECOMPILER VERSION 7 REL. 1.0 PAGE 4
117 *---------------------------------------------------------------*
118
119 DISPLAY 'FIM NORMAL'.
120
121 999-FIM. EXIT.
DB2 SQL PRECOMPILER MESSAGES PAGE 5
DSNH050I I DSNHMAIN WARNINGS HAVE BEEN SUPPRESSED DUE TO LACK OF TABLE DECLARATIONS
DB2 SQL PRECOMPILER STATISTICS PAGE 6
SOURCE STATISTICS
SOURCE LINES READ: 121
NUMBER OF SYMBOLS: 38
SYMBOL TABLE BYTES EXCLUDING ATTRIBUTES: 3216
THERE WERE 1 MESSAGES FOR THIS PROGRAM.
THERE WERE 0 MESSAGES SUPPRESSED BY THE FLAG OPTION.
157248 BYTES OF STORAGE WERE USED BY THE PRECOMPILER.
RETURN CODE IS 0
PP 5688-197 IBM COBOL for MVS & VM 1.2.2 Date 11/12/2004 Time 14:30:35 Page 1
Invocation parameters:
LIB,OBJECT,NOADV,APOST,OFFSET
Options in effect:
NOADATA
NOADV
NOANALYZE
APOST
NOAWO
BUFSIZE(4096)
NOCMPR2
NOCOMPILE(S)
NOCURRENCY
DATA(31)
NODATEPROC
NODBCS
NODECK

95
NODUMP
NODYNAM
NOEXIT
NOFASTSRT
FLAG(I)
NOFLAGMIG
NOFLAGSTD
NOIDLGEN
INTDATE(ANSI)
LANGUAGE(EN)
LIB
LINECOUNT(60)
NOLIST
NOMAP
NONAME
NONUMBER
NUMPROC(NOPFD)
OBJECT
OFFSET
NOOPTIMIZE
OUTDD(SYSOUT)
PGMNAME(COMPAT)
NORENT
RMODE(AUTO)
SEQUENCE
SIZE(MAX)
SOURCE
SPACE(1)
NOSSRANGE
NOTERM
NOTEST
TRUNC(STD)
NOTYPECHK
NOVBREF
NOWORD
NOXREF
YEARWINDOW(1900)
ZWB
PP 5688-197 IBM COBOL for MVS & VM 1.2.2 TABTR9Z9 Date 11/12/2004 Time 14:30:35 Page 2
LineID PL SL ----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7-]--+----8 Map and Cross Referen
000001 ID DIVISION. 00002002
000002 PROGRAM-ID. TABTR9Z9. 00003002
000003 ENVIRONMENT DIVISION. 00038000
000004 CONFIGURATION SECTION. 00039000
000005 SPECIAL-NAMES. DECIMAL-POINT IS COMMA.
000006 INPUT-OUTPUT SECTION. 00046000
000007 FILE-CONTROL.
000008 DATA DIVISION. 00066000
000009 FILE SECTION.
000010 WORKING-STORAGE SECTION. 00095000
000011 *---------------------------------------------------------------*
000012 * AREA DB2
000013 *---------------------------------------------------------------*
000014 *
000015 01 FILLER PIC X(32) VALUE 'SQLCA'.
000016
000017 *****EXEC SQL
000018 ***** INCLUDE SQLCA
000019 *****END-EXEC.
000020 01 SQLCA.
000021 05 SQLCAID PIC X(8).
000022 05 SQLCABC PIC S9(9) COMP-4.
000023 05 SQLCODE PIC S9(9) COMP-4.
000024 05 SQLERRM.
000025 49 SQLERRML PIC S9(4) COMP-4.
000026 49 SQLERRMC PIC X(70).
000027 05 SQLERRP PIC X(8).
000028 05 SQLERRD OCCURS 6 TIMES
000029 PIC S9(9) COMP-4.
000030 05 SQLWARN.
000031 10 SQLWARN0 PIC X.
000032 10 SQLWARN1 PIC X.
000033 10 SQLWARN2 PIC X.
000034 10 SQLWARN3 PIC X.
000035 10 SQLWARN4 PIC X.
000036 10 SQLWARN5 PIC X.

96
000037 10 SQLWARN6 PIC X.
000038 10 SQLWARN7 PIC X.
000039 05 SQLEXT.
000040 10 SQLWARN8 PIC X.
000041 10 SQLWARN9 PIC X.
000042 10 SQLWARNA PIC X.
000043 10 SQLSTATE PIC X(5).
000044
000045 01 FIM-CURSOR PIC X(1) VALUE 'N'.
000046
000047 01 WS-CADAGE.
000048 05 CD-AGE PIC S9(09) COMP.
000049 05 NM-AGE PIC X(15).
000050 05 END-AGE PIC X(30).
000051 05 TEL-AGE PIC S9(09) COMP.
000052
000053 01 WS-AGECLI.
000054 05 CD-AGE-CLI PIC S9(09) COMP.
000055 05 CD-CLI PIC S9(09) COMP.
000056 05 TP-CLI PIC S9(09) COMP.
000057 05 NM-CLI PIC X(35).
PP 5688-197 IBM COBOL for MVS & VM 1.2.2 TABTR9Z9 Date 11/12/2004 Time 14:30:35 Page 3
LineID PL SL ----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7-]--+----8 Map and Cross Referen
000058 05 END-CLI PIC X(35).
000059 05 COMPL-CLI PIC X(30).
000060 05 CID-CLI PIC X(30).
000061 05 UF-CLI PIC X(02).
000062 05 CEP-CLI PIC S9(09) COMP.
000063 05 CMCEP-CLI PIC S9(09) COMP.
000064 05 TEL-CLI PIC S9(09) COMP.
000065 05 RG-CLI PIC S9(09) COMP.
000066 05 CPF-CGC-CLI PIC S9(09) COMP.
000067 05 DT-INCL-CLI PIC X(10).
000068 05 DT-EXCL-CLI PIC X(10).
000069 05 VL-SDO-CLI PIC S9(05)V9(02) COMP-3.
000070
000071 01 WS-SLDCLI.
000072 05 CD-AGE-SLD PIC S9(09) COMP.
000073 05 CD-CLI PIC S9(09) COMP.
000074 05 NM-CLI PIC X(35).
000075 05 TEL-CLI PIC S9(09) COMP.
000076 05 VL-SDO-CLI PIC S9(05)V9(02) COMP-3.
000077
000078 *****************************************************************
000079 * AREA DB2
000080 *****************************************************************
000081
000082 *****EXEC SQL DECLARE C01 CURSOR FOR
000083 ***** SELECT CD_AGE_SLD,
000084 ***** CD_CLI,
000085 ***** NM_CLI,
000086 ***** TEL_CLI,
000087 ***** VL_SDO_CLI
000088 ***** FROM DB2T.ZZB302_SLDCLI
000089 ***** WHERE VL_SDO_CLI > :WS-SLDCLI.VL-SDO-CLI
000090 *****END-EXEC
000091 *
000092 *---------------------------------------------------------------*
000093 77 SQL-TEMP PIC X(18).
000094 77 DSN-TEMP PIC S9(9) COMP-4.
000095 77 DSN-TMP2 PIC S9(18) COMP-3.
000096 77 SQL-NULL PIC S9(9) COMP-4 VALUE +0.
000097 77 SQL-INIT-FLAG PIC S9(4) COMP-4 VALUE +0.
000098 88 SQL-INIT-DONE VALUE +1.
000099 01 SQL-PLIST2.
000100 05 SQL-PLIST-CON PIC S9(9) COMP-4 VALUE +2637824.
000101 05 SQL-CALLTYPE PIC S9(4) COMP-4 VALUE +50.
000102 05 SQL-PROG-NAME PIC X(8) VALUE 'TABTR9Z9'.
000103 05 SQL-TIMESTAMP-1 PIC S9(9) COMP-4 VALUE +394493939.
000104 05 SQL-TIMESTAMP-2 PIC S9(9) COMP-4 VALUE +476459224.
000105 05 SQL-SECTION PIC S9(4) COMP-4 VALUE +1.
000106 05 SQL-CODEPTR PIC S9(9) COMP-4.
000107 05 SQL-VPARMPTR PIC S9(9) COMP-4 VALUE +0.
000108 05 SQL-APARMPTR PIC S9(9) COMP-4 VALUE +0.
000109 05 SQL-STMT-NUM PIC S9(4) COMP-4 VALUE +84.
000110 05 SQL-STMT-TYPE PIC S9(4) COMP-4 VALUE +3.

97
000111 05 SQL-PVAR-LIST2.
000112 10 PRE-SQLDAID PIC X(8) VALUE 'SQLDA —'.
000113 10 PRE-SQLDABC PIC S9(9) COMP-4 VALUE +60.
000114 10 PRE-SQLN PIC S9(4) COMP-4 VALUE +1.
PP 5688-197 IBM COBOL for MVS & VM 1.2.2 TABTR9Z9 Date 11/12/2004 Time 14:30:35 Page 4
LineID PL SL ----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7-]--+----8 Map and Cross Referen
000115 10 PRE-SQLLD PIC S9(4) COMP-4 VALUE +1.
000116 10 PRE-SQLVAR.
000117 12 SQLVAR-BASE1.
000118 15 SQL-PVAR-TYPE1 PIC S9(4) COMP-4 VALUE +484.
000119 15 SQL-PVAR-LEN1 PIC S9(4) COMP-4 VALUE +1794.
000120 15 SQL-PVAR-ADDRS1.
000121 20 SQL-PVAR-ADDR1 PIC S9(9) COMP-4.
000122 20 SQL-PVAR-IND1 PIC S9(9) COMP-4.
000123 15 SQL-PVAR-NAME1.
000124 20 SQL-PVAR-NAMEL1 PIC S9(4) COMP-4 VALUE +0.
000125 20 SQL-PVAR-NAMEC1 PIC X(30) VALUE ' '.
000126 01 SQL-PLIST3.
000127 05 SQL-PLIST-CON PIC S9(9) COMP-4 VALUE +2622464.
000128 05 SQL-CALLTYPE PIC S9(4) COMP-4 VALUE +30.
000129 05 SQL-PROG-NAME PIC X(8) VALUE 'TABTR9Z9'.
000130 05 SQL-TIMESTAMP-1 PIC S9(9) COMP-4 VALUE +394493939.
000131 05 SQL-TIMESTAMP-2 PIC S9(9) COMP-4 VALUE +476459224.
000132 05 SQL-SECTION PIC S9(4) COMP-4 VALUE +1.
000133 05 SQL-CODEPTR PIC S9(9) COMP-4.
000134 05 SQL-VPARMPTR PIC S9(9) COMP-4 VALUE +0.
000135 05 SQL-APARMPTR PIC S9(9) COMP-4 VALUE +0.
000136 05 SQL-STMT-NUM PIC S9(4) COMP-4 VALUE +98.
000137 05 SQL-STMT-TYPE PIC S9(4) COMP-4 VALUE +4.
000138 05 SQL-AVAR-LIST3.
000139 10 PRE-SQLDAID PIC X(8) VALUE 'SQLDA —'.
000140 10 PRE-SQLDABC PIC S9(9) COMP-4 VALUE +236.
000141 10 PRE-SQLN PIC S9(4) COMP-4 VALUE +5.
000142 10 PRE-SQLLD PIC S9(4) COMP-4 VALUE +5.
000143 10 PRE-SQLVAR.
000144 12 SQLVAR-BASE1.
000145 15 SQL-AVAR-TYPE1 PIC S9(4) COMP-4 VALUE +496.
000146 15 SQL-AVAR-LEN1 PIC S9(4) COMP-4 VALUE +4.
000147 15 SQL-AVAR-ADDRS1.
000148 20 SQL-AVAR-ADDR1 PIC S9(9) COMP-4.
000149 20 SQL-AVAR-IND1 PIC S9(9) COMP-4.
000150 15 SQL-AVAR-NAME1.
000151 20 SQL-AVAR-NAMEL1 PIC S9(4) COMP-4 VALUE +0.
000152 20 SQL-AVAR-NAMEC1 PIC X(30) VALUE ' '.
000153 12 SQLVAR-BASE2.
000154 15 SQL-AVAR-TYPE2 PIC S9(4) COMP-4 VALUE +496.
000155 15 SQL-AVAR-LEN2 PIC S9(4) COMP-4 VALUE +4.
000156 15 SQL-AVAR-ADDRS2.
000157 20 SQL-AVAR-ADDR2 PIC S9(9) COMP-4.
000158 20 SQL-AVAR-IND2 PIC S9(9) COMP-4.
000159 15 SQL-AVAR-NAME2.
000160 20 SQL-AVAR-NAMEL2 PIC S9(4) COMP-4 VALUE +0.
000161 20 SQL-AVAR-NAMEC2 PIC X(30) VALUE ' '.
000162 12 SQLVAR-BASE3.
000163 15 SQL-AVAR-TYPE3 PIC S9(4) COMP-4 VALUE +452.
000164 15 SQL-AVAR-LEN3 PIC S9(4) COMP-4 VALUE +35.
000165 15 SQL-AVAR-ADDRS3.
000166 20 SQL-AVAR-ADDR3 PIC S9(9) COMP-4.
000167 20 SQL-AVAR-IND3 PIC S9(9) COMP-4.
000168 15 SQL-AVAR-NAME3.
000169 20 SQL-AVAR-NAMEL3 PIC S9(4) COMP-4 VALUE +0.
000170 20 SQL-AVAR-NAMEC3 PIC X(30) VALUE ' '.
000171 12 SQLVAR-BASE4.
PP 5688-197 IBM COBOL for MVS & VM 1.2.2 TABTR9Z9 Date 11/12/2004 Time 14:30:35 Page 5
LineID PL SL ----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7-]--+----8 Map and Cross Referen
000172 15 SQL-AVAR-TYPE4 PIC S9(4) COMP-4 VALUE +496.
000173 15 SQL-AVAR-LEN4 PIC S9(4) COMP-4 VALUE +4.
000174 15 SQL-AVAR-ADDRS4.
000175 20 SQL-AVAR-ADDR4 PIC S9(9) COMP-4.
000176 20 SQL-AVAR-IND4 PIC S9(9) COMP-4.
000177 15 SQL-AVAR-NAME4.
000178 20 SQL-AVAR-NAMEL4 PIC S9(4) COMP-4 VALUE +0.
000179 20 SQL-AVAR-NAMEC4 PIC X(30) VALUE ' '.
000180 12 SQLVAR-BASE5.
000181 15 SQL-AVAR-TYPE5 PIC S9(4) COMP-4 VALUE +484.
000182 15 SQL-AVAR-LEN5 PIC S9(4) COMP-4 VALUE +1794.

98
000183 15 SQL-AVAR-ADDRS5.
000184 20 SQL-AVAR-ADDR5 PIC S9(9) COMP-4.
000185 20 SQL-AVAR-IND5 PIC S9(9) COMP-4.
000186 15 SQL-AVAR-NAME5.
000187 20 SQL-AVAR-NAMEL5 PIC S9(4) COMP-4 VALUE +0.
000188 20 SQL-AVAR-NAMEC5 PIC X(30) VALUE ' '.
000189
000190 PROCEDURE DIVISION. 00479000
000191 *---------------------------------------------------------------*
000192
000193 *---------------------------------------------------------------*
000194 DSNSQL SECTION.
000195 SQL-SKIP.
000196 GO TO SQL-INIT-END.
000197 SQL-INITIAL.
000198 MOVE 1 TO SQL-INIT-FLAG.
000199 CALL 'DSNHADDR' USING SQL-VPARMPTR OF SQL-PLIST2 SQL-PVAR-LIS
000200 - T2.
000201 CALL 'DSNHADD2' USING SQL-PVAR-ADDRS1 IN
000202 SQL-PVAR-LIST2 VL-SDO-CLI OF WS-SLDCLI SQL-NULL
000203 CALL 'DSNHADDR' USING SQL-CODEPTR OF SQL-PLIST2 SQLCA.
000204 CALL 'DSNHADDR' USING SQL-APARMPTR OF SQL-PLIST3 SQL-AVAR-LIS
000205 - T3.
000206 CALL 'DSNHADD2' USING SQL-AVAR-ADDRS1 IN
000207 SQL-AVAR-LIST3 CD-AGE-SLD OF WS-SLDCLI SQL-NULL CD-CLI OF WS-
000208 - SLDCLI SQL-NULL NM-CLI OF WS-SLDCLI SQL-NULL TEL-CLI OF WS-SL
000209 - DCLI SQL-NULL VL-SDO-CLI OF WS-SLDCLI SQL-NULL.
000210 CALL 'DSNHADDR' USING SQL-CODEPTR OF SQL-PLIST3 SQLCA.
000211 SQL-INIT-END.
000212 CONTINUE.
000213
000214 001-INICIO SECTION.
000215 *---------------------------------------------------------------*
000216 PERFORM 002-INICIALIZAR.
000217 PERFORM 003-PROCESSAR.
000218 PERFORM 999-FINALIZAR.
000219 STOP RUN.
000220
000221 *---------------------------------------------------------------*
000222 002-INICIALIZAR SECTION.
000223 *---------------------------------------------------------------*
000224 MOVE 1 TO VL-SDO-CLI OF WS-SLDCLI.
000225 *****EXEC SQL OPEN C01 END-EXEC.
000226 PERFORM SQL-INITIAL UNTIL SQL-INIT-DONE
000227 CALL 'DSNHLI' USING SQL-PLIST2.
000228 IF SQLCODE NOT EQUAL ZEROS
PP 5688-197 IBM COBOL for MVS & VM 1.2.2 TABTR9Z9 Date 11/12/2004 Time 14:30:35 Page 6
LineID PL SL ----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7-]--+----8 Map and Cross Referen
000229 1 DISPLAY 'ERRO NO OPEN CURSOR'
000230 1 STOP RUN
000231 END-IF
000232 CONTINUE.
000233 002-FIM. EXIT.
000234
000235 *---------------------------------------------------------------*
000236 003-PROCESSAR SECTION.
000237 *---------------------------------------------------------------*
000238
000239 MOVE 'N' TO FIM-CURSOR.
000240 PERFORM UNTIL FIM-CURSOR = 'S'
000241 ***** EXEC SQL FETCH C01
000242 ***** INTO :WS-SLDCLI.CD-AGE-SLD,
000243 ***** :WS-SLDCLI.CD-CLI,
000244 ***** :WS-SLDCLI.NM-CLI,
000245 ***** :WS-SLDCLI.TEL-CLI,
000246 ***** :WS-SLDCLI.VL-SDO-CLI
000247 ***** END-EXEC
000248 1 PERFORM SQL-INITIAL UNTIL SQL-INIT-DONE
000249 1 CALL 'DSNHLI' USING SQL-PLIST3
000250 1 IF SQLCODE NOT EQUAL ZEROS
000251 2 MOVE 'S' TO FIM-CURSOR
000252 1 ELSE
000253 2 DISPLAY 'FETCH OK'
000254 2 DISPLAY WS-SLDCLI
000255 1 END-IF
000256 END-PERFORM

99
000257 CONTINUE.
000258 003-FIM. EXIT.
000259
000260 *---------------------------------------------------------------*
000261 999-FINALIZAR SECTION.
000262 *---------------------------------------------------------------*
000263
000264 DISPLAY 'FIM NORMAL'.
000265
000266 999-FIM. EXIT.
PP 5688-197 IBM COBOL for MVS & VM 1.2.2 TABTR9Z9 Date 11/12/2004 Time 14:30:35 Page 7
PROGRAM GLOBAL TABLE BEGINS AT LOCATION 0000FC FOR 00000C BYTES
THE PGT CONTAINS 000001 CELL(S) FOR ADDRESSABILITY TO THE CGT
PBL1 AT LOCATION 000292 FOR LINE 194

LITERAL POOL MAP FOR SYSTEM LITERALS IN THE PGT:


0000FC (LIT+0) 00000001 ]....
PP 5688-197 IBM COBOL for MVS & VM 1.2.2 TABTR9Z9 Date 11/12/2004 Time 14:30:35 Page 8
CONSTANT GLOBAL TABLE BEGINS AT LOCATION 000108 FOR 00012B BYTES
LITERAL POOL MAP FOR LITERALS IN THE CGT:

00012C (LIT+0) FFFFFFFC 00001000 00000001 C5D9D9D6 40D5D640 D6D7C5D5 40C3E4D9 E2D6D9C6 ]............ERRO NO OPEN
00014C (LIT+32) C9D440D5 D6D9D4C1 D3C6C5E3 C3C840D6 D2E3C1C2 E3D9F9E9 F9000010 0C000000 ]IM NORMALFETCH OKTABTR9Z9
00016C (LIT+64) 00000001 28000000 01000001 2C000000 01000000 00000000 00000000 00000000 ].........................
00018C (LIT+96) 00000000 00000000 00000000 00800000 00400000 00000000 00000000 00800000 ]................. .......
0001AC (LIT+128) 00000000 00000000 00400000 00000000 00000000 00000000 00400000 000025C0 ]......... ...............
0001CC (LIT+160) 0001C000 08080000 04005501 4000000A 08000004 0043FF01 40000033 09000128 ]............ ...........
0001EC (LIT+192) 01A8FF01 40000008 08000004 004DFF01 40000013 08000004 0030FF80 00000000 ].y.. ........(.. ........
00020C (LIT+224) 00000000 00000000 00000040 00000000 40C00001 40000808 00000400 5502C000 ]........... .... ... ....
00022C (LIT+256) 08080000 040055 ].......
LINE # HEXLOC VERB LINE # HEXLOC VERB LINE # HEXLOC VERB
000196 0002A4 GO 000198 0002A8 MOVE 000199 0002AE CALL
000201 0002E0 CALL 000203 000316 CALL 000204 000344 CALL
000206 000372 CALL 000210 0003E8 CALL 000212 00041C CONTINUE
000216 00041C PERFORM 000217 000434 PERFORM 000218 000450 PERFORM
000219 00046C STOP 000224 00048C MOVE 000226 000492 PERFORM
000227 0004B4 CALL 000228 0004DE IF 000229 0004EA DISPLAY
000230 0004F8 STOP 000232 000510 CONTINUE 000233 000510 EXIT
000239 000516 MOVE 000240 00051A PERFORM 000248 000526 PERFORM
000249 000548 CALL 000250 000572 IF 000251 00057E MOVE
000253 000586 DISPLAY 000254 000594 DISPLAY 000257 0005A2 CONTINUE
000258 0005A2 EXIT 000264 0005A8 DISPLAY 000266 0005B6 EXIT

PP 5688-197 IBM COBOL for MVS & VM 1.2.2 TABTR9Z9 Date 11/12/2004 Time 14:30:35 Page 9
*** TGT MEMORY MAP ***
PGMLOC TGTLOC

000618 000000 RESERVED - 72 BYTES


000660 000048 TGT IDENTIFIER
000664 00004C RESERVED - 4 BYTES
000668 000050 TGT LEVEL INDICATOR
000669 000051 RESERVED - 3 SINGLE BYTE FIELDS
00066C 000054 32 BIT SWITCH
000670 000058 POINTER TO RUNCOM
000674 00005C POINTER TO COBVEC
000678 000060 POINTER TO PROGRAM DYNAMIC BLOCK TABLE
00067C 000064 NUMBER OF FCB'S
000680 000068 WORKING-STORAGE LENGTH
000684 00006C RESERVED - 4 BYTES
000688 000070 ADDRESS OF IGZESMG WORK AREA
00068C 000074 ADDRESS OF 1ST GETMAIN BLOCK (SPACE MGR)
000690 000078 RESERVED - 2 BYTES
000692 00007A RESERVED - 2 BYTES
000694 00007C RESERVED - 2 BYTES
000696 00007E MERGE FILE NUMBER
000698 000080 ADDRESS OF CEL COMMON ANCHOR AREA
00069C 000084 LENGTH OF TGT
0006A0 000088 RESERVED - 1 SINGLE BYTE FIELD
0006A1 000089 PROGRAM MASK USED BY THIS PROGRAM
0006A2 00008A RESERVED - 2 SINGLE BYTE FIELDS
0006A4 00008C NUMBER OF SECONDARY FCB CELLS
0006A8 000090 LENGTH OF THE ALTER VN(VNI) VECTOR
0006AC 000094 COUNT OF NESTED PROGRAMS IN COMPILE UNIT
0006B0 000098 DDNAME FOR DISPLAY OUTPUT
0006B8 0000A0 RESERVED - 8 BYTES
0006C0 0000A8 POINTER TO COM-REG SPECIAL REGISTER

100
0006C4 0000AC CALC ROUTINE REGISTER SAVE AREA
0006F8 0000E0 ALTERNATE COLLATING SEQUENCE TABLE PTR.
0006FC 0000E4 ADDRESS OF SORT G.N. ADDRESS BLOCK
000700 0000E8 ADDRESS OF PGT
000704 0000EC CURRENT INTERNAL PROGRAM NUMBER
000708 0000F0 POINTER TO 1ST IPCB
00070C 0000F4 ADDRESS OF THE CLLE FOR THIS PROGRAM
000710 0000F8 POINTER TO ABEND INFORMATION TABLE
000714 0000FC POINTER TO TEST INFO FIELDS IN THE TGT
000718 000100 ADDRESS OF START OF COBOL PROGRAM
00071C 000104 POINTER TO ALTER VNI'S IN CGT
000720 000108 POINTER TO ALTER VN'S IN TGT
000724 00010C POINTER TO FIRST PBL IN THE PGT
000728 000110 POINTER TO FIRST FCB CELL
00072C 000114 WORKING-STORAGE ADDRESS
000730 000118 POINTER TO FIRST SECONDARY FCB CELL
000734 00011C POINTER TO STATIC CLASS INFO BLOCK

*** VARIABLE PORTION OF TGT ***

000738 000120 BASE LOCATORS FOR SPECIAL REGISTERS


000740 000128 BASE LOCATORS FOR WORKING-STORAGE
000744 00012C BASE LOCATORS FOR LINKAGE-SECTION
000748 000130 CLLE ADDR. CELLS FOR CALL LIT. SUB-PGMS.
000768 000150 INTERNAL PROGRAM CONTROL BLOCKS

PP 5688-197 IBM COBOL for MVS & VM 1.2.2 TABTR9Z9 Date 11/12/2004 Time 14:30:35 Page 10
*** DSA MEMORY MAP ***
DSALOC

000000 REGISTER SAVE AREA


00004C STACK NAB (NEXT AVAILABLE BYTE)
000058 ADDRESS OF INLINE-CODE PRIMARY DSA
00005C ADDRESS OF TGT
000080 PROCEDURE DIVISION RETURNING VALUE

*** VARIABLE PORTION OF DSA ***

000084 BACKSTORE CELLS FOR SYMBOLIC REGISTERS


00008C VARIABLE NAME (VN) CELLS FOR PERFORM
0000A4 PERFORM SAVE CELLS
0000B8 TEMPORARY STORAGE-2

TGT LOCATED AT 000618 FOR 00000164 BYTES


SPEC-REG LOCATED AT 000780 FOR 00000049 BYTES
WRK-STOR LOCATED AT 0007D0 FOR 0000039C BYTES
DSA WILL BE ALLOCATED FOR 000000E8 BYTES
* Statistics for COBOL program TABTR9Z9:
* Source records = 266
* Data Division statements = 148
* Procedure Division statements = 33
End of compilation 1, program TABTR9Z9, no statements flagged.
Return code 0
z/OS V1 R3 BINDER 14:30:37 FRIDAY NOVEMBER 12, 2004
BATCH EMULATOR JOB(TAB#PROP) STEP(NDVRBAT ) PGM= IEWL
IEW2278I B352 INVOCATION PARAMETERS - XREF

IEW2322I 1220 1 IDENTIFY TABTR9Z9('2•¡ •¡ •¡ÇϹU °


B œ ­m ‘ En 0')
IEW2322I 1220 2 NAME TABTR9Z9(R)

C R O S S - R E F E R E N C E T A B L E
_________________________________________

TEXT CLASS = B_TEXT

--------------- R E F E R E N C E -------------------------- T A R G E T -------------------------------------------


CLASS ELEMENT ] ELEMENT ]
OFFSET SECT/PART(ABBREV) OFFSET TYPE ] SYMBOL(ABBREV) SECTION (ABBREV) OFFSET CLASS NAME ]
] ]
50 TABTR9Z9 50 V-CON ] IGZCBSO IGZCBSO 0 B_TEXT ]
BA TABTR9Z9 BA V-CON ] CEESTART CEESTART 0 B_TEXT ]
DA TABTR9Z9 DA V-CON ] CEESTART CEESTART 0 B_TEXT ]
DE TABTR9Z9 DE V-CON ] CEEBETBL CEEBETBL 0 B_TEXT ]
108 TABTR9Z9 108 V-CON ] DSNHADDR DSNHADDR 0 B_TEXT ]

101
10C TABTR9Z9 10C V-CON ] DSNHADD2 DSNHADD2 0 B_TEXT ]
110 TABTR9Z9 110 V-CON ] DSNHLI DSNELI 2C B_TEXT ]
F5C CEEBETBL 4 V-CON ] CEEBXITA $UNRESOLVED(W) ]
F60 CEEBETBL 8 V-CON ] CEEBINT CEEBINT 0 B_TEXT ]
F64 CEEBETBL C V-CON ] CEEBLLST CEEBLLST 0 B_TEXT ]
F68 CEEBETBL 10 V-CON ] CEEUOPT $UNRESOLVED(W) ]
F6C CEEBETBL 14 V-CON ] CEEBTRM CEEBTRM 0 B_TEXT ]
F74 CEEBETBL 1C V-CON ] CEEBPUBT CEEBPUBT 0 B_TEXT ]
F78 CEEBETBL 20 V-CON ] IEWBLIT $UNRESOLVED(W) ]
FDC CEESTART 5C A-CON ] CEEMAIN $UNRESOLVED(W) ]
FEC CEESTART 6C C-LEN ] $NON-RELOCATABLE B_PRV ]
1018 CEESTART 98 A-CON ] CEEFMAIN $UNRESOLVED(W) ]
1024 CEESTART A4 A-CON ] CEEBETBL CEEBETBL 0 B_TEXT ]
1028 CEESTART A8 A-CON ] CEEROOTA $UNRESOLVED(W) ]
102C CEESTART AC A-CON ] CEEROOTD $UNRESOLVED(W) ]
14E8 IGZCBSO 4B8 V-CON ] CEEINT CEEBPIRA 0 B_TEXT ]
14EC IGZCBSO 4BC V-CON ] IGZETUN $UNRESOLVED(W) ]
14F0 IGZCBSO 4C0 V-CON ] IGZEOPT $UNRESOLVED(W) ]
14F4 IGZCBSO 4C4 V-CON ] CEEARLU CEEARLU 0 B_TEXT ]
18A8 CEEBPIRA 260 V-CON ] CEEBPUBT CEEBPUBT 0 B_TEXT ]
1ADC CEEBTRM 6C A-CON ] CEEBPUBT CEEBPUBT 0 B_TEXT ]
1B28 CEEBLLST 10 A-CON ] CEESG000 $UNRESOLVED(W) ]
1B2C CEEBLLST 14 A-CON ] CEESG001 $UNRESOLVED(W) ]
1B30 CEEBLLST 18 A-CON ] CEESG002 $UNRESOLVED(W) ]
1B34 CEEBLLST 1C A-CON ] CEESG003 $UNRESOLVED(W) ]
1B38 CEEBLLST 20 A-CON ] CEESG004 $UNRESOLVED(W) ]
1B3C CEEBLLST 24 A-CON ] CEESG005 CEESG005 0 B_TEXT ]
1B40 CEEBLLST 28 A-CON ] CEESG006 $UNRESOLVED(W) ]
1B44 CEEBLLST 2C A-CON ] CEESG007 $UNRESOLVED(W) ]
1B48 CEEBLLST 30 A-CON ] CEESG008 $UNRESOLVED(W) ]
1B4C CEEBLLST 34 A-CON ] CEESG009 $UNRESOLVED(W) ]
1B50 CEEBLLST 38 A-CON ] CEESG010 $UNRESOLVED(W) ]
1B54 CEEBLLST 3C A-CON ] CEESG011 $UNRESOLVED(W) ]
1B58 CEEBLLST 40 A-CON ] CEESG012 $UNRESOLVED(W) ]
1B5C CEEBLLST 44 A-CON ] CEESG013 $UNRESOLVED(W) ]
1B60 CEEBLLST 48 A-CON ] CEESG014 $UNRESOLVED(W) ]
1B64 CEEBLLST 4C A-CON ] CEESG015 $UNRESOLVED(W) ]
1B68 CEEBLLST 50 A-CON ] CEESG016 $UNRESOLVED(W) ]

TEXT CLASS = B_PRV

--------------- R E F E R E N C E -------------------------- T A R G E T -------------------------------------------


CLASS ELEMENT ] ELEMENT ]
OFFSET SECT/PART(ABBREV) OFFSET TYPE ] SYMBOL(ABBREV) SECTION (ABBREV) OFFSET CLASS NAME ]
] ]
*** NO ADDRESS CONSTANTS FOR THIS CLASS ***
*** E N D O F C R O S S R E F E R E N C E ***

PROCESSING OPTIONS:

ALIASES NO
ALIGN2 NO
AMODE UNSPECIFIED
CALL YES
CASE UPPER
COMPAT UNSPECIFIED
DCBS NO
DYNAM NO
EXTATTR UNSPECIFIED
EXITS: NONE
FILL NONE
GID UNSPECIFIED
HOBSET NO
LET 04
LINECT 060
LIST SUMMARY
LISTPRIV NO
MAP NO
MAXBLK 032760
MSGLEVEL 00
OVLY NO
PRINT YES
RES NO

102
REUSABILITY UNSPECIFIED
RMODE UNSPECIFIED
STORENX NO
TERM NO
UID UNSPECIFIED
UPCASE: NO
WKSPACE 000000K,000000K
XCAL NO
XREF YES
***END OF OPTIONS***

SAVE OPERATION SUMMARY:

MEMBER NAME TABTR9Z9


LOAD LIBRARY DSVAABLB.ENDEVOR.BATCH.LOADLIB
PROGRAM TYPE LOAD MODULE
VOLUME SERIAL D7S002
MAX BLOCK 32760
DISPOSITION ADDED NEW
TIME OF SAVE 14.30.38 NOV 12, 2004

SAVE MODULE ATTRIBUTES:

AC 000
AMODE ANY
DC NO
EDITABLE YES
EXCEEDS 16MB NO
EXECUTABLE YES
MIGRATABLE YES
OL NO
OVLY NO
PACK,PRIME NO,NO
PAGE ALIGN NO
REFR NO
RENT NO
REUS NO
RMODE 24
SCTR NO
SSI
SYM GENERATED NO
TEST NO
XPLINK NO
MODULE SIZE (HEX) 00001B80

ENTRY POINT AND ALIAS SUMMARY:

NAME: ENTRY TYPE AMODE C_OFFSET CLASS NAME STATUS

TABTR9Z9 MAIN_EP ANY 00000000 B_TEXT

***** E N D O F R E P O R T *****

z/OS V1 R3 BINDER 14:30:37 FRIDAY NOVEMBER 12, 2004


BATCH EMULATOR JOB(TAB#PROP) STEP(NDVRBAT ) PGM= IEWL
IEW2008I 0F03 PROCESSING COMPLETED. RETURN CODE = 0.

----------------------
MESSAGE SUMMARY REPORT

103
----------------------
SEVERE MESSAGES (SEVERITY = 12)
NONE

ERROR MESSAGES (SEVERITY = 08)


NONE

WARNING MESSAGES (SEVERITY = 04)


NONE

INFORMATIONAL MESSAGES (SEVERITY = 00)


2008 2278 2322

**** END OF MESSAGE SUMMARY REPORT ****

ICE143I 0 BLOCKSET COPY TECHNIQUE SELECTED


ICE000I 0 - CONTROL STATEMENTS FOR 5740-SM1, DFSORT REL 14.0 - 14:30 ON FRI NOV 12, 2004 -
OPTION COPY,MSGDDN=SYSPRINT,SORTIN=SYSUT1,SORTOUT=SYSUT2
ICE201I 0 RECORD TYPE IS F - DATA STARTS IN POSITION 1
ICE193I 0 ICEAM2 ENVIRONMENT IN EFFECT - ICEAM2 INSTALLATION MODULE SELECTED
ICE088I 0 TAB#PROP.NDVRBAT . , INPUT LRECL = 80, BLKSIZE = 3120, TYPE = FB
ICE093I 0 MAIN STORAGE = (MAX,4194304,4181086)
ICE156I 0 MAIN STORAGE ABOVE 16MB = (4109862,4109862)
ICE127I 0 OPTIONS: OVFLO=RC0 ,PAD=RC0 ,TRUNC=RC0 ,SPANINC=RC16,VLSCMP=N,SZERO=Y,RESET=Y,VSAMEMT=Y,DYNSPC=256
ICE128I 0 OPTIONS: SIZE=4194304,MAXLIM=1048576,MINLIM=450560,EQUALS=N,LIST=Y,ERET=RC16 ,MSGDDN=SYSPRINT
ICE129I 0 OPTIONS: VIO=N,RESDNT=ALL ,SMF=NO ,WRKSEC=Y,OUTSEC=Y,VERIFY=N,CHALT=N,DYNALOC=N ,ABCODE=MSG
ICE130I 0 OPTIONS: RESALL=4096,RESINV=0,SVC=109 ,CHECK=Y,WRKREL=Y,OUTREL=Y,CKPT=N,STIMER=Y,COBEXIT=COB2
ICE131I 0 OPTIONS: TMAXLIM=4194304,ARESALL=0,ARESINV=0,OVERRGN=16384,CINV=Y,CFW=Y,DSA=0
ICE132I 0 OPTIONS: VLSHRT=N,ZDPRINT=N,IEXIT=N,TEXIT=N,LISTX=N,EFS=NONE ,EXITCK=S,PARMDDN=DFSPARM ,FSZEST=N
ICE133I 0 OPTIONS: HIPRMAX=OPTIMAL,DSPSIZE=MAX ,ODMAXBF=0,SOLRF=Y,VLLONG=N,VSAMIO=N
ICE084I 0 BSAM ACCESS METHOD USED FOR SYSUT2
ICE084I 0 EXCP ACCESS METHOD USED FOR SYSUT1
ICE090I 0 OUTPUT LRECL = 80, BLKSIZE = 6160, TYPE = FB
ICE055I 0 INSERT 0, DELETE 0
ICE054I 0 RECORDS - IN: 13, OUT: 13
ICE751I 0 C5C6C7C8E9C9E5E7EFF0E8
ICE052I 0 END OF DFSORT
READY
EXEC 'DSVAABLB.ENDEVOR.DB2.BIND(TABTR9Z9)'
DSNT212I # BIND AUTHORIZATION ID DB2DTAB IN THE OWNER KEYWORD
IS INVALID
DSNT233I # UNSUCCESSFUL BIND FOR
PACKAGE = AB73.COLDB01.TABTR9Z9.()
READY
END
DSNTIAD - SAMPLE DYNAMIC SQL PROGRAM 2.0
IEBCOPY MESSAGES AND CONTROL STATEMENTS PAGE 1
IEB1135I IEBCOPY FMID HDZ11G0 SERVICE LEVEL UA07761 DATED 20031212 DFSMS 01.03.00 z/OS 01.04.00 HBB7707 CPU 2064
IEB1035I TAB#PROP NDVRBAT 14:30:39 FRI 12 NOV 2004 PARM=''
COPYMOD INDD=DD1,OUTDD=DD2
SELECT MEMBER=((TABTR9Z9,,R))
IEB190I MAXIMUM BLOCK SIZE IS 32760, MINIMUM BLOCK SIZE IS 1024
IEB1013I COPYING FROM PDS INDD=DD1 VOL=D7S002 DSN=DSVAABLB.ENDEVOR.BATCH.LOADLIB
IEB1014I TO PDS OUTDD=DD2 VOL=AABBR2 DSN=DSVAABLB.BATCH.LOADLIB
IEB167I FOLLOWING MEMBER(S) COPIED FROM INPUT DATA SET REFERENCED BY DD1
IEB19AI MEMBER TABTR9Z9 COPIED AND REBLOCKED.
IEB1098I 1 OF 1 MEMBERS COPIED FROM INPUT DATA SET REFERENCED BY DD1
IEB144I THERE ARE 5616 UNUSED TRACKS IN OUTPUT DATA SET REFERENCED BY DD2
IEB149I THERE ARE 538 UNUSED DIRECTORY BLOCKS IN OUTPUT DIRECTORY
IEB147I END OF JOB - 0 WAS HIGHEST SEVERITY CODE

104
Leitura com cursor
IDENTIFICATION DIVISION.
PROGRAM-ID. TABTR9A5.
AUTHOR. FABIO MURASAKI
*****************************************************************
ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SPECIAL-NAMES. DECIMAL-POINT IS COMMA.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT IMPRESS ASSIGN TO IMPRESS.
*****************************************************************
DATA DIVISION.
FILE SECTION.
FD IMPRESS.
01 LIN-IMPRESS PIC X(133).
WORKING-STORAGE SECTION.
**** AREAS DO RELATORIO *****************************************
01 LIN-CAB1.
05 FILLER PIC X(03) VALUE SPACES.
05 FILLER PIC X(19) VALUE 'BANCO REAL ABN AMRO'.
05 FILLER PIC X(05) VALUE SPACES.
05 FILLER PIC X(19) VALUE 'AGENCIAS ORDEM ALFA'.
05 FILLER PIC X(07) VALUE SPACES.
05 FILLER PIC X(05) VALUE 'PAG. '.
05 CAB1-PAG PIC Z.ZZ9.
01 LIN-DET1.
05 FILLER PIC X(03) VALUE SPACES.
05 FILLER PIC X(16) VALUE 'AGENCIA = '.
05 DET-CODAGE PIC 9(05) VALUE ZEROES.
01 LIN-DET2.
05 FILLER PIC X(03) VALUE SPACES.
05 FILLER PIC X(16) VALUE 'NOME AGENCIA = '.
05 DET-NM-AGE PIC X(35) VALUE SPACES.
01 LIN-DET3.
05 FILLER PIC X(03) VALUE SPACES.
05 FILLER PIC X(16) VALUE 'END. AGENCIA = '.
05 DET-END-AGE PIC X(35) VALUE SPACES.
01 LIN-DET4.
05 FILLER PIC X(03) VALUE SPACES.
05 FILLER PIC X(16) VALUE 'TEL. AGENCIA = '.
05 DET-TEL-AGE.
10 DET-TEL1 PIC 9(04).
10 FILLER PIC X(01) VALUE '-'.
10 DET-TEL2 PIC 9(04).
01 LIN-DET5.
05 FILLER PIC X(03) VALUE SPACES.
05 FILLER PIC X(60) VALUE '-----------------------------
- '-------------------------------'.
01 LIN-BRANCO.
05 FILLER PIC X(133) VALUE SPACES.
**** VARIAVEIS DO RELATORIO *************************************
01 VAR-REL.
05 REL-N-PAG PIC 9(04) VALUE ZEROES.
**** VARIAVEIS **************************************************
01 CONT-LIN PIC 9(02) VALUE ZEROES.
01 CT-DET PIC 9(02) VALUE ZEROES.
01 WS-TEL-AGE PIC 9(09).
01 WS-SQLCODE PIC -9999.
**** AREAS DB2 **************************************************
* SQLCA ---------------------------
77 FILLER PIC X(05) VALUE 'SQLCA'.
EXEC SQL

105
INCLUDE SQLCA
END-EXEC.
* TABELA CADAGE -------------------
77 FILLER PIC X(06) VALUE 'CADAGE'.
01 CADAGE.
05 CD-AGE PIC S9(09) COMP.
05 NM-AGE PIC X(15).
05 END-AGE PIC X(30).
05 TEL-AGE PIC S9(09) COMP.
* CURSOR 1 ------------------------
EXEC SQL
DECLARE C1 CURSOR FOR
SELECT
CD_AGE,
NM_AGE,
END_AGE,
TEL_AGE
FROM
DB2T.ZZA500_CADAGE
ORDER BY
NM_AGE
END-EXEC.
*****************************************************************
PROCEDURE DIVISION.
100-00-PRINCIPAL.
OPEN OUTPUT IMPRESS.
MOVE 50 TO CONT-LIN.
PERFORM 200-00-OPEN-C1
PERFORM UNTIL SQLCODE = 100
PERFORM 210-00-FETCH-C1
IF SQLCODE NOT = 100
IF CONT-LIN = 50
PERFORM 300-00-IMP-CAB
END-IF
PERFORM 310-00-IMP-DET
END-IF
END-PERFORM
PERFORM 220-00-CLOSE-C1
CLOSE IMPRESS.
STOP RUN.
**** OPEN C1 ****************************************************
200-00-OPEN-C1 SECTION.
EXEC SQL
OPEN C1
END-EXEC
IF SQLCODE NOT = ZEROES
MOVE SQLCODE TO WS-SQLCODE
DISPLAY 'ERRO OPEN NO CURSOR'
DISPLAY 'SQLCODE = ' WS-SQLCODE
DISPLAY 'O PROGRAMA SERA CANCELADO'
MOVE 4 TO RETURN-CODE
STOP RUN
END-IF.
200-99-FIM. EXIT.
**** FETCH C1 ***************************************************
210-00-FETCH-C1 SECTION.
EXEC SQL
FETCH C1 INTO
:CADAGE.CD-AGE,
:CADAGE.NM-AGE,
:CADAGE.END-AGE,
:CADAGE.TEL-AGE
END-EXEC
IF SQLCODE NOT = ZEROES AND 100
MOVE SQLCODE TO WS-SQLCODE
DISPLAY 'EP37 - ERRO FETCH'
DISPLAY 'EP37 - SQLCODE = ' WS-SQLCODE
106
DISPLAY 'O PROGRAMA SERA CANCELADO'
MOVE 4 TO RETURN-CODE
STOP RUN
ELSE
IF SQLCODE = ZEROES
MOVE CD-AGE OF CADAGE TO DET-CODAGE
MOVE NM-AGE OF CADAGE TO DET-NM-AGE
MOVE END-AGE OF CADAGE TO DET-END-AGE
MOVE TEL-AGE OF CADAGE TO WS-TEL-AGE
MOVE WS-TEL-AGE(2:4) TO DET-TEL1
MOVE WS-TEL-AGE(6:4) TO DET-TEL2
END-IF
END-IF.
210-99-FIM. EXIT.
**** CLOSE C1 ***************************************************
220-00-CLOSE-C1 SECTION.
EXEC SQL
CLOSE C1
END-EXEC
IF SQLCODE NOT = ZEROES
MOVE SQLCODE TO WS-SQLCODE
DISPLAY 'ERRO CLOSE NO CURSOR'
DISPLAY 'SQLCODE = ' WS-SQLCODE
DISPLAY 'O PROGRAMA SERA CANCELADO'
MOVE 4 TO RETURN-CODE
STOP RUN
END-IF.
220-99-FIM. EXIT.
**** IMPRIME CABECALHO ******************************************
300-00-IMP-CAB SECTION.
ADD 1 TO REL-N-PAG.
MOVE REL-N-PAG TO CAB1-PAG.
WRITE LIN-IMPRESS FROM LIN-CAB1 BEFORE 1.
WRITE LIN-IMPRESS FROM LIN-BRANCO BEFORE 1.
MOVE ZEROES TO CONT-LIN.
300-99-FIM. EXIT.
**** IMPRIME DETALHE ********************************************
310-00-IMP-DET SECTION.
MOVE 1 TO CT-DET.
PERFORM UNTIL CT-DET > 5
EVALUATE CT-DET
WHEN 1 WRITE LIN-IMPRESS FROM LIN-DET1 BEFORE 1
WHEN 2 WRITE LIN-IMPRESS FROM LIN-DET2 BEFORE 1
WHEN 3 WRITE LIN-IMPRESS FROM LIN-DET3 BEFORE 1
WHEN 4 WRITE LIN-IMPRESS FROM LIN-DET4 BEFORE 1
WHEN 5 WRITE LIN-IMPRESS FROM LIN-DET5 BEFORE 1
END-EVALUATE
MOVE SPACES TO LIN-IMPRESS
ADD 1 TO CONT-LIN
ADD 1 TO CT-DET
IF CONT-LIN = 50
WRITE LIN-IMPRESS BEFORE PAGE
PERFORM 300-00-IMP-CAB
END-IF
END-PERFORM.
310-99-FIM. EXIT.

107
APÊNDICE IV – Uso de colunas com NULL
• Se uma coluna de uma tabela for definida com NOT NULL, ela SEMPRE terá um valor; neste caso,
quando for dado um FETCH o valor sempre será trazido para a variável indicada.
▪ Se uma coluna de uma tabela não for definida com NOT NULL, ela pode ter valor ou não numa linha.
Quando for dado um FETCH para uma linha:
➢ se a coluna tiver valor nessa linha, ele será trazido sem problemas
➢ se a coluna NÃO TIVER valor e NÃO TIVER variável indicadora de NULL, ocorrerá SQLCODE
–305
➢ se a coluna NÃO TIVER valor e TIVER variável indicadora de NULL, na variável será colocada
uma indicação se o valor da coluna é NULL ou não
• É necessário que haja (seja definida) uma variável indicadora de NULL para cada coluna que possa ter
NULL; o mais indicado é que essa declaração seja feita próxima do INCLUDE do DCLGEN, de
preferência por meio de outro INCLUDE; se isso não ocorrer, o programador deve declarar
manualmente todas as variáveis indicadoras de NULL para todas as colunas que serão objeto de
FETCH
• A declaração deve ser feita na Working-Storage Section, e a variável deve ser uma half-word com
conteúdo binário, com sinal, da seguinte forma :

01 EMAIL-NULL PIC S9(4) BINARY VALUE ZERO.

• O uso das variáveis indicadoras de NULL na PROCEDURE DIVISION é feita da seguinte forma
(exemplo) :
MOVE ZEROS TO EMAIL-NULL limpar variável indic.de NULL (desnecessário, mas elegante)
MOVE SPACES TO EMAIL limpar variável receptora (se for NULL, não é alterada)
MOVE COD-DESEJADO TO W-COD
EXEC SQL
SELECT T_COD, T_NOME, T_EMAIL
INTO :W-COD, :W-NOME, :W-EMAIL:W-EMAIL-NULL
FROM TABELA
WHERE T-COD = :W-COD
END-EXEC.
IF SQLCODE NOT = ZERO
MOVE SQLCODE TO W-SQLCODE
DISPLAY ‘SELECT DEU ERRO ! SQLCODE=’ W-SQLCODE
ELSE
IF W-TELEF-NULL < 0
DISPLAY ‘TELEFONE NULO’
ELSE
IF W-TELEF-NULL > 0
DISPLAY ‘EMAIL VEIO TRUNCADO’
ELSE
DISPLAY ‘EMAIL VEIO OK’
END-IF
END-IF

108
END-IF

109

Você também pode gostar