MF_DB2

156
DB2 DB2 Cobol

Transcript of MF_DB2

Page 1: MF_DB2

DB2

DB2 Cobol

NOV/2004

Page 2: MF_DB2

SUMÁRIO

1 – Conceitos de Bases de Dados__________________________________________________________5

Armazenamento de dados_____________________________________________________________________5File-oriented_______________________________________________________________________________________5Data base oriented__________________________________________________________________________________5

Base de dados_______________________________________________________________________________6

Data base management system (DBMS)_________________________________________________________6

Tipos de DBMS_____________________________________________________________________________6

Conceitos relativos a RDB’s___________________________________________________________________8Entidade__________________________________________________________________________________________8Atributo__________________________________________________________________________________________8Relacionamento____________________________________________________________________________________8Tabelas___________________________________________________________________________________________8Views____________________________________________________________________________________________9Índices___________________________________________________________________________________________9Keys____________________________________________________________________________________________10Constraints_______________________________________________________________________________________10Queries__________________________________________________________________________________________12Data Base Administrator - Administrador de Base de Dados________________________________________________12BIND & 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_________________________________________________________________________23Execução de comandos DB2 via batch (IKJEFT01 chama DSNTEP2)________________________________________23Execução de comandos DB2 via FileAid_______________________________________________________________26Execução de comandos DB2 via aplicativo Cobol (IKJEFT01 chama aplicativo Cobol)__________________________27

3 - SQL_____________________________________________________________________________28

Origem___________________________________________________________________________________28

Execução de comandos SQL : métodos_________________________________________________________29

Resumo dos principais comandos SQL_________________________________________________________36DDL (Data Definition Language) statements____________________________________________________________36DCL (Data Control Language) statements______________________________________________________________36DML (Data Manipulation Language) statements_________________________________________________________36Comandos declarativos auxiliares_____________________________________________________________________36Outros conceitos__________________________________________________________________________________37

(DSPL - Database Stored Procedure Language) statements______________________________________________372

Page 3: MF_DB2

(TCL - Transaction Control Language) statements_____________________________________________________37

4 - DB2 em um programa COBOL_______________________________________________________38

Diferenças no programa e conceitos associados__________________________________________________38

Fluxo do processo de geração do executável_____________________________________________________39

Funções do Pré-compilador__________________________________________________________________40

Funções do Binder__________________________________________________________________________40

Comandos ao Pré-compilador________________________________________________________________40INCLUDES______________________________________________________________________________________40DECLARE_______________________________________________________________________________________41

DCLGEN______________________________________________________________________________________41

SQLCA / SQLCODE_______________________________________________________________________43

Variáveis__________________________________________________________________________________46

5 – Comandos DDL - Rápida visão_______________________________________________________47

CREATE_________________________________________________________________________________47

ALTER___________________________________________________________________________________48

DROP____________________________________________________________________________________48

COMMENT_______________________________________________________________________________48

GRANT___________________________________________________________________________________49

RENAME_________________________________________________________________________________49

REPLACE________________________________________________________________________________49

REVOKE_________________________________________________________________________________50

6 – Comandos DCL – Rápida visão; Transações de Banco de Dados____________________________51

Conceito de transação_______________________________________________________________________51

Controle de transação : comandos DCL________________________________________________________51COMMIT________________________________________________________________________________________51SAVEPOINT_____________________________________________________________________________________51ROLLBACK_____________________________________________________________________________________51

7 – Comandos DML___________________________________________________________________54

SELECT__________________________________________________________________________________54SELECT - Uso batch em Cobol______________________________________________________________________54

SEM cursor____________________________________________________________________________________54COM cursor____________________________________________________________________________________56

SELECT – uso batch no DSNTEP2___________________________________________________________________60Parâmetros do SELECT (Embedded / Dsntep2)__________________________________________________________61Exemplos sintáticos do SELECT_____________________________________________________________________65Exemplos de uso (sem INTO)________________________________________________________________________67Exemplos de uso (com INTO)________________________________________________________________________68Exemplos de Select no DSNTEP2_____________________________________________________________________69

3

Page 4: MF_DB2

UPDATE__________________________________________________________________________________74UPDATE - Uso batch no DSNTEP2___________________________________________________________________74UPDATE - Uso batch em Cobol______________________________________________________________________75

INSERT__________________________________________________________________________________77INSERT - Uso batch no DSNTEP2____________________________________________________________________77INSERT - Uso batch em Cobol_______________________________________________________________________78

DELETE__________________________________________________________________________________80DELETE - Uso batch no DSNTEP2___________________________________________________________________80DELETE - Uso batch em Cobol______________________________________________________________________81

WHENEVER______________________________________________________________________________82

8 - FUNÇÕES (Built-In)_______________________________________________________________84

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

APÊNDICE II – Comandos SQL_________________________________________________________88

APÊNDICE III – Programas Exemplo____________________________________________________90

Completo (Fontes + Saídas)__________________________________________________________________90

Leitura com cursor________________________________________________________________________102

APÊNDICE IV – Uso de colunas com NULL______________________________________________105

APÊNDICE V – Exemplos de tabelas DB2________________________________________________106

4

DB2

DB2/COBOL

Page 5: MF_DB2

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 (código menor, menos funções, menos controles) Facilidade para aplicações muito pequenas e rápidas (mais simples, de forma geral)

Desvantagens Redundância (deve ser controlada pela aplicação, mas...) Inconsistências (validações deveriam ser feitas pelos aplicativos, mas...) Dificuldade de compartilhamento de recursos entre aplicativos / usuários (controle de

locks feito por aplicativo) Programas tem maior ou menor grau de dependência da view física (alterações nela

implicam em alterações nos programas; ex.: mudança no tamanho de um campo de nome)

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

5

Page 6: MF_DB2

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 As características do modelo relacional devem ser aplicadas exclusivamente para administrar o

banco de dados (não para armazenar seus dados) Um RDB é assim considerado somente se seguir as seguintes 12 regras :

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

Page 7: MF_DB2

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

Page 8: MF_DB2

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 :

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

AcessandoSELECT EMPNUME, EMPNOME FROM EMP WHERE EMPNUME > 500;

8

Page 9: MF_DB2

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

CriandoCREATE VIEW EMPVU10AS SELECT EMPNO, ENAME, JOBFROM EMPWHERE DEPTNO = 10;

CREATE VIEW EMPVU30AS SELECT EMPNO NUMERO_EMPREGADO, ENAME NOME, SAL SALARIOFROM EMPWHERE DEPTNO = 30;

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

Page 10: MF_DB2

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.

ConstraintsUm 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

Page 11: MF_DB2

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

Page 12: MF_DB2

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

Page 13: MF_DB2

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

Page 14: MF_DB2

2 - DB2

Exemplo de estrutura de uma base de dados

Estrutura de uma base de dados DB2

14

INSTÂNCIA

DATABASE

TABLESPACE

TABLE

DADOS INDEX VIEW

SUB-SISTEMA

DATABASE

TABLE

DADOS

INDEX

VIEW

STORAGE GROUP

Arquivos de configuração e de controle

Arquivos de configuração e controle

Page 15: MF_DB2

Exemplos de tabelas DB2

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

15

Page 16: MF_DB2

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

16

Page 17: MF_DB2

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

Page 18: MF_DB2

Arquivos de configuração e controle usados pelo DB2

18

Sgbd DB2

Base de Dados

Tem a relação de todas as tabelas, respectivas colunas, data types, etc. ...

Arquivos de controle

SYSIBM.SYSTABLES SYSIBM.SYSCOLUMNS

SYSIBM.SYSDBAUTH SYSIBM.SYSTABAUTH

SYSIBM.SYSINDEXES SYSIBM.SYSRELS

SYSIBM.SYSTABCONST

Arquivos de dados: tabelas

ACT0001, etc…

Page 19: MF_DB2

19

Page 20: MF_DB2

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 SMALLINTFOREIGNKEY CHAR(1) FLDPROC CHAR(1) LABEL VARCHAR(30) STATSTIME TIMESTMP DEFAULTVALUE VARCHAR(512) COLCARDF FLOAT(8) COLSTATUS CHAR(1) LENGTH2 INTEGERDATATYPEID 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

20

Page 21: MF_DB2

SYSIBM.tabelas

SYSIBM DSNRLST01 TABLESYSIBM IPNAMES TABLESYSIBM LOCATIONS TABLESYSIBM LULIST TABLESYSIBM LUMODES TABLESYSIBM LUNAMES TABLESYSIBM MODESELECT TABLESYSIBM SQLTABLETYPES TABLESYSIBM SQLTYPEINFO TABLESYSIBM SYSAUXRELS TABLESYSIBM SYSCHECKDEP TABLESYSIBM SYSCHECKS TABLESYSIBM SYSCHECKS2 TABLESYSIBM SYSCOLAUTH TABLESYSIBM SYSCOLDIST TABLESYSIBM SYSCOLDIST_HIST TABLESYSIBM SYSCOLDISTSTATS TABLESYSIBM SYSCOLSTATS TABLESYSIBM SYSCOLUMNS TABLESYSIBM SYSCOLUMNS_HIST TABLESYSIBM SYSCONSTDEP TABLESYSIBM SYSCOPY TABLESYSIBM SYSDATABASE TABLESYSIBM SYSDATATYPES TABLESYSIBM SYSDBAUTH TABLESYSIBM SYSDBRM TABLESYSIBM SYSDUMMY1 TABLESYSIBM SYSFIELDS TABLESYSIBM SYSFOREIGNKEYS TABLESYSIBM SYSINDEXES TABLESYSIBM SYSINDEXES_HIST TABLESYSIBM SYSINDEXPART TABLESYSIBM SYSINDEXPART_HIST TABLESYSIBM SYSINDEXSTATS TABLESYSIBM SYSINDEXSTATS_HIST TABLESYSIBM SYSJARCONTENTS TABLESYSIBM SYSJAROBJECTS TABLESYSIBM SYSJAVAOPTS TABLESYSIBM SYSKEYCOLUSE TABLESYSIBM SYSKEYS TABLESYSIBM SYSLINKS TABLESYSIBM SYSLOBSTATS TABLESYSIBM SYSLOBSTATS_HIST TABLESYSIBM SYSPACKAGE TABLESYSIBM SYSPACKAUTH TABLESYSIBM SYSPACKDEP TABLESYSIBM SYSPACKLIST TABLESYSIBM SYSPACKSTMT TABLE

21

Page 22: MF_DB2

SYSIBM SYSPARMS TABLESYSIBM SYSPKSYSTEM TABLESYSIBM SYSPLAN TABLESYSIBM SYSPLANAUTH TABLESYSIBM SYSPLANDEP TABLESYSIBM SYSPLSYSTEM TABLESYSIBM SYSPROCEDURES TABLESYSIBM SYSPSM VIEW SYSIBM SYSPSMOPTS VIEW SYSIBM SYSRELS TABLESYSIBM SYSRESAUTH TABLESYSIBM SYSROUTINEAUTH TABLESYSIBM SYSROUTINES TABLESYSIBM SYSROUTINES_OPTS TABLE SYSIBM SYSROUTINES_SRC TABLESYSIBM SYSSCHEMAAUTH TABLESYSIBM SYSSEQUENCES TABLESYSIBM SYSSEQUENCESDEP TABLESYSIBM SYSSTMT TABLESYSIBM SYSSTOGROUP TABLESYSIBM SYSSTRINGS TABLESYSIBM SYSSYNONYMS TABLESYSIBM SYSTABAUTH TABLESYSIBM SYSTABCONST TABLESYSIBM SYSTABLEPART TABLESYSIBM SYSTABLEPART_HIST TABLESYSIBM SYSTABLES TABLESYSIBM SYSTABLES_HIST TABLESYSIBM SYSTABLESPACE TABLESYSIBM SYSTABSTATS TABLESYSIBM SYSTABSTATS_HIST TABLESYSIBM SYSTRIGGERS TABLESYSIBM SYSUSERAUTH TABLESYSIBM SYSVIEWDEP TABLESYSIBM SYSVIEWS TABLESYSIBM SYSVLTREE TABLESYSIBM SYSVOLUMES TABLESYSIBM SYSVTREE TABLESYSIBM USERNAMES TABLE

22

Page 23: MF_DB2

Built-In Data Types ; formatos de Date e Time

Dado Obs. Formato DB2 PIC CobolHorá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(16 bits)2 bytes

SMALLINT S9(4) COMP OuS9(4) COMP-4

Número Binário ponto fixo(32 bits)4 bytes

INTEGER S9(9) COMP OuS9(9) COMP-4

Número Binário ponto fixo(64 bits)8 bytes

Não tem BIGINT

Número Decimal compactado

DECIMAL(p,s) S9(p-s)V9(s) COMP-3

Número Binário ponto flutuante precisao simples4 bytes

REAL COMP-1

Número Binário ponto flutuante dupla8 bytes

DOUBLEOuFLOAT

COMP-2

String Tamanho fixo Carater

CHAR(n) X(n)

String Tamanho variavel Carater

VARCHAR(n) xxx-LEN PIC S9(4) COMP.xxx-TEXT PIC X(n).

String grafico Tamanho fixo Grafico GRAPHICString grafico Tamanho variavel Grafico VARGRAPHICString grafico LOB Tamanho variavel Grafico

LOBDBCLOB

String LOB Tamanho variavel Carater LOB

CLOB

String LOB Tamanho variavel Binario LOB

BLOB

Dado externo Pointer DATALINK USAGE POINTERObs. LOB = LARGE OBJECT : desenhos, fotos, voz, (teses), (livros), etc...

23

Page 24: MF_DB2

DB2 no mainframe

SistemaOperacional

Gerenciador DB2IKJFT01(TSO batch) DSNTEP2

(SQL batch)

Aplicativos Cobol Batch

FileAid

Outros Softwares

24

comandos SQLresultados

comandos SQLresultados

comandos SQLresultados

Page 25: MF_DB2

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

SistemaOperacional

Gerenciador DB2IKJFT01(TSO batch) DSNTEP2

(chamado pelo IKJEFT01)

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

25

SYSPRINT(RESULTADO)

SELECT * FROMTABELA_CLIENTES

(RESULTADO)

BASE DE DADOSSYSIN

SELECT * FROM TABELA_CLIENTES

SYSTSIN indica :Programa=DSNTEP2Plano=xxxxxLoadLib=dsnEtc...

Page 26: MF_DB2

Resultado produzido :

READY DSN SYSTEM(DB1D) DSN RUN PROGRAM(DSNTEP2) PLAN(DSNTEP2) LIB('SYS1.DSNDB1D.RUNLIB.LOAD')DSN END READY END

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;

26

Nome tabela errado !!!

Page 27: MF_DB2

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)

27

Page 28: MF_DB2

Execução de comandos DB2 via FileAid

Consulta

Resultado

28

SistemaOperacional Gerenciador DB2 FileAid

Comandos Resultados

BASE DE DADOSComandos Resultados

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

File Edit View Options Open Menu Utilities Help ------------------------------------------------------------------------------File-AID for DB2 Browse DB2T.ZZC100_CADAGE 2 rows fetchedCOMMAND ===> SCROLL ===> PAGE CD_AGE NM_AGE INTEGER CHAR(15) ----PRIMARY --------------- ****** **************************** TOP OF DATA **************************** 000001 8 NOME AG 8 000002 10 NOME AG 10 ****** ************************** BOTTOM OF DATA ***************************

Page 29: MF_DB2

Execução de comandos DB2 via aplicativo Cobol (IKJEFT01 chama aplicativo Cobol)

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

29

SistemaOperacional

GerenciadorDB2

Aplicativo (programa xxxxxxxx) (chamado pelo IKJEFT01)

SELECT * FROM TABELA_CLIENTES

IKJEFT01

SELECT * FROMTABELA_CLIENTES

(RESULTADO)

SELECT * FROMTABELA_CLIENTES

(RESULTADO)

BASE DE DADOSSYSTSIN indica :Programa=xxxxxxxxPlano=xxxxxLoadLib=dsnEtc...

Page 30: MF_DB2

30

Page 31: MF_DB2

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.

31

Page 32: MF_DB2

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

32

Page 33: MF_DB2

SQL interativo

Sistema Operacional

SGBDDB2

SQL Plus

33

(SELECT * FROM TABELA_CLIENTE)

Resultados

BASE DE DADOS

SELECT * FROM TABELA_CLIENTE

(RESULTADOS)

Page 34: MF_DB2

34

Page 35: MF_DB2

SQL dinâmico

Sistema Operacional

SGBDDB2

FileAid

Consulta

Resultado

35

Consulta Resultados

BASE DE DADOS

Consulta SQL

Resultados

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

File Edit View Options Open Menu Utilities Help ------------------------------------------------------------------------------File-AID for DB2 Browse DB2T.ZZC100_CADAGE 2 rows fetchedCOMMAND ===> SCROLL ===> PAGE CD_AGE NM_AGE INTEGER CHAR(15) ----PRIMARY --------------- ****** **************************** TOP OF DATA **************************** 000001 8 NOME AG 8 000002 10 NOME AG 10 ****** ************************** BOTTOM OF DATA

Page 36: MF_DB2

SQL embedded (aplicação on-line)

Sistema Operacional

SGBDDB2

Aplicativo X (rodando sob CICS)(transforma dados em consulta SQL)

(e faz o uso que quiser dos resultados)

36

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

DADOS(Resultados)

consulta em SQL

Resultados

Resultados

Page 37: MF_DB2

SQL embedded (aplicação batch)

Sistema Operacional

SGBDDB2

IKJEFT01 Aplicativo X

37

BASE DE DADOS

Consulta(no código executável)

Resultados

Avisa que : Programa=XPlano=xxxxxLoadLib=dsnEtc... (no arquivo com ddname SYSTSIN)

consulta em SQL

Resultados (faz o uso que quiser deles)

Page 38: MF_DB2

SQL batch

Sistema Operacional

SGBDDB2

IKJEFT01 DSNTEP2

38

Resultados(SYSPRINT)

BASE DE DADOS

Consulta (no arquivo com ddname SYSIN)

Avisa que : Programa=DSNTEP2Plano=xxxxxLoadLib=dsnEtc... (no arquivo com ddname SYSTSIN)

consulta em SQL

(RESULTADOS)

Page 39: MF_DB2

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

39

Page 40: MF_DB2

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.

40

Page 41: MF_DB2

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

41

Page 42: MF_DB2

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

42

FONTE COBOL COM COMANDOS SQL “EMBEDDED”(delimitados por EXEC SQL / END-EXEC)

(PRÉ-COMPILADOR)(NÃO acessa o banco de

dados)

Fonte cobol com comandos SQLasteriscados e

transformados em comandos cobol CALL

COMPILADOR COBOL

NORMAL

Programa Objeto

LINKEDITOR

PROGRAMA EXECUTÁVEL

Mensagens (erros / resultados da análise dos comandos)

Mensagens (erros / resultados da compilação)

Mensagens (erros / resultados da linkedição)

PACKAGE(dados para

executar SQL estático)

Arquivo para BIND

= DBRM= Data Base

Request Module(dados para

criar um package)

Base de dados

BINDER

Execução via DSNTEP2 / IKJEFT01 / Gerenciador DB2

Data Base

SaídaDCLGEN

Page 43: MF_DB2

43

Page 44: MF_DB2

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 INCLUDE nome_membro END-EXEC...EXEC SQL comando ... END-EXEC...

44

Page 45: MF_DB2

DECLARE Declara estruturas (lay-outs) de tabelas em SQL (usar na Working-Storage Section). Deve ser colocado antes de qualquer referência à tabela (inclusive em DECLARE de cursor)

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 De forma análoga ao COPY (para o momento da compilação), usado para facilidade de

padronização, o fonte gerado pelo DCLGEN tem sua maior utilidade no fato de que, uma vez gerado e catalogado, todos os programas que forem utilizar uma tabela podem referenciar declarações padronizadas dando INCLUDE de dados fonte gerados por DCLGEN

Essas estruturas catalogadas são geradas por meio de função utilitária DCLGEN (ítem DB2I do ISPF ou em batch por meio do comando DCLGEN do IKJEFT01)

As declarações geradas pelo DCLGEN são : em SQL (declaração 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). Exemplo de DCLGEN usando IKJEFT01 :

//RUNDB2 EXEC PGM=IKJEFT01,DYNAMNBR=20 //STEPLIB DD DSN=SYS1.DSNDB1D.SDSNLOAD,DISP=SHR // DD DSN=SYS1.DSNDB1D.RUNLIB.LOAD,DISP=SHR //SYSTSPRT DD SYSOUT=* //SYSOUT DD SYSOUT=* //SYSTSIN DD * DSN SYSTEM(DB1D) DCLGEN TABLE(DB2T.ZZC900_CADAGE) - LIBRARY('TORI243.T#RPC.SRC(ZZC900)') - LANGUAGE(COBOL) - ACTION(REPLACE) /* OU ACTION(ADD) */ - QUOTE END

O DCLGEN vai gravar o seguinte conteúdo em DSVAABLB.DB2.COBOL(EPCV01A1):

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

45

Page 46: MF_DB2

****************************************************************** 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). 10 TS-ULT-ATU PIC X(26). 10 CD-USU-ULT-ATU PIC X(8). 10 CD-PGM-MAN PIC X(8). ****************************************************************** * THE NUMBER OF COLUMNS DESCRIBED BY THIS DECLARATION IS 7 * ******************************************************************

O mais comum é que para incorporar as declarações das estruturas sejam usados INCLUDE’s (dos membros da libraries gerados no DCLGEN); no exemplo, a tabela EPCV01A1 tem INCLUDE do EPCV01A1 (membro da library gerado pelo DCLGEN) :

WORKING-STORAGE SECTION....EXEC SQL INCLUDE SQLCA END-EXECEXEC SQL INCLUDE EPCV01A1 END-EXEC...PROCEDURE DIVISION....

O fonte gerado pelo pré compilador (que será a entrada do compilador) é o seguinte : :

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

46

Page 47: MF_DB2

****************************************************************** 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). 10 TS-ULT-ATU PIC X(26). 10 CD-USU-ULT-ATU PIC X(8). 10 CD-PGM-MAN PIC X(8).

47

Page 48: MF_DB2

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 conjunto de declarações :

01 SQLCA. 05 SQLCAID PIC X(8). 05 SQLCABC PIC S9(9) COMP-4. 05 SQLCODE PIC S9(9) COMP-4. 05 SQLERRM. 49 SQLERRML PIC S9(4) COMP-4. 49 SQLERRMC PIC X(70). 05 SQLERRP PIC X(8). 05 SQLERRD OCCURS 6 TIMES PIC S9(9) COMP-4. 05 SQLWARN. 10 SQLWARN0 PIC X. 10 SQLWARN1 PIC X. 10 SQLWARN2 PIC X. 10 SQLWARN3 PIC X. 10 SQLWARN4 PIC X. 10 SQLWARN5 PIC X. 10 SQLWARN6 PIC X. 10 SQLWARN7 PIC X. 05 SQLEXT. 10 SQLWARN8 PIC X. 10 SQLWARN9 PIC X. 10 SQLWARNA PIC X. 10 SQLSTATE PIC X(5).

Exemplo de area para receber os return codes do SQL :

77 WS-COD PIC –9999.

Importante o picture ser desta forma, para aparecer o sinal no display !!!!! Exemplo :

WORKING-STORAGE SECTION.01 WS-COD PIC -9999....EXEC SQL INCLUDE SQLCA END-EXEC...PROCEDURE DIVISION....EXEC SQL comando ... END-EXECIF SQLCODE NOT = ZERO MOVE SQLCODE TO WS-COD DISPLAY ‘ERRO!!! SQLCODE=’ WS-CODEND-IF...

48

Page 49: MF_DB2

CUIDADO !!! Se for dado o DISPLAY direto do SQLCODE, aparece o seguinte :

SQLCODE é exibido-1 0000J-2 0000K-3 0000L-4 0000M-180 0018}-181 0018J-311 0031J-501 0050J-530 0053}-532 0053K-803 0080L-804 0080M-805 0080N-806 0080O-807 0080P-811 0081J-904 0090M-911 0091J-913 0091L

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 –911ou –913

Timeout ou recurso não disponível (por lock, por exemplo)

49

Page 50: MF_DB2

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.

50

Page 51: MF_DB2

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.

51

Page 52: MF_DB2

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

Exemplos :

EXEC SQL SELECT CD_AGE, NM_AGE FROM CADAGE INTO :CADAGE.CD-AGE, :CADAGE.NM-AGEEND-EXEC

EXEC SQL SELECT CD_AGE, NM_AGE FROM CADAGE INTO :WS-CD-AGE, :WS-NM-AGEEND-EXEC

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

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

52

Nomes de colunas de tabelas

VALE underscore, NÃO VALE hífen

NÃO TEM dois pontos (:) antesDentro de um comando SQL PODEM ser referenciadasFora de comando SQL (no “meio” de comandos Cobol) NÃO podem ser referenciadas

Nomes de colunas de tabelas

Nomes de variáveis Cobol

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

Page 53: MF_DB2

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 viewView é o nome da viewApelido 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).

53

Page 54: MF_DB2

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 OPTIONWITH READ ONLY assegura que as operações DML não possam ser executadas nesta

view.

CREATE VIEW EMPVU10AS SELECT EMPNO, ENAME, JOBFROM EMPWHERE 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

54

Page 55: MF_DB2

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 viewApelido 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 OPTIONWITH READ ONLY assegura que as operações DML não possam ser executadas nesta

view.

Exemplo :

REPLACE VIEW EMPVU10RAS SELECT EMPNO, ENAME, JOB

FROM EMPWHERE DEPTNO = 10;

55

Page 56: MF_DB2

REVOKE

Usado para revogar privilégios concedidos pelo GRANT

Sintaxe:

REVOKE [ GRANT OPTION FOR ] <privileges> ON <object name> FROM <grantee> [ { <comma> <grantee> }... ] <drop behavior>

56

Page 57: MF_DB2

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 COMMITSintaxe : COMMITFuncao : Torna permanentes todas as alterações de dados pendentes

SAVEPOINT Sintaxe : SAVEPOINT nomeFuncao : 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 Chave 15

UPDATE Chave 11

INSERT Chave 16

DELETE Chave 12

COMMIT SAVEPOINT A SAVEPOINT B ROLLBACK

57

Page 58: MF_DB2

Se o ROLLBACK for solicitado SEM REFERENCIA ao SAVEPOINT, serão desfeitos :

INSERT chave 15UPDATE chave 11INSERT chave 16DELETE 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 11INSERT chave 16DELETE 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.

58

Page 59: MF_DB2

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 EMPSET DEPTNO = 10WHERE EMPNO = 7782;

COMMIT;

DELETE FROM TEST;

ROLLBACK;

DELETE FROM TESTWHERE ID = 100;

SELECT * FROM TESTWHERE 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. **************************************************************

59

Page 60: MF_DB2

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)-resultadoFROM tab_origem [ WHERE condicao-filtro ][ GROUP BY coluna(s) ][ 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 SQLCAEND-EXEC...PROCEDURE DIVISION.......EXEC SQL SELECT COUNT(*) FROM TABCLI INTO :W-QUANTOSEND-EXEC......

Exemplo 2 :...

DATA DIVISION....WORKING-STORAGE SECTION.

60

Tem INTO aqui

Page 61: MF_DB2

...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-AGEEND-EXECEVALUATE SQLCODE WHEN 0 DISPLAY ‘LINHA LIDA DA TABELA’ WHEN OTHER DISPLAY ‘ERRO NO SELECT’END-EVALUATE ......

61

Page 62: MF_DB2

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_AGEEND-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 processaro Após os FETCH’s precisa finalizar com CLOSE do cursoro 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-EXECEVALUATE SQLCODE WHEN 0 DISPLAY ‘CURSOR ABERTO OK’ WHEN OTHER DISPLAY ‘ERRO NO OPEN DO CURSOR’ MOVE ‘S’ TO W-FLAG-PARAREND-EVALUATE ...EXEC SQL FETCH C1 INTO :CADAGE.CD-AGE, :CADAGE.NM-AGE,END-EXECEVALUATE 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-PARAREND-EVALUATE ...

62

Page 63: MF_DB2

EXEC SQL CLOSE C1 END-EXECEVALUATE SQLCODE WHEN 0 DISPLAY ‘CURSOR ABERTO OK’ WHEN OTHER DISPLAY ‘ERRO NO OPEN DO CURSOR’ MOVE ‘S’ TO W-FLAG-PARAREND-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)-resultadoFROM tab_origem [ WHERE condicao-filtro ][ GROUP BY coluna(s) ][ HAVING coluna(s) ][ ORDER coluna(s) ]INTO variável-working-storage[ OPTIMIZE FOR n ROW ][ FETCH FIRST [n] ROW ONLY ]

Exemplos :

63

Tem INTO aqui

Page 64: MF_DB2

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_AGEEND-EXEC......PROCEDURE DIVISION.......EXEC SQL OPEN C1 END-EXECEVALUATE SQLCODE

WHEN 0 DISPLAY ‘CURSOR ABERTO OK’WHEN OTHER DISPLAY ‘ERRO NO OPEN DO CURSOR’

MOVE ‘S’ TO W-FLAG-PARAREND-EVALUATE ...EXEC SQL FETCH C1 INTO :CADAGE.CD-AGE, :CADAGE.NM-AGE,END-EXECEVALUATE 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-PARAREND-EVALUATE ...EXEC SQL CLOSE C1 END-EXECEVALUATE SQLCODE

WHEN 0 DISPLAY ‘CURSOR ABERTO OK’WHEN OTHER DISPLAY ‘ERRO NO OPEN DO CURSOR’

MOVE ‘S’ TO W-FLAG-PARAREND-EVALUATE ......

64

Loop de leitura

Page 65: MF_DB2

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

65

Page 66: MF_DB2

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

 

66

Page 67: MF_DB2

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)-resultadoFROM tab_origem [ WHERE condicao-filtro ][ GROUP BY coluna(s) ][ 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;

67

Não tem INTO aqui (para SQL batch)

Page 68: MF_DB2

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

68

Page 69: MF_DB2

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'

< Menor que CEP < ‘04000000’ 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%'

OR Conector de condições lógico OU DATANASC < '1969-07-21' OR SALARIO < 16000

AND Conector de condições lógico E DATANASC < '1969-07-21' AND 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çãoLIKE ‘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 caracterLIKE ‘_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 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.

69

Page 70: MF_DB2

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 ROWIndica que o DB2 deve efetuar acesso diferenciado aos dados, para, de alguma forma, otimizar o desempenho. Pode-se especificar : OPTIMIZE FOR n ROWSA 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 linhaFETCH FIRST ROWS ONLY = traz somente a primeira linhaFETCH FIRST 1 ROW ONLY = traz somente a primeira linhaFETCH FIRST 1 ROWS ONLY = traz somente a primeira linhaFETCH FIRST n ROW ONLY = traz somente as n primeiras linhasFETCH FIRST n ROWS ONLY = traz somente as n primeiras linhas

Exemplos :

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;

70

Page 71: MF_DB2

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

71

Page 72: MF_DB2

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-filtroDevolve : Colunas : conforme solicitado

Linhas : aquelas que satisfizerem a condição-filtro Ordem : chave primária

72

Page 73: MF_DB2

SELECT [ | DISTINCT | ALL | ] { | * | coluna(s) | }

FROM tab_origem WHERE condicao-filtroDevolve : 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-filtroDevolve : 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

73

Page 74: MF_DB2

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 JOBDevolve : Colunas : JOB, valor mínimo de SALARY, valor máximo de SALARY,

da tabela EMPLOYEE Linhas : TODAS

Ordem : chave primária

74

Page 75: MF_DB2

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

75

Page 76: MF_DB2

Exemplos de Select no DSNTEP2

Função Selecionar Tabela : DB2T.ZZZ102_SLDCLILinhas : TodasColunas : 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_SLDCLILinhas : TodasColunas : 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_SLDCLILinhas : 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

76

Page 77: MF_DB2

Linhas : Aquelas cuja coluna CD_CLI tenha 320Colunas : CD_CLI, NM_CLI

ComandoSELECT 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_SLDCLILinhas : TodasColunas : 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_SLDCLILinhas : 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)

77

Page 78: MF_DB2

Função Selecionar Tabela : DB2T.ZZZ102_SLDCLILinhas : 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_SLDCLILinhas : 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_CADAGELinhas : (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)

78

Page 79: MF_DB2

Função Selecionar Tabela : DB2T.ZZZ100_CADAGELinhas : (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 SelecionarTabela : DB2T.ZZZ100_CADAGELinhas : (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 SelecionarTabela : DB2T.ZZZ100_CADAGELinhas : (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 : CODFUNC2ọ 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

79

Page 80: MF_DB2

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

80

Page 81: MF_DB2

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)

81

Page 82: MF_DB2

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

82

Page 83: MF_DB2

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

83

Page 84: MF_DB2

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)

84

Page 85: MF_DB2

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,

85

Page 86: MF_DB2

:EPCV51A1.CD-CTL-PAT, :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

86

Page 87: MF_DB2

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)

87

Page 88: MF_DB2

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

88

Page 89: MF_DB2

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 diferente de +100] resultante de um comando SQL ou 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).

89

Page 90: MF_DB2

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.

90

Page 91: MF_DB2

8 - FUNÇÕES (Built-In)

SINTAXE DESCRIÇÃO / EXEMPLOABS(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 4CHAR(|string|coluna| [,|ISO|USA|EUR|JIS|LOCAL|])

Converte date, time, timestamp, ROWID, valor (floating point, integer, ou decimal) para (string) caracterCHAR(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ábadoDAYOFWEEK(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 timestampDAYS(DATANASC)DAYS(‘DATE(‘2004-11-30’))

EXP(expressao) Retorna expressao ** eFLOOR(expressao) Retorna o inteiro menor mais proximo do resultado da expressao.

FLOOR(3.14) retorna 3HEX(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 timestampHOUR(TIME(’20.05.00’)) retona 20

LENGTH(|string|coluna|) Retorna os tamanho do string.

91

Page 92: MF_DB2

LENGTH(NOMECLI)LOCATE(string1,|string2|coluna|) Retorna a posição (ou zero, se não houver) em que string1 está em

string2LOCATE(‘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 timestampMICROSECOND(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 timestampMINUTE(TIME(’20.05.00’)) retona 5

MONTH(|date|timestamp|) Retorna o mes dia de uma data ou timestampMONTH(DATANASC)MONTH(‘DATE(‘2004-11-30’))

RAND() Retorna um número aleatório entre 0 e 1REPEAT(|string|coluna|,vezes) Retorna um string composto de n vezes o string informadoRIGHT(|string|coluna|,qtdd) Retorna os n caracteres mais à direita.

RIGHT(NOMECLI) RTRIM(|string|coluna|) Retorna o string sem brancos à direitaSECOND(|time|timestamp|) Retorna os segundos de um horário em um time ou timestamp

SECOND(TIMESTAMP(‘2004-11-05-22.00.02.000003’)) retorna 2SIGN(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úsculoWEEK(|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 dianteWEEK(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

92

Page 93: MF_DB2

WEEK_ISO(DATE(‘2004-11-30’)) retorna 45YEAR(|date|timestamp|) Retorna o ano de uma data ou timestamp

YEAR(DATANASC)YEAR(‘DATE(‘2004-11-30’))

93

Page 94: MF_DB2

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&part=periodical&WantType=periodical&title=Communications%20of%20the%20ACM&CFID=30679851&CFTOKEN=8548765

AbstractFuture 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

94

Page 95: MF_DB2

APÊNDICE II – Comandos SQL

ABORT Aborts the current transaction ALTER Modifies table propertiesBEGIN Begins a transaction in chained mode CHECKPOINT Force transaction log checkpointCLOSE   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 detailsFETCH Gets rows using a cursorFREE   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.  REINDEX Recover corrupted system indexes under standalone PostgreSQL

95

Page 96: MF_DB2

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.  

96

Page 97: MF_DB2

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 1OPTIONS SPECIFIED: HOST(COB2),APOST,SOURCEOPTIONS 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

97

Page 98: MF_DB2

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 FORDB2 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 *---------------------------------------------------------------* 75 PERFORM 002-INICIALIZAR.

98

Page 99: MF_DB2

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 5DSNH050I I DSNHMAIN WARNINGS HAVE BEEN SUPPRESSED DUE TO LACK OF TABLE DECLARATIONSDB2 SQL PRECOMPILER STATISTICS PAGE 6SOURCE STATISTICS SOURCE LINES READ: 121 NUMBER OF SYMBOLS: 38 SYMBOL TABLE BYTES EXCLUDING ATTRIBUTES: 3216THERE 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 0PP 5688-197 IBM COBOL for MVS & VM 1.2.2 Date 11/12/2004 Time 14:30:35 Page 1Invocation parameters:LIB,OBJECT,NOADV,APOST,OFFSETOptions in effect: NOADATA NOADV NOANALYZE APOST NOAWO BUFSIZE(4096) NOCMPR2 NOCOMPILE(S) NOCURRENCY DATA(31) NODATEPROC NODBCS NODECK NODUMP NODYNAM

99

Page 100: MF_DB2

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) ZWBPP 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. 000037 10 SQLWARN6 PIC X. 000038 10 SQLWARN7 PIC X. 000039 05 SQLEXT.

100

Page 101: MF_DB2

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

101

Page 102: MF_DB2

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

102

Page 103: MF_DB2

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 ZEROSPP 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 000257 CONTINUE. 000258 003-FIM. EXIT. 000259 000260 *---------------------------------------------------------------* 000261 999-FINALIZAR SECTION. 000262 *---------------------------------------------------------------*

103

Page 104: MF_DB2

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 7PROGRAM GLOBAL TABLE BEGINS AT LOCATION 0000FC FOR 00000C BYTESTHE PGT CONTAINS 000001 CELL(S) FOR ADDRESSABILITY TO THE CGTPBL1 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 8CONSTANT GLOBAL TABLE BEGINS AT LOCATION 000108 FOR 00012B BYTESLITERAL POOL MAP FOR LITERALS IN THE CGT:

00012C (LIT+0) FFFFFFFC 00001000 00000001 C5D9D9D6 40D5D640 D6D7C5D5 40C3E4D9 E2D6D9C6 ]............ERRO NO OPEN00014C (LIT+32) C9D440D5 D6D9D4C1 D3C6C5E3 C3C840D6 D2E3C1C2 E3D9F9E9 F9000010 0C000000 ]IM NORMALFETCH OKTABTR9Z900016C (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 VERB000196 0002A4 GO 000198 0002A8 MOVE 000199 0002AE CALL000201 0002E0 CALL 000203 000316 CALL 000204 000344 CALL000206 000372 CALL 000210 0003E8 CALL 000212 00041C CONTINUE000216 00041C PERFORM 000217 000434 PERFORM 000218 000450 PERFORM000219 00046C STOP 000224 00048C MOVE 000226 000492 PERFORM000227 0004B4 CALL 000228 0004DE IF 000229 0004EA DISPLAY000230 0004F8 STOP 000232 000510 CONTINUE 000233 000510 EXIT000239 000516 MOVE 000240 00051A PERFORM 000248 000526 PERFORM000249 000548 CALL 000250 000572 IF 000251 00057E MOVE000253 000586 DISPLAY 000254 000594 DISPLAY 000257 0005A2 CONTINUE000258 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 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

104

Page 105: MF_DB2

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 BYTESSPEC-REG LOCATED AT 000780 FOR 00000049 BYTESWRK-STOR LOCATED AT 0007D0 FOR 0000039C BYTESDSA WILL BE ALLOCATED FOR 000000E8 BYTES* Statistics for COBOL program TABTR9Z9:* Source records = 266* Data Division statements = 148* Procedure Division statements = 33End of compilation 1, program TABTR9Z9, no statements flagged.Return code 0z/OS V1 R3 BINDER 14:30:37 FRIDAY NOVEMBER 12, 2004BATCH EMULATOR JOB(TAB#PROP) STEP(NDVRBAT ) PGM= IEWLIEW2278I 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 ] 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 ]

105

Page 106: MF_DB2

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 REUSABILITY UNSPECIFIED RMODE UNSPECIFIED STORENX NO TERM NO UID UNSPECIFIED UPCASE: NO WKSPACE 000000K,000000K XCAL NO XREF YES

106

Page 107: MF_DB2

***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, 2004BATCH EMULATOR JOB(TAB#PROP) STEP(NDVRBAT ) PGM= IEWLIEW2008I 0F03 PROCESSING COMPLETED. RETURN CODE = 0.

----------------------MESSAGE SUMMARY REPORT---------------------- SEVERE MESSAGES (SEVERITY = 12) NONE

ERROR MESSAGES (SEVERITY = 08) NONE

WARNING MESSAGES (SEVERITY = 04) NONE

107

Page 108: MF_DB2

INFORMATIONAL MESSAGES (SEVERITY = 00) 2008 2278 2322

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

ICE143I 0 BLOCKSET COPY TECHNIQUE SELECTEDICE000I 0 - CONTROL STATEMENTS FOR 5740-SM1, DFSORT REL 14.0 - 14:30 ON FRI NOV 12, 2004 - OPTION COPY,MSGDDN=SYSPRINT,SORTIN=SYSUT1,SORTOUT=SYSUT2ICE201I 0 RECORD TYPE IS F - DATA STARTS IN POSITION 1ICE193I 0 ICEAM2 ENVIRONMENT IN EFFECT - ICEAM2 INSTALLATION MODULE SELECTEDICE088I 0 TAB#PROP.NDVRBAT . , INPUT LRECL = 80, BLKSIZE = 3120, TYPE = FBICE093I 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=256ICE128I 0 OPTIONS: SIZE=4194304,MAXLIM=1048576,MINLIM=450560,EQUALS=N,LIST=Y,ERET=RC16 ,MSGDDN=SYSPRINTICE129I 0 OPTIONS: VIO=N,RESDNT=ALL ,SMF=NO ,WRKSEC=Y,OUTSEC=Y,VERIFY=N,CHALT=N,DYNALOC=N ,ABCODE=MSGICE130I 0 OPTIONS: RESALL=4096,RESINV=0,SVC=109 ,CHECK=Y,WRKREL=Y,OUTREL=Y,CKPT=N,STIMER=Y,COBEXIT=COB2ICE131I 0 OPTIONS: TMAXLIM=4194304,ARESALL=0,ARESINV=0,OVERRGN=16384,CINV=Y,CFW=Y,DSA=0ICE132I 0 OPTIONS: VLSHRT=N,ZDPRINT=N,IEXIT=N,TEXIT=N,LISTX=N,EFS=NONE ,EXITCK=S,PARMDDN=DFSPARM ,FSZEST=NICE133I 0 OPTIONS: HIPRMAX=OPTIMAL,DSPSIZE=MAX ,ODMAXBF=0,SOLRF=Y,VLLONG=N,VSAMIO=NICE084I 0 BSAM ACCESS METHOD USED FOR SYSUT2ICE084I 0 EXCP ACCESS METHOD USED FOR SYSUT1ICE090I 0 OUTPUT LRECL = 80, BLKSIZE = 6160, TYPE = FBICE055I 0 INSERT 0, DELETE 0ICE054I 0 RECORDS - IN: 13, OUT: 13ICE751I 0 C5C6C7C8E9C9E5E7EFF0E8ICE052I 0 END OF DFSORTREADY EXEC 'DSVAABLB.ENDEVOR.DB2.BIND(TABTR9Z9)'DSNT212I # BIND AUTHORIZATION ID DB2DTAB IN THE OWNER KEYWORD IS INVALIDDSNT233I # UNSUCCESSFUL BIND FOR PACKAGE = AB73.COLDB01.TABTR9Z9.()READYEND DSNTIAD - SAMPLE DYNAMIC SQL PROGRAM 2.0 IEBCOPY MESSAGES AND CONTROL STATEMENTS PAGE 1IEB1135I IEBCOPY FMID HDZ11G0 SERVICE LEVEL UA07761 DATED 20031212 DFSMS 01.03.00 z/OS 01.04.00 HBB7707 CPU 2064IEB1035I 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 1024IEB1013I COPYING FROM PDS INDD=DD1 VOL=D7S002 DSN=DSVAABLB.ENDEVOR.BATCH.LOADLIBIEB1014I TO PDS OUTDD=DD2 VOL=AABBR2 DSN=DSVAABLB.BATCH.LOADLIBIEB167I FOLLOWING MEMBER(S) COPIED FROM INPUT DATA SET REFERENCED BY DD1IEB19AI MEMBER TABTR9Z9 COPIED AND REBLOCKED.IEB1098I 1 OF 1 MEMBERS COPIED FROM INPUT DATA SET REFERENCED BY DD1IEB144I THERE ARE 5616 UNUSED TRACKS IN OUTPUT DATA SET REFERENCED BY DD2IEB149I THERE ARE 538 UNUSED DIRECTORY BLOCKS IN OUTPUT DIRECTORYIEB147I END OF JOB - 0 WAS HIGHEST SEVERITY CODE

108

Page 109: MF_DB2

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 INCLUDE SQLCA END-EXEC.

109

Page 110: MF_DB2

* 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 DISPLAY 'O PROGRAMA SERA CANCELADO' MOVE 4 TO RETURN-CODE STOP RUN

110

Page 111: MF_DB2

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.

111

Page 112: MF_DB2

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 : 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-CODEXEC SQL SELECT T_COD, T_NOME, T_EMAIL INTO :W-COD, :W-NOME, :W-EMAIL:W-EMAIL-NULL FROM TABELA WHERE T-COD = :W-CODEND-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-IFEND-IF

112

Page 113: MF_DB2

APÊNDICE V – Exemplos de tabelas DB2

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

113

Page 114: MF_DB2

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

114

Page 115: MF_DB2

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)

115

Page 116: MF_DB2

116

Modelo Lógico

Modelo Físico

Page 117: MF_DB2

117