Você está na página 1de 66

DATA BASE 2

DB2
(Data Base 2)

DB2

Programao

Copyright by UPNGO Training 2006 www.upngo.com.br

DATA BASE 2
NDICE
Assunto

Pgina

Introduo
2
Conceitos
3
Variveis HOST
4
Compilao
5
Compilao
6
Ambiente DB2
7
Conceitos
8
Comandos SPUFI X COBOL
9
Excluindo uma tabela
10
Criando uma tabela
11
Excluindo indixes de uma tabela
12
Criando indeixes de uma tabela
13
Execluindo uma viso de uma tabela
14
Criando uma viso de uma tabela
15
Incluindo informaes do DB2 no programa
16
Selecionando colunas de uma nica linha
17
Selecionando todas colunas de uma nica linha
18
Selecionando colunas de vrias linhas
19
Selecionando todas colunas de vrias linhas
20
Prendendo o curso numa declarao
21
Obtendo colunas nulas de uma linha
22
Incluindo uma linha numa tabela
23
Incluindo colunas nulas em uma linha na tabela
24
Alterando linhas de uma tabela
26
Alterando linha corrente de uma tabela
27
Excluindo linhas de uma tabela
28
Excluindo linha corrente de uma tabela
29
Contando nmeros de linhas de uma tabela
30
Calculando mdia,somatria,mnimo e mximo
31
Sub-seleo de uma ou mais linhas
32
Selecionando distintamente linhas de uma tabela
33
Selecionado linhas entre valores
34
Selecionando linhas de uma tabela com vrios valores 35
Juntando duas ou mais tabelas(INNER JOIN)
36
Juntando duas ou mais tabelas(FULL OUTER JOIN)
37
Juntando duas ou mais tabelas(LEFTH OUTER JOIN) 38
Juntando duas ou mais tabelas(RIGTH OUTER JOIN) 39
Unindo duas ou mais tabelas(UNION)
40
Agrupando colunas de uma tabela
42
Selecionado partes do contedo de uma coluna
43
Usando o iterativo do DB2 (SPUFI)
44
Copyright by UPNGO Training 2006 www.upngo.com.br

Assunto

Pgina

Gerando book cobol imagem das tabelas DB2(DCLGEN) 52


Fazendo programa BATCH com DB2
55
Fazendo JOB para executar programas em DB2
57
Dicas e orientaes prticas
59
Cdigos de resgtorna do DB2 (SQLCODE)
64

DATA BASE 2
INTRODUO

Objetivo
Esta apostila se prope a ser um curso completo de DB2 voltado para desenvolvedores de aplicativos, para que no final do
curso possamos formar programadores aptos no uso do DB2.

Tpicos
Conceitos sobre o banco de dados relacional DB2.
Variveis HOST.
Pr-compilador/Compilador/Linkeditor e BIND
Comandos do DB2.
Usando o SPUFI - Comandos interativos
Usando o DCLGEN - Geraldo variveis HOST das tabelas
Fazendo programas em Cobol II (Batch) com DB2.
Dicas e orientaes prticas.

Copyright by UPNGO Training 2006 www.upngo.com.br

DATA BASE 2
CONCEITOS

O DB2 um banco de dados que funciona com dois mdulos principais, um mdulo de acessos, e o outro, o
dispositivo fsico de armazenagem dos dados foi criado o conceito de TABLE SPACE e TABELAS, pois um DATA SPACE pode
conter uma ou mais TABELAS, as tabelas so os dispositivos fsicos a onde se encontram as LINHAS que contero as
COLUNAS de dados.

Armazenagem de Dados
TABLE SPACE
TABELA
LINHA
COLUNAS

- rea que conter (o) a(s) tabela(s).


- Arquivo de dados
- Registro de dados
- Campos onde contero as informaes

Mdulos de Acesso
Conjunto de programas do DB2 que faro o interface entre o aplicativo e o banco de dados fsico, que interpretaro as
instrues o SQL (Struture Query Language) do aplicativo. Os comandos SQL quando no contexto das linguagens usa o prefixo
EXEC SQL. os compiladores das linguagens tradicionais no conhecem este prefixo, para isso existem os pr-compiladores
que transformam todos SQL em CALL, que de entendimento geral de todas linguagens.

Copyright by UPNGO Training 2006 www.upngo.com.br

DATA BASE 2
VARIVEIS HOST

Nas linguagens de programao, temos que hospedar os contedo das colunas de uma linha de uma tabela no comando EXEC SQL
em variveis, que denominamos de HOST, as variveis HOST so definidas conforme a linguagem de programao, mas nos
comandos SQL elas so precedidas de :, elas devero ser compatveis em tamanho e configurao com as colunas da linha, vide
quadro abaixo:

Numricos
DB2

PL/I

SMALLINT
INTEGER
DECIMAL(3,2)
FLOAT (21)
FLOAT (53)

COBOL

ASSEMBLER

FORTRAN

DCL V1 BIN FIXED(15)


01 V1 PIC S9(4) COMP
DCL V2 BIN FIXED(31)
01 V2 PIC S9(9) COMP
DCL V3 DEC FIXED(3,2) 01 V3 PIC S9(1)V99 COMP-3
DCL V4 BIN
01 V4 COMP-1
DCL V5 BIN FLOAT(53) 01 V5 COMP-2

V1 DS H
V2 DS F
V3 DC PL0.00
V4 DS E
V5 DS D

INTEGER*2/V1
INTEGER*4 V2
REAL *8 V3
REAL*4 VAR4
REAL*8 VAR5

PL/I

COBOL

ASSEMBLER

FORTRAN

01 V1 PIC X(10)
01 V2.
05 V2L PIC S9(4) COMP.
05 V2X PIC X(80).

V1 DS CL0
V2 DS H,CL80

CHARACTE*10
CHARACTE*80 V2

Alfanumricos
DB2

CHAR(10)
DCL V1 CHAR(10)
V1 VARCHAR(80) DCL V2 CHAR(80) VAR

Data/Hora/Timestamp
DB2

PL/I

COBOL

ASSEMBLER

FORTRAN

DATE
TIME
TIMESTAMP

DCL V1 CHAR(10)
DCL V2 CHAR(08)
DCL V3 CHAR(26)

01 V1 PIC X(10)
01 V2 PIC X(08)
01 V3 PIC X(26)

V1 DS CL10
V2 DS CL8
V3 DS CL26

CHARACTER*10 V1
CHARACTER*8 V2
CHARACTER*26 V3

Copyright by UPNGO Training 2006 www.upngo.com.br

DATA BASE 2
COMPLILAO

Quando compilamos um fonte com comandos SQL, temos quatro fases distintas:
Pr-compilao
Compilao
Linkedio
BIND

Pr-Compilao
Verifica a sintaxe do SQL
Inclui as declaraes das tabelas SQL e variveis HOST
Inclui SQLCA
Gera o fonte modificado com comandos SQL traduzidos para CALL
Cria o DBRM com os comando SQL copiados

Nota
DBRM

- DATA BASE REQUEST MODULE, contm todas as instrues SQL do programa fonte, e deste mdulo que o BIND faz uso
para criar o plano de acesso.

Compilao
Gera os mdulos objetos a partir do fonte traduzido pelo pr-compilador
O TIMESTAMP copiado para o mdulo gerado para futuras comparaes com a criao da tabela

Copyright by UPNGO Training 2006 www.upngo.com.br

DATA BASE 2
COMPLILAO

Linkedio
Gera os mdulos de carga a partir dos mdulos objeto
Gera os mdulos de acesso ao DB2
O TIMESTAMP copiado para o mdulo gerado

Bind
Gera o plano a partir da DBRM e mdulos de carga a partir dos mdulos objeto
O TIMESTAMP copiado para a DBRM
O plano contm a estratgia de acesso ao DB2, onde so descritos as informaes:
Validao: Checagem das referncias das tabelas e colunas, checagem das descries das tabelas e colunas
Autorizao: Acessos requeridos, usurios autorizados
Estratgia de acesso: ndices utilizados, estratgia de locking, estratgia de resoluo dos comandos JOIN, UNION e Etc e
caractersticas fsicas

Copyright by UPNGO Training 2006 www.upngo.com.br

DATA BASE 2
AMBIENTE DB2

Viso Geral do Ambiente DB2

Aplicativo

BIND

Mdulos
Acesso

Tabela

Tabela

Mdulos
Acesso

Tabela

Copyright by UPNGO Training 2006 www.upngo.com.br

Tabela

DBRM

Mdulos
Acesso

Tabela

Tabela

DATA BASE 2
CONCEITOS
LUW - Logical Unit of Work
Existe o conceito no DB2 de todos os comandos de manuteno nas tabelas (INSERT,UPDATE,DELETE,Etc) criarem a LUW (Logical
Unit of Work) que espelhar a imagem das linhas antes de suas manutenes em uma aplicao, de tal forma que se houver um
ABEND no aplicativo, o DB2 far uso da LUW para desfazer (RECOVERY) todas as manutenes at o momento do ABEND, os
comandos COMMIT WORK e ROLLBACK WORK influenciam na CRIAO e RECOVERY da LUW, sendo seu uso muito importante e
dever ser bem estudado para cada aplicao.

EFETIVANDO as ALTERAOES nas tabelas


O comando COMMIT efetivar at o momento de sua execuo todas as alteraes feitas nas tabelas envolvidas em uma
aplicao, efetivando as manutenes e limpando a LUW da aplicao, aps este comando no teremos mais como desfazer as
alteraes das tabelas envolvidas.
*--------------------------------------------------------*
PROCEDURE DIVISION.
*--------------------------------------------------------*
EXEC SQL COMMIT WORK END-EXEC.

DESFAZENDO as ALTERAOES nas tabelas


O comando ROLLBACK no efetivar as manutenes at o momento de sua execuo, todas as alteraes feitas nas tabelas
envolvidas de uma aplicao no sero efetivadas, os dados contidos na LUW da aplicao sero restaurados nas tabelas
envolvidas.
*--------------------------------------------------------*
PROCEDURE DIVISION.
*--------------------------------------------------------*
EXEC SQL ROLLBACK WORK END-EXEC.

NOTA
Todos os CURSORES abertos sero fechado, exceto os cursores abertos por WITH HOLD que permanecero abertos.
O trmino normal do aplicativo ser executado um COMMIT WORK automaticamente.
O trmino anormal do aplicativo ser executado um ROLLBACK WORK automaticamente.

Copyright by UPNGO Training 2006 www.upngo.com.br

DATA BASE 2
COMANDOS

SPUFI X COBOL
Existem dois modos de executarmos os comandos SQL no DB2, o primeiro modo pelo utilitrio SPUFI, onde podemos executar os
comandos interativamente pelo TSO e o segundo usando um aplicativo programvel (COBOL/PLI e outros) onde o aplicativo
far a acesso ao DB2. Nos comandos que se seguem as sintaxes sero divididas em dois mdulo (SPUFI e COBOL) para que
possamos diferenciar a execuo dos mesmos.

Copyright by UPNGO Training 2006 www.upngo.com.br

DATA BASE 2
COMANDOS

EXCLUINDO uma tabela DB2

COBOL
EXEC SQL DROP TABLE DBAUPNGO.TBALUNOS
IN DBAUPNGO.TBSUPNGO
END-EXEC

SPUFI
DROP TABLE DBAUPNGO.TBALUNOS
IN DBAUPNGO.TBSUPNGO;

Parmetros
DBAUPNGO: Proprietrio (OWNER) da tabela, pois somente o proprietrio da tabela que podefazer manutenes nas mesma ou a
quem ele der privilgios (GRANT).
TBSUPNGO: TABLE SPACE vinculada a tabela.

NOTA
Podemos usar tambm o OWNER DBADB2 e no indicarmos o TABLE SPACES, o DB2 assumiria O TABLE SPACE padro da instalao.
Ex: DROP TABLE DBADB2.TBALUNOS;

Copyright by UPNGO Training 2006 www.upngo.com.br

10

DATA BASE 2
COMANDOS

CRIANDO uma tabela DB2

COBOL
EXEC SQL CREATE TABLE DBAUPNGO.TBALUNOS
(MATRICULA
DECIMAL (07) NOT NULL,
NOME
CHAR
(35) NOT NULL,
NASCIMENTO DATE)
IN DBAUPNGO.TBSUPNGO
END-EXEC

SPUFI
CREATE TABLE DBAUPNGO.TBALUNOS
(MATRICULA
DECIMAL (07) NOT NULL,
NOME
CHAR
(35) NOT NULL,
NASCIMENTO DATE)
IN DBAUPNGO.TBSUPNGO;

Parmetros
DBAUPNGO: Proprietrio (OWNER) da tabela, pois somente o proprietrio da tabela que pode fazer manutenes nas mesma ou a
quem ele der privilgios (GRANT).
TBSUPNGO: TABLE SPACE vinculada a tabela.

NOTA
Veja as definies das variveis HOST /Decimal,Char,Date e etc.) no captulo atributos de colunas da tabela

Copyright by UPNGO Training 2006 www.upngo.com.br

11

DATA BASE 2
COMANDOS

EXCLUINDO ndices de uma tabela DB2

COBOL
*-------------------------------------------*
* INDICE UNICO POR MATRICULA
*-------------------------------------------*
EXEC SQL DROP INDEX DBAUPNGO.TBALUNOS_AIX1
IN DBAUPNGO.TBSUPNGO
END-EXEC
*-------------------------------------------*
* INDICE NAO UNICO POR NOME
*-------------------------------------------*
EXEC SQL DROP INDEX DBAUPNGO.TBALUNOS_AIX2
IN DBAUPNGO.TBSUPNGO
END-EXEC

SPUFI
-- *-------------------------------------------*
-- INDICE UNICO POR MATRICULA
-- *-------------------------------------------*
DROP INDEX DBAUPNGO.TBALUNOS_AIX1
IN DBAUPNGO.TBSUPNGO;
-- *-------------------------------------------*
-- INDICE NAO UNICO POR NOME
-- *-------------------------------------------*
DROP INDEX DBAUPNGO.TBALUNOS_AIX2
IN DBAUPNGO.TBSUPNGO;

Parmetros
DBAUPNGO: Proprietrio (OWNER) da tabela, pois somente o proprietrio da tabela que pode fazer manutenes nas mesma ou a
quem ele der privilgios (GRANT).
TBSUPNGO: TABLE SPACE vinculada a tabela.

Copyright by UPNGO Training 2006 www.upngo.com.br

12

DATA BASE 2
COMANDOS

CRIANDO ndices de uma tabela DB2

COBOL
*-------------------------------------------*
* INDICE UNICO POR MATRICULA
*-------------------------------------------*
EXEC SQL CREATE UNIQUE INDEX
DBAUPNGO.TBALUNOS_AIX1 ON
DBAUPNGO.TBALUNOS
MATRICULA ASC)
IN DBAUPNGO.TBSUPNGO
END-EXEC
*-------------------------------------------*
* INDICE NAO UNICO POR NOME
*-------------------------------------------*
EXEC SQL CREATE INDEX
DBAUPNGO.TBALUNOS_AIX2 ON
DBAUPNGO.TBALUNOS
NOME ASC)
IN DBAUPNGO.TBSUPNGO
END-EXEC

SPUFI
-- *-------------------------------------------*
-- INDICE UNICO POR MATRICULA
-- *-------------------------------------------*
CREATE UNIQUE INDEX
DBAUPNGO.TBALUNOS_AIX1 ON
DBAUPNGO.TBALUNOS
MATRICULA ASC)
IN DBAUPNGO.TBSUPNGO;
-- *-------------------------------------------*
-- INDICE NAO UNICO POR NOME
-- *-------------------------------------------*
CREATE INDEX
DBAUPNGO.TBALUNOS_AIX2 ON
DBAUPNGO.TBALUNOS
NOME ASC)
IN DBAUPNGO.TBSUPNGO;

Parmetros
UNIQUE: O ndice no poder ter valores repetitivos, a ausncia deste parmetro ser assumidoNONUNIQUE CLUSTER que indicar
que o ndice poder ter valores repetitivos.
INDEX: Nome do ndice que ser criado para tabela.
ASC : Indicar que o ndice ser em ordem ascendente, bem como o parmetro DESC indicar que o ndice ser em ordem
descendente.

NOTA
Poderemos ter mais de uma coluna como ndice, por exemplo:
CREATE

UNIQUE INDEX
DBAUPNGO.TBALUNOS_AIX9 ON
DBAUPNGO.TBALUNOS
(MATRICULA ASC, NASCIMENTO DESC)
IN DBAUPNGO.TBSUPNGO;

Copyright by UPNGO Training 2006 www.upngo.com.br

13

DATA BASE 2
COMANDOS

EXCLUINDO uma viso de uma tabela DB2

COBOL
EXEC SQL DROP VIEW DBAUPNGO.TBVIEW
IN DBAUPNGO.TBSUPNGO
END-EXEC

SPUFI
DROP VIEW DBAUPNGO.TBVIEW
IN DBAUPNGO.TBSUPNGO;

Parmetros
TBVIEW

: Tabela que ser viso de uma ou mais tabelas.

Copyright by UPNGO Training 2006 www.upngo.com.br

14

DATA BASE 2
COMANDOS

CRIANDO uma viso de uma tabela DB2


O DB2 nos permite criar uma tabela auxiliar (viso) em tempo de execuo que poder ser uma combinao de uma ou mais
tabelas

COBOL

SPUFI

*----------------------------------------------*
WORKING-STORAGE SECTION.
*----------------------------------------------*
EXEC SQL DECLARE CURSOR-VIEW CURSOR FOR
SELECT NOME-VIEW
FROM
DBAUPNGO.TBVIEW
END-EXEC.
*----------------------------------------------*
PROCEDURE DIVISION.
*----------------------------------------------*
EXEC SQL CREATE VIEW DBAUPNGO.TBVIEW
(MATRICULA-VIEW,
NOME-VIEW)
AS SELECT MATRICULA,
NOME
FROM
DBAUPNGO.TBALUNOS
WHERE NOME <> JOSE
END-EXEC.
EXEC SQL OPEN CURSOR-VIEW
EXEC SQL FETCH CURSOR-VIEW
EXEC SQL CLOSE CURSOR-VIEW

CREATE VIEW DBAUPNGO.TBVIEW


(MATRICULA-VIEW,
NOME-VIEW)
AS SELECT MATRICULA,
NOME
FROM
DBAUPNGO.TBALUNOS
WHERE
NOME <> JOSE;
-SELECT NOME-VIEW
FROM DBAUPNGO.TBVIEW;

END-EXEC.
INTO :NOME END-EXEC
END-EXEC.

NOTA
Note que a tabela TBVIEW (Viso da TBALUNOS) tratada como se fosse uma tabela na instruo DECLARE.

Copyright by UPNGO Training 2006 www.upngo.com.br

15

DATA BASE 2
COMANDOS

INCLUINDO informaes do DB2 no programa


Incorporando o bloco de informaes do SQL e uma TABELA ao programa.

COBOL
*---------------------------------------------*
WORKING-STORAGE SECTION.
*---------------------------------------------*
*DECLARACOES DAS VARIAVEIS HOST
*---------------------------------------------*
01
WK-LINHA-ALUNOS.
05 WK-MATRICULA PIC S9(04) COMP VALUE 0.
05 WK-NOME
PIC X(35) VALUE .
*---------------------------------------------*
* DECLARACOES DAS VARIAVEIS DE AMBIENTE
*---------------------------------------------*
EXEC SQL INCLUDE SQLCA END-EXEC.
*---------------------------------------------*
* DECLARACOES DAS VARIAVEIS DA TABELA ALUNOS
*---------------------------------------------*
EXEC SQL INCLUDE TBALUNOS END-EXEC.

SPUFI
No Existe

NOTA
SQLCA - Conter os cdigos de retorno do DB2, que faro interface com o aplicativo, entre eles o (Vide ANEXO 1) que conter os
valores de retorno de qualquer comando SQL executado no aplicativo.
INCLUDE TBALUNOS - Conter as variveis HOST das colunas da tabela TBALUNOS, este include ser gerado para o COBOL, podendo
ser gerado para outras linguagens pelo DCLGEN.

Copyright by UPNGO Training 2006 www.upngo.com.br

16

DATA BASE 2
COMANDOS

SELECIONANDO colunas de uma NICA linha


Para selecionar colunas de uma nica linha de uma tabela, usaremos o comando SELECT com isso estaremos informando ao
DB2 que somente retornar uma linha da tabela, dando o sentido de leitura direta , se retornar mais de uma linha, ou
no encontrar o argumento de pesquisa da linha em questo, o SQLCODE retornar com valor diferente de zero, e os
dados que estaro disponveis nas variveis HOST ser da primeira linha obtida.

COBOL
*--------------------------------------------*
PROCEDURE DIVISION.
*--------------------------------------------*
MOVE 10 TO
MATRICULA.
EXEC SQL SELECT MATRICULA,
NOME,
NASCIMENTO
INTO :MATRICULA,
:NOME,
:NASCIMENTO
FROM
DBAUPNGO.TBALUNOS
WHERE MATRICULA = :MATRICULA
END-EXEC.

SPUFI
SELECT MATRICULA,
NOME,
NASCIMENTO
FROM
DBAUPNGO.TBALUNOS
WHERE MATRICULA = 10;

Parmetros
SELECT : Seleciona as colunas da tabela TBALUNOS
INTO : Move o contedo da coluna para variveis HOST
FROM : DBAUPNGO.TBALUNOS onde DBAUPNGO o OWNER (proprietrio da tabela) TBALUNOS a tabela.
WHERE : A tabela ser pesquisada pelo campo MATRICULA, neste caso, este campo campo-chave (PRIMARYKEY), isto , o
acesso ser direto pelo ndice,podemos usar outro campo NO-CHAVE, mas o acesso ser um SCAN na tabela, a tabela ser
lida do comeo ao fim at encontrar a condio do WHERE.

Copyright by UPNGO Training 2006 www.upngo.com.br

17

DATA BASE 2
COMANDOS

SELECIONANDO TODAS colunas de uma NICA linha


Para selecionar todas as colunas de uma nica linha de uma tabela, usaremos o comando SELECT com isso estaremos
informando ao DB2 que somente retornar uma linha do acesso tabela, dando o sentido de leitura direta , se retornar
mais de uma linha, ou no encontrar o argumento de pesquisa da linha em questo, o SQLCODE retornar com valor
diferente de zero, e os dados que estaro disponveis nas variveis HOST ser da primeira linha obtida.

COBOL
*--------------------------------------------*
PROCEDURE DIVISION.
*--------------------------------------------*
MOVE 10 TO
MATRICULA.
EXEC SQL SELECT *
INTO :LINHA-TBALUNOS
FROM
DBAUPNGO.TBALUNOS
WHERE MATRICULA = :MATRICULA
END-EXEC.

SPUFI
SELECT *
FROM
WHERE

DBAUPNGO.TBALUNOS
MATRICULA = 10;

Parmetros
INTO : Move o contedo de todas as colunas da linha da tabela TBALUNOS para varivel host do item de grupo LINHA-TBALUNOS
IMPORTANTE : No aconselhvel usar esta opo * nas linhas que contenha colunas nulas (dados inexistente), pois os
resultados sero inesperados.

Copyright by UPNGO Training 2006 www.upngo.com.br

18

DATA BASE 2
COMANDOS
SELECIONANDO colunas de VRIAS linhas
Para selecionar colunas de vrias linhas de uma tabela usaremos o comando DECLARE com a opo CURSOR FOR, com isso
estaremos informando ao DB2 que retornaro varias linhas da tabela, para isso um cursor dever ser definido,acessando
a tabela como se fosse um arquivo seqencial, somente retornaro as informaes que satisfaam as condies do WHERE.

COBOL
*--------------------------------------------*
WORKING-STORAGE SECTION.
*--------------------------------------------*
* DECLARANDO O CURSOR
*--------------------------------------------*
EXEC SQL DECLARE CURSOR-01
CURSOR FOR
SELECT MATRICULA,
NOME,
NASCIMENTO
FROM
DBAUPNGO.TBALUNOS
WHERE MATRICULA > :MATRICULA
END-EXEC.
*--------------------------------------------*
PROCEDURE
DIVISION.
*--------------------------------------------*
* ABRINDO O CURSOR
*--------------------------------------------*
MOVE 10 TO
MATRICULA.
EXEC SQL OPEN CURSOR-01 END-EXEC.
*--------------------------------------------*
* LENDO O CURSOR
*--------------------------------------------*
PERFORM UNTIL SQLCODE NOT EQUAL ZEROS
EXEC SQL FETCH CURSOR-01
INTO :MATRICULA,
:NOME,
:NASCIMENTO
END-EXEC
DISPLAY MATRICULA NOME NASCIMENTO
END-PERFORM.
*--------------------------------------------*
* FECHANDO O CURSOR
*--------------------------------------------*
EXEC SQL CLOSE CURSOR-01 END-EXEC.

SPUFI
SELECT MATRICULA, NOME, NASCIMENTO
FROM
DBAUPNGO.TBALUNOS
WHERE MATRICULA > 10;

Parmetros
SELECT : Seleciona as colunas da tabela TBALUNOS
INTO : Move o contedo da coluna para variveis HOST
FROM : DBAUPNGO.TBALUNOS onde DBAUPNGO o OWNER (proprietrio da tabela) TBALUNOS a tabela.
WHERE : A tabela ser pesquisada pelo campo MATRICULA, neste caso, este campo campo-chave (PRIMARYKEY), isto , o
acesso ser direto pelo ndice, podemos usar outro campo NO-CHAVE, mas o acesso ser um SCAN na tabela, a tabela ser
lida do comeo ao fim at encontrar a condio do WHERE.

NOTA
A clusula WHERE da declarao do cursor ser acionada no OPEN do mesmo, selecionando somente as linhas cuja as
matrculas sejam maiores que 10.
Copyright by UPNGO Training 2006 www.upngo.com.br

19

DATA BASE 2
COMANDOS

SELECIONANDO TODAS colunas de VRIAS linhas


Para selecionar todas colunas de vrias linhas de uma tabela usaremos o comando SELECT com a opo CURSOR FOR, com
isso estaremos informando ao DB2 que retornaro varias linhas da tabela, para isso um cursor dever ser
definido,acessando a tabela como se fosse um arquivo seqencial, somente retornaro as informaes que satisfaam as
condies do WHERE.

COBOL
*--------------------------------------------*
WORKING-STORAGE SECTION.
*--------------------------------------------*
* DECLARANDO O CURSOR
*--------------------------------------------*
EXEC SQL DECLARE CURSOR-01
CURSOR FOR
SELECT *
FROM
DBAUPNGO.TBALUNOS
WHERE MATRICULA > :MATRICULA
END-EXEC.
*--------------------------------------------*
PROCEDURE
DIVISION.
*--------------------------------------------*
* ABRINDO O CURSOR
*--------------------------------------------*
MOVE 10 TO
MATRICULA.
EXEC SQL OPEN CURSOR-01 END-EXEC.
*--------------------------------------------*
* LENDO O CURSOR
*--------------------------------------------*
PERFORM UNTIL SQLCODE NOT EQUAL ZEROS
EXEC SQL FETCH CURSOR-01
INTO :LINHA-TBALUNOS
END-EXEC
DISPLAY MATRICULA NOME NASCIMENTO
END-PERFORM.
*--------------------------------------------*
* FECHANDO O CURSOR
*--------------------------------------------*
EXEC SQL CLOSE CURSOR-01 END-EXEC.

SPUFI
SELECT *
FROM
WHERE

DBAUPNGO.TBALUNOS
MATRICULA > 10;

Parmetros
INTO : Move o contedo de todas as colunas da linha da tabela TBALUNOS para varivel host do item de grupo LINHA-TBALUNOS
IMPORTANTE : No aconselhvel usar esta opo * nas linhas que contenha colunas nulas (dados inexistente), pois os
resultados sero inesperados.

NOTA
A clusula WHERE da declarao do cursor ser acionada no OPEN do mesmo, selecionando somente as linhas cuja as
matrculas sejam maiores que 10.

Copyright by UPNGO Training 2006 www.upngo.com.br

20

DATA BASE 2
COMANDOS
PRENDENDO o CURSOR numa declarao
Para selecionar colunas de vrias linhas de uma tabela de tal forma que o comando COMMIT no feche automaticamente o
cursor declarado na seleo correspondente, devemos usar a opo WITH HOLD, com isso estaremos informando ao DB2
que o COMMIT no sortir efeito para este cursor.

COBOL
*--------------------------------------------*
WORKING-STORAGE SECTION.
*--------------------------------------------*
* DECLARANDO O CURSOR
*--------------------------------------------*
EXEC SQL DECLARE CURSOR-01
WITH HOLD FOR
SELECT *
FROM
DBAUPNGO.TBALUNOS
WHERE MATRICULA > :MATRICULA
END-EXEC.
*--------------------------------------------*
PROCEDURE
DIVISION.
*--------------------------------------------*
* ABRINDO O CURSOR
*--------------------------------------------*
MOVE 10 TO
MATRICULA.
EXEC SQL OPEN CURSOR-01 END-EXEC.
*--------------------------------------------*
* LENDO O CURSOR
*--------------------------------------------*
PERFORM UNTIL SQLCODE NOT EQUAL ZEROS
EXEC SQL FETCH CURSOR-01
INTO :LINHA-TBALUNOS
END-EXEC
DISPLAY MATRICULA NOME NASCIMENTO
END-PERFORM.
*--------------------------------------------*
* FECHANDO O CURSOR
*--------------------------------------------*
EXEC SQL CLOSE CURSOR-01 END-EXEC.

SPUFI
SELECT *
FROM
WHERE

DBAUPNGO.TBALUNOS
MATRICULA > 10;

Parmetros
INTO : Move o contedo de todas as colunas da linha da tabela TBALUNOS para varivel host do item de grupo LINHA-TBALUNOS
IMPORTANTE: No aconselhvel usar esta opo * nas linhas que contenha colunas nulas(dados inexistente), pois os
resultados sero inesperados.

NOTA
O comando COMMIT tem a funo de efetivar as alteraes at o momento de sua execuo, veremos mais detalhes do
comando COMMIT neste curso.

Copyright by UPNGO Training 2006 www.upngo.com.br

21

DATA BASE 2
COMANDOS
OBTENDO colunas NULAS de uma linha
Para obtermos colunas que possivelmente podem no estar populadas (nulas) nas linhas de uma tabela usaremos as
variveis indicadoras, que contero aps o FETCH os valores podero ser: 0 indicando que a coluna no nula
ou -1 indicando que a coluna nula.

COBOL
*--------------------------------------------*
WORKING-STORAGE SECTION.
*--------------------------------------------*
* DECLARANDO AS VARIAVEIS INDICADORAS
*--------------------------------------------*
77 WK-IND-NOME PIC S9(04) COMP VALUE ZEROS.
*--------------------------------------------*
* DECLARANDO O CURSOR
*--------------------------------------------*
EXEC SQL DECLARE CURSOR-01
WITH HOLD FOR
SELECT NOME, NASCIMENTO
FROM
DBAUPNGO.TBALUNOS
WHERE MATRICULA > :MATRICULA
END-EXEC.
*--------------------------------------------*
PROCEDURE
DIVISION.
*--------------------------------------------*
* ABRINDO O CURSOR
*--------------------------------------------*
MOVE 10 TO
MATRICULA.
EXEC SQL OPEN CURSOR-01 END-EXEC.
*--------------------------------------------*
* LENDO O CURSOR
*--------------------------------------------*
PERFORM UNTIL SQLCODE NOT EQUAL ZEROS
EXEC SQL FETCH CURSOR-01
INTO :NOME :WK-IND-NOME,
:NASCIMENTO
END-EXEC
IF WK-IND-NOME EQUAL -1
DISPLAY NOME NULO NASCIMENTO
ELSE
DISPLAY NOME NASCIMWENTO
END-IF
END-PERFORM.
*--------------------------------------------*
* FECHANDO O CURSOR
*--------------------------------------------*
EXEC SQL CLOSE CURSOR-01 END-EXEC.

SPUFI
SELECT NOME, NASCIMENTO
FROM
DBAUPNGO.TBALUNOS
WHERE MATRICULA > 10;

NOTA
As variveis indicadoras sero colocadas logo aps as variveis HOST sem separao por vrgula, pois se assim fizermos o SQL
entenderia que uma varivel HOST referente a uma coluna, a configurao dela uma HALF-WORD binria S9(04) COMP.

Copyright by UPNGO Training 2006 www.upngo.com.br

22

DATA BASE 2
COMANDOS
INCLUINDO uma linha na tabela
Para inserir uma linha em uma tabela, usaremos o comando INSERT, note, que na verdade estaremos populando as colunas
de uma linha, devemos tomar cuidado com as colunas nulas.

COBOL
*--------------------------------------------*
PROCEDURE
DIVISION.
*--------------------------------------------*
MOVE 10
TO MATRICULA.
MOVE JOSE
TO NOME.
MOVE 1978-10-23 TO NASCIMENTO
EXEC SQL INSERT
INTO DBAUPNGO.TBALUNOS
(MATRICULA,
NOME,
NASCIMENTO)
VALUES
(:MATRICULA,
:NOME,
:NASCIMENTO)
END-EXEC.

SPUFI
INSERT INTO DBAUPNGO.TBALUNOS
(MATRICULA,
NOME,
NASCIMENTO)
VALUES (10,
JOSE,
1978-10-23);

Parmetros
VALUES: Relao dos campos que contero os dados das colunas serem inseridas na tabela, devero estar na mesma ordem
das colunas definidas na clausula INTO

NOTA
Somente podero serem suprimidas as colunas que foram declaradas como nulas na tabela
OBS: Coluna nula a coluna da tabela que s tenha definio de seus atributos, mas no foi populada (no contm dados).

Copyright by UPNGO Training 2006 www.upngo.com.br

23

DATA BASE 2
COMANDOS
INCLUINDO colunas NULAS na linha de uma tabela
Para no popular as colunas nulas em uma linha de uma tabela, podemos utilizar dois mtodos, o primeiro, usando as
variveis indicadoras com o valor -1 , o segundo omitindo as colunas nulas que no desejamos popular, em ambos os casos
estamos informando ao DB2 que aquelas colunas no contero valores.

COBOL
*---------------------------------------*
WOKING-STORAGE SECTION
*---------------------------------------*
* DECLARACOES DAS VARIAVEIS INDICADORAS
*---------------------------------------*
77
WK-VAR-NOME PIC S9(04)COMP VALUE 0.
*---------------------------------------*
PROCEDURE DIVISION.
*---------------------------------------*
MOVE 10
TO MATRICULA.
MOVE JOSE
TO NOME.
MOVE -1
TO WK-VAR-NOME.
MOVE 1978-10-23 TO NASCIMENTO
EXEC SQL INSERT INTO DBAUPNGO.TBALUNOS
(MATRICULA,
NOME,
NASCIMENTO)
VALUES
(:MATRICULA,
:NOME :WK-VAR-NOME
:NASCIMENTO)
END-EXEC.

SPUFI
INSERT INTO DBAUPNGO.TBALUNOS
(MATRICULA,
NASCIMENTO)
VALUES (10,
1978-10-23);

Mtodo
Varivel indicadora

NOTA
Neste caso mesmo informando o n contedo do nome, o DB2 deixar esta coluna nula, pois a varivel indicadora da coluna est
com 1, indicando que a coluna esta nula.

Copyright by UPNGO Training 2006 www.upngo.com.br

24

DATA BASE 2
COMANDOS
INCLUINDO colunas NULAS na linha de uma tabela
Para no popular as colunas nulas em uma linha de uma tabela, podemos utilizar dois mtodos, o primeiro, usando as
variveis indicadoras com o valor -1 , o segundo omitindo as colunas nulas que no desejamos popular, em ambos os casos
estamos informando ao DB2 que aquelas colunas no contero valores.

COBOL
*---------------------------------------*
WOKING-STORAGE SECTION
*---------------------------------------*
* DECLARACOES DAS VARIAVEIS INDICADORAS
*---------------------------------------*
77
WK-VAR-NOME PIC S9(04)COMP VALUE 0.
*---------------------------------------*
PROCEDURE DIVISION.
*---------------------------------------*
MOVE 10
TO MATRICULA.
MOVE 1978-10-23 TO NASCIMENTO
EXEC SQL INSERT INTO DBAUPNGO.TBALUNOS
(MATRICULA,
NASCIMENTO)
VALUES
(:MATRICULA,
:NASCIMENTO)
END-EXEC.

SPUFI
INSERT INTO DBAUPNGO.TBALUNOS
(MATRICULA,
NASCIMENTO)
VALUES (10,
1978-10-23);

Mtodo
Omitindo a coluna
NOME

NOTA
Neste caso no informaremos a coluna NOME o DB2 deixar esta coluna nula, pois ela no ser inserida na linha da tabela.

Copyright by UPNGO Training 2006 www.upngo.com.br

25

DATA BASE 2
COMANDOS
ALTERANDO linhas de uma tabela
Para alterar linhas em uma tabela sem que esta esteja previamente em HOLD, usaremos o comando UPDATE.

COBOL
*---------------------------------------*
PROCEDURE DIVISION.
*---------------------------------------*
MOVE 10
TO MATRICULA.
MOVE JOAO TO NOME.
EXEC SQL
UPDATE DBAUPNGO.TBALUNOS
SET
NOME = :NOME
WHERE MATRICULA = :MATRICULA
END-EXEC.

SPUFI
UPDATE DBAUPNGO.TBALUNOS
SET
NOME = JOAO
WHERE
MATRICULA = 10;

Sero excludas todas as linhas da tabela que satisfazerem as condies da clausula WHERE.

Parmetros
SET : Sero alteradas todas as colunas NOME da tabela que satisfazerem as condies da clausula WHERE.

NOTA
Neste caso somente ser bloqueada a pagina que conter a linha, no momento da execuo do comando de alterao.
Tipos de bloqueios : Pgina: Vrias linhas que compem uma pgina ficam bloqueadas
Linha : Somente a linha da tabela fica bloqueada

Copyright by UPNGO Training 2006 www.upngo.com.br

26

DATA BASE 2
COMANDOS
ALTERANDO a linha CORRENTE de uma tabela
Para alterar coluna(s) da(s) linha(s) de uma tabela usaremos o comando SELECT com a opo CURSOR FOR ,FOR UPDATE
OF e CURRENT OF, com isso estaremos informando ao DB2 que a(s) linha(s) recuperada(s) da tabela estaro em HOLD para
ser(em) alterada(s).

COBOL
*-------------------------------------------*
WORKING-STORAGE SECTION.
*-------------------------------------------*
EXEC SQL DECLARE CURSOR-NOME CURSOR FOR
SELECT NOME
FROM
DBAUPNGO.TBALUNOS
FOR
UPDATE OF NOME
END-EXEC.
*-------------------------------------------*
PROCEDURE DIVISION.
*-------------------------------------------*
EXEC SQL OPEN CURSOR-NOME END-EXEC.
EXEC SQL FETCH CURSOR-NOME
INTO :NOME
END-EXEC.
IF NOME EQUAL JOSE
MOVE JOAO TO NOME
EXEC SQL UPDATE DBAUPNGO.TBALUNOS
SET
NOME = :NOME
WHERE CURRENT OF CURSOR-NOME
END-EXEC
EXEC SQL CLOSE CURSOR-NOME END-EXEC.
END-IF

SPUFI
No h

Parmetros
CURRENT OF: Ser alterada a coluna NOME da linha corrente da tabela.

Copyright by UPNGO Training 2006 www.upngo.com.br

27

DATA BASE 2
COMANDOS
Excluindo linhas de uma tabela
Para excluir linhas em uma tabela, sem que esta esteja previamente em hold, usaremos o comando DELETE.

COBOL
*-------------------------------------------*
PROCEDURE DIVISION.
*-------------------------------------------*
MOVE 10 TO MATRICULA.
EXEC SQL DELETE FROM
DBAUPNGO.TBALUNOS
WHERE MATRICULA = :MATRICULA
ND-EXEC.

SPUFI
DELETE FROM
DBAUPNGO.TBALUNOS
WHERE MATRICULA = 10;

NOTA
Sero excludas todas as linhas da tabela que satisfazerem as condies da clausula WHERE.

Copyright by UPNGO Training 2006 www.upngo.com.br

28

DATA BASE 2
COMANDOS
Excluindo uma linha CORRENTE da tabela
Para excluir uma linha em uma tabela, que esteja previamente em hold, usaremos o comando DELETE com a parmetro de
CURRENT OF.

COBOL
*--------------------------------------------*
WORKING-STORAGE SECTION.
*--------------------------------------------*
EXEC SQL DECLARE CURSOR-NOMES CURSOR FOR
SELECT MATRICULA,
NOME
FROM
DBAUPNGO.TBALUNOS
WHERE NOME = :NOME
END-EXEC.
*--------------------------------------------*
PROCEDURE DIVISION.
*--------------------------------------------*
EXEC SQL OPEN CURSOR-NOME END-EXEC.
*
EXEC SQL FETCH CURSOR-NOME
INTO :MATRICULA,
:NOME
END-EXEC.
*
EXEC SQL DELETE FROM DBAUPNGO.TBALUNOS
WHERE CURRENT OF
CURSOR-NOME
END-EXEC
*
EXEC SQL CLOSE CURSOR-NOME END-EXEC.

SPUFI
No h

NOTA
Neste caso como houve um DECLARE com a opo CURSOR FOR a pagina lida foi bloqueada para as futuras excluses das linhas..

Copyright by UPNGO Training 2006 www.upngo.com.br

29

DATA BASE 2
COMANDOS
CONTANDO o nmero de linhas de uma tabela
Para contar quantas linhas existem em uma tabela usamos o comando COUNT.

COBOL
*-----------------------------------------------*
WORKING STORAGE SECTION.
*-----------------------------------------------*
77 WK-QTD-ALUNOS PIC S9(97) COMP-3 VALUE ZEROS.
*-----------------------------------------------*
PROCEDURE DIVISION.
*-----------------------------------------------*
MOVE JOSE
TO NOME.
EXEC SQL SELECT COUNT (*)
INTO :WK-QTD-ALUNOS
FROM
DBAUPNGO.TBALUNOS
WHERE NOME = :NOME
END-EXEC.
EXEC SQL SELECT COUNT (DISTINCT NOME)
INTO :WK-QTD-ALUNOS
FROM
DBAUPNGO.TBALUNOS
END-EXEC.

SPUFI
SELECT COUNT (*)
FROM DBAUPNGO.TBALUNOS
WHERE NOME = JOSE;

Caso 1

SELECT COUNT (DISTINCT NOME)


FROM
DBAUPNGO.TBALUNOS;

Caso 2

NOTA
CASO 1 : Ser contados todos ALUNOS chamado JOSE existem na tabela TBALUNOS
CASO 2 : Somente ser contado os nomes no repetitivos, isto , se houver dois JOSE somente ser contado um.

Copyright by UPNGO Training 2006 www.upngo.com.br

30

DATA BASE 2
COMANDOS
Calculado a MDIA, SOMATRIA, MNIMO e MXIMO
Para obtermos o valor MDIO, SOMATRIA, MNIMO e MXIMO de uma determinada coluna de uma tabela usamos os
parmetros AVG, SUM, MIN e MAX respectivamente no comando SELECT.

COBOL
*-----------------------------------------------*
WORKING STORAGE SECTION.
*-----------------------------------------------*
77 WK-MEDIA
PIC S9(97) COMP-3 VALUE ZEROS.
77 WK-SOMATORIA PIC S9(97) COMP-3 VALUE ZEROS.
77 WK-MINIMO
PIC S9(97) COMP-3 VALUE ZEROS.
77 WK-MAXIMO
PIC S9(97) COMP-3 VALUE ZEROS.
*----------------------------------------------*
PROCEDURE DIVISION.
*----------------------------------------------*
MOVE 10
TO MATRICULA.
EXEC SQL SELECT AVG(VALOR)INTO:WK-MEDIA,
SUM(VALOR)INTO:WK-SOMATORIA,
MIN(VALOR)INTO:WK-MINIMO,
MAX(VALOR)INTO:WK-MAXIMO
FROM
DBAUPNGO.TBCURSOS
WHERE NOME = :MATRICULA
END-EXEC.

SPUFI
SELECT

AVG(VALOR),
SUM(VALOR),
MIN(VALOR),
MAX(VALOR)
FROM
DBAUPNGO.TBCURSOS
WHERE NOME = 10;

NOTA
Obteremos os valores mdio, somatria, mnimo e mximo de todos os cursos do aluno cuja a matrcula seja 10.

Copyright by UPNGO Training 2006 www.upngo.com.br

31

DATA BASE 2
COMANDOS
SUB-SELEO de uma ou mais tabela
No DB2 existe o funo de sub-seleo, uma seleo prvia de uma tabela, que ser comparada com uma seleo de outra
tabela (nvel superior), este evento chamamos de SUBQUERY.

COBOL
*----------------------------------------------*
WORKING-STORAGE SECTION.
*----------------------------------------------*
EXEC SQL DECLARE CURSOR-SUB CURSOR FOR
SELECT T1.MATRICULA,T1.CURSO, T1.VALOR
FROM
DBAUPNGO.TBCURSOS T1
WHERE
T1.MATRICULA =
(SELECT NOME, NASACIMENTO
FROM DBAUPNGO.TBALUNOS T2
WHERE T2.MATRICULA = 10)
END-EXEC.
*----------------------------------------------*
PROCEDURE DIVISION.
*----------------------------------------------*
EXEC SQL OPEN
CURSOR-SUB END-EXEC.
EXEC SQL FETCH
CURSOR-SUB
INTO
:MATRICULA,
:CURSO,
:VALOR,
:NOME,
:NASCIMENTO
END-EXEC.
EXEC SQL CLOSE
CURSOR-SUB END-EXEC.

SPUFI
SELECT

T1.MATRICULA,T1.CURSO, T1.VALOR
FROM
DBAUPNGO.TBCURSOS T1
WHERE
T1.MATRICULA =
(SELECT NOME, NASACIMENTO
FROM DBAUPNGO.TBALUNOS T2
WHERE T2.MATRICULA = 10);

NOTA
O resultado da subquery ser retornado para o select de nvel superior
A subquery deve selecionar apenas uma linha
A subquery no pode conter os parmetros UNION, UNION ALL ou ORDER BY
Os operadores podem ser:
=><
retornam apenas uma linha (Igual,maior ou menor que alguma das colunas)
=any/in retornam vrias linhas (Igual a alguma coluna)
>any/<any retornam varias linhas (Maior/menor que alguma das colunas)

Copyright by UPNGO Training 2006 www.upngo.com.br

32

DATA BASE 2
COMANDOS
Selecionando DISTINTAMENTE linhas da tabela
Para selecionarmos apenas uma linha cujo o contedo de uma coluna seja repetitivo, usamos o comando DISTINCT, que faz
que uma coluna com contedo repetido s aparea uma vez.

COBOL
*----------------------------------------------*
WORKING-STORAGE SECTION.
*----------------------------------------------*
EXEC SQL DECLARE CURSOR-ALUNOS CURSOR FOR
SELECT DISTINCT NOME
FROM
DBAUPNGO.TBALUNOS
END-EXEC.
*----------------------------------------------*
PROCEDURE DIVISION.
*----------------------------------------------*
EXEC SQL OPEN CURSOR-ALUNOS END-EXEC.
EXEC SQL FETCH CURSOR-ALUNOS
INTO :NOME
END-EXEC.
EXEC SQL CLOSE CURSOR-ALUNOS END-EXEC.

SPUFI
SELECT

DISTINCT NOME
FROM DBAUPNGO.TBALUNOS;

NOTA
Na clausula DISTINCT somente ser selecionado um nome, para os nomes iguais, se existir trs JOSE ter selecionado apenas um.

Copyright by UPNGO Training 2006 www.upngo.com.br

33

DATA BASE 2
COMANDOS
Selecionando ENTRE VALORES nas linhas da tabela
Para selecionarmos linhas entre dois valores (inclusive) de uma determinada coluna usamos o comando BETWEEN.

COBOL
*----------------------------------------------*
WORKING-STORAGE SECTION.
*----------------------------------------------*
EXEC SQL DECLARE CURSOR-ALUNOS CURSOR FOR
SELECT NOME
FROM
DBAUPNGO.TBCURSOS
WHERE
NOME
BETWEEN ANTONIO AND JOAO
END-EXEC.
*----------------------------------------------*
PROCEDURE DIVISION.
*----------------------------------------------*
EXEC SQL OPEN CURSOR-ALUNOS END-EXEC.
EXEC SQL FETCH CURSOR-ALUNOS
INTO :NOME
END-EXEC.
EXEC SQL CLOSE CURSOR-ALUNOS END-EXEC.

SPUFI
SELECT
FROM
WHERE

NOME
DBAUPNGO.TBCURSOS
NOME BETWEEN ANTONIO AND JOAO;

NOTA
Poder ser usado o parmetro NOT BETWEEN, que selecionar todas as linhas cujo o argumento de pesquisa no esteja entre o
intervado de seleo

Copyright by UPNGO Training 2006 www.upngo.com.br

34

DATA BASE 2
COMANDOS
Selecionando linhas da tabela igual VRIOS valores
Podemos tambm selecionarmos linhas com vrios valores de uma determinada coluna, usando o parmetro IN.

COBOL
*----------------------------------------------*
WORKING-STORAGE SECTION.
*----------------------------------------------*
EXEC SQL DECLARE CURSOR-ALUNOS CURSOR FOR
SELECT NOME
FROM
DBAUPNGO.TBALUNOS
WHERE
NOME IN (ANTONIO, JOAO)
END-EXEC.
*----------------------------------------------*
PROCEDURE DIVISION.
*----------------------------------------------*
EXEC SQL OPEN CURSOR-ALUNOS END-EXEC.
EXEC SQL FETCH CURSOR-ALUNOS
INTO :NOME
END-EXEC.
EXEC SQL CLOSE CURSOR-ALUNOS END-EXEC.

SPUFI
DECLARE CURSOR-ALUNOS CURSOR FOR
SELECT NOME
FROM
DBAUPNGO.TBALUNOS
WHERE
NOME IN (ANTONIO, JOAO);

NOTA
A sintaxe do IN equivalente ao OR, podemos usar o parmetro NOT IN que selecionar todas as linhas cujo o contedo seja
diferente do argumento de pesquisa.

Copyright by UPNGO Training 2006 www.upngo.com.br

35

DATA BASE 2
COMANDOS
JUNTANDO duas ou mais tabelas
Para juntarmos em uma pesquisa duas ou mais tabelas usamos o comando SELECT/WHERE ou
ON INNER JOIN , somente sero selecionadas as linhas que tiverem correspondentes nas tabelas.

COBOL

SPUFI

*----------------------------------------------*
WORKING-STORAGE SECTION.
*----------------------------------------------*
EXEC SQL DECLARE CURSOR-JUNTOS CURSOR FOR
SELECT T1.MATRICULA,T1.NOME,
T2.CURSO,T2.VALOR
FROM
DBAUPNGO.TBALUNOS T1,
DBAUPNGO.TBCURSOS T2
WHERE
T1.MATRICULA = T2.MATRICULA
END-EXEC.
OU
EXEC SQL DECLARE CURSOR-JUNTOS CURSOR FOR
SELECT
T1.MATRICULA,T1.NOME,
T2.CURSO,T2.VALOR
FROM
DBAUPNGO.TBALUNOS T1
INNER JOIN DBAUPNGO.TBCURSOS T2
ON
T1.MATRICULA = T2.MATRICULA
END-EXEC.

SELECT T1.MATRICULA,T1.NOME,
T2.CURSO,T2.VALOR
FROM
DBAUPNGO.TBALUNOS T1,
DBAUPNGO.TBCURSOS T2
WHERE T1.MATRICULA = T2.MATRICULA;
OU
SELECT

T1.MATRICULA,T1.NOME,
T2.CURSO,T2.VALOR
FROM
DBAUPNGO.TBALUNOS T1,
INNER JOIN DBAUPNGO.TBCURSOS T2
ON
T1.MATRICULA = T2.MATRICULA;

EXEC SQL FETCH CURSOR-JUNTOS


INTO :MATRICULA, :NOME,
:CURSO, :VALOR
END-EXEC.
EXEC SQL CLOSE CURSOR-JUNTOS END-EXEC.

Exemplos
TBALUNOS
------------------------MATR NOME
---- ------------------0001 JOAO
0004 XUXA

TBCURSOS
------------------------MATR CURSO
VALOR
---- ----------- ------0001 ALEMAO
10,00
0001 INGLES
8,00
0004 INGLES
5,00

RESULTADO
-------------------------------MATR NOME
CURSO
VALOR
---- ----------- -------- ----0001 JOAO
ALEMAO
10,00
0001 JOAO
INGLES
8,00
0004 XUXA
INGLES
5,00

Parmetros
WHERE/INNER JOIN: A funo destes parmetros e juntar as tabelas, mas, somente sero juntadas as linhas da tabela TBALUNOS
cuja a MATRICULA tenha correspondente na tabela TBCURSOS.

NOTA
As colunas das duas tabelas so tratadas como se fossem de uma nica tabela, o parmetro WHERE que possibilita isto, note tambm,
que no comando DECLARE demos apelidos (ALIAS) para as tabelas TBALUNOS cujo alias T1, e a tabela TBCURSOS com o alias T2, isto
facilita quando formos nos referenciar as tabelas em nossos comandos.

Copyright by UPNGO Training 2006 www.upngo.com.br

36

DATA BASE 2
COMANDOS
JUNTANDO duas ou mais tabelas
Para juntarmos em uma pesquisa duas ou mais tabelas tabelas usamos o comando SELECT/ FULL OUTER JOIN , sero selecionadas as
linhas da tabela TBALUNOS e TBCURSOS, mesmo que no tenham correspondentes entre si.

COBOL

SPUFI

*----------------------------------------------*
WORKING-STORAGE SECTION.
*----------------------------------------------*
EXEC SQL DECLARE CURSOR-JUNTOS CURSOR FOR
SELECT
T1.MATRICULA,T1.NOME,
T2.CURSO,T2.VALOR
FROM
DBAUPNGO.TBALUNOS T1
FULL OUTER JOIN
DBAUPNGO.TBCURSOS T2
ON
T1.MATRICULA=T2.MATRICULA
END-EXEC.
EXEC SQL FETCH
INTO
END-EXEC.
EXEC SQL CLOSE

SELECT

T1.MATRICULA,T1.NOME,
T2.CURSO,T2.VALOR
FROM
DBAUPNGO.TBALUNOS T1
FULL OUTER JOIN
DBAUPNGO.TBCURSOS T2
ON
T1.MATRICULA = T2.MATRICULA;

CURSOR-JUNTOS
:MATRICULA, :NOME,
:CURSO, :VALOR
CURSOR-JUNTOS END-EXEC.

Exemplos
TBALUNOS
------------------------MATR NOME
---- ------------------0001 JOAO
0002 SERGIO
0004 XUXA

Parmetros

TBCURSOS
------------------------MATR CURSO
VALOR
---- ----------- ------0001 ALEMAO
10,00
0001 INGLES
8,00
0004 INGLES
5,00
0005 JAPONES
9,00

RESULTADO
-------------------------------MATR NOME
CURSO
VALOR
---- -------- -----------0001 JOAO
ALEMAO
10,00
0001 JOAO
INGLES
8,00
0002 SERGIO
----------0004 XUXA
INGLES
5,00
---- ------JAPONES
9,00

FULL OUTER JOIN: A funo deste parmetro e juntar as tabelas cuja a matricula tenha correspondente entre as tabelas
TBALUNOS e TBCURSOS , mas, as matriculas da tabela TBCURSOS que no tenham correspondente na tabela TBALUNOS sero
listadas com as colunas com contedos nulos.

NOTA
As colunas com contedos -------- so colunas nulas, no COBOL devemos assinalar as variveis indicadoras para cada uma
delas.
Copyright by UPNGO Training 2006 www.upngo.com.br

37

DATA BASE 2
COMANDOS
JUNTANDO duas ou mais tabelas
Para juntarmos em uma pesquisa duas ou mais tabelas tabelas usamos o comando SELECT/ LEFTH OUTER JOIN , sero
selecionadas as linhas da tabela TBALUNOS mesmo que estes no tenham correspondentes na TBCURSOS.

COBOL

SPUFI

*----------------------------------------------*
WORKING-STORAGE SECTION.
*----------------------------------------------*
EXEC SQL DECLARE CURSOR-JUNTOS CURSOR FOR
SELECT
T1.MATRICULA,T1.NOME,
T2.CURSO,T2.VALOR
FROM
DBAUPNGO.TBALUNOS T1
LEFT OUTER JOIN
DBAUPNGO.TBCURSOS T2
ON
T1.MATRICULA=T2.MATRICULA
END-EXEC.
EXEC SQL FETCH
INTO
END-EXEC.
EXEC SQL CLOSE

SELECT

T1.MATRICULA,T1.NOME,
T2.CURSO,T2.VALOR
FROM
DBAUPNGO.TBALUNOS T1
LEFT OUTER JOIN
DBAUPNGO.TBCURSOS T2
ON
T1.MATRICULA = T2.MATRICULA;

CURSOR-JUNTOS
:MATRICULA, :NOME,
:CURSO, :VALOR
CURSOR-JUNTOS END-EXEC.

Exemplos
TBALUNOS
------------------------MATR NOME
---- ------------------0001 JOAO
0002 SERGIO
0004 XUXA

Parmetros

TBCURSOS
------------------------MATR CURSO
VALOR
---- ----------- ------0001 ALEMAO
10,00
0001 INGLES
8,00
0004 INGLES
5,00
0005 JAPONES
9,00

RESULTADO
-------------------------------MATR NOME CURSO
VALOR
---- ----- ----------- ------0001 JOAO
ALEMAO
10,00
0001 JOAO
INGLES
8,00
0002 SERGIO ----------0004 XUXA
INGLES
5,00

LEFT OUTER JOIN: A funo deste parmetro e juntar as tabelas cuja a matricula tenha correspondente entre TBALUNOS e
TBCURSOS , mas, da tabela TBALUNOS viro todas as linhas e a tabela TBCURSOS somente viro as linhas que tiverem
correspondentes na tabela TBALUNOS.

NOTA
As colunas com contedos -------- so colunas nulas, no COBOL devemos assinalar as variveis indicadoras para cada uma
delas.

Copyright by UPNGO Training 2006 www.upngo.com.br

38

DATA BASE 2
COMANDOS
JUNTANDO duas ou mais tabelas
Para juntarmos em uma pesquisa duas ou mais tabelas tabelas usamos o comando SELECT/ RIGTH OUTER JOIN , sero
selecionadas as linhas da tabela TBCURSOS mesmo que estes no tenham correspondentes na TBALUNOS.

COBOL

SPUFI

*----------------------------------------------*
WORKING-STORAGE SECTION.
*----------------------------------------------*
EXEC SQL DECLARE CURSOR-JUNTOS CURSOR FOR
SELECT
T1.MATRICULA,T1.NOME,
T2.CURSO,T2.VALOR
FROM
DBAUPNGO.TBALUNOS T1
RIGHT OUTER JOIN
DBAUPNGO.TBCURSOS T2
ON
T1.MATRICULA=T2.MATRICULA
END-EXEC.
EXEC SQL FETCH
INTO
END-EXEC.
EXEC SQL CLOSE

SELECT

T1.MATRICULA,T1.NOME,
T2.CURSO,T2.VALOR
FROM
DBAUPNGO.TBALUNOS T1
RIGHT OUTER JOIN
DBAUPNGO.TBCURSOS T2
ON
T1.MATRICULA = T2.MATRICULA;

CURSOR-JUNTOS
:MATRICULA, :NOME,
:CURSO, :VALOR
CURSOR-JUNTOS END-EXEC.

Exemplos
TBALUNOS
------------------------MATR NOME
---- ------------------0001 JOAO
0002 SERGIO
0004 XUXA

Parmetros

TBCURSOS
------------------------MATR CURSO
VALOR
---- ----------- ------0001 ALEMAO
10,00
0001 INGLES
8,00
0004 INGLES
5,00
0005 JAPONES
9,00

RESULTADO
-------------------------------MATR NOME
CURSO
VALOR
---- ------ ---------- ------0001 JOAO
ALEMAO
10,00
0001 JOAO
INGLES
8,00
0004 XUXA
INGLES
5,00
0005 ------ JAPONES
9,00

RIGHT OUTER JOIN: A funo deste parmetro e juntar as tabelas cuja a matricula tenha correspondente entre TBCURSOS e
TBALUNOS , mas, da tabela TBCURSOS viro todas as linhas e a tabela TBALUNOS somente viro as linhas que tiverem
correspondentes na tabela TBCURSOS.

NOTA
As colunas com contedos -------- so colunas nulas, no COBOL devemos assinalar as variveis indicadoras para cada uma
delas.

Copyright by UPNGO Training 2006 www.upngo.com.br

39

DATA BASE 2
COMANDOS
UNINDO duas ou mais tabelas
Para unirmos em uma pesquisa duas ou mais tabelas tabelas usamos o parmetro UNION, isto far com que as colunas repetidas
no sejam selecionadas.

COBOL

SPUFI

*----------------------------------------------*
WORKING-STORAGE SECTION.
*----------------------------------------------*
EXEC SQL DECLARE CURSOR-UNIAO CURSOR FOR
SELECT
T1.MATRICULA,
T1.CURSO,
T1.VALOR
FROM
DBAUPNGO. TBCURSOS1 T1
UNION
SELECT
T2.MATRICULA,
T2.CURSO,
T2.VALOR
FROM
DBAUPNGO.TBCURSOS2 T2
WHERE
T2.VALOR > 8.00
END-EXEC.
EXEC SQL FETCH
INTO
END-EXEC.
EXEC SQL CLOSE

SELECT
FROM
UNION
SELECT
FROM
WHERE

T1.MATRICULA,
T1.CURSO,
T1.VALOR
DBAUPNGO. TBCURSOS1 T1
T2.MATRICULA,
T2.CURSO,
T2.VALOR
DBAUPNGO.TBCURSOS2 T2
T2.VALOR > 8.00;

CURSOR-UNIAO
:MATRICULA, :CURSO, :VALOR
CURSOR-UNIAO END-EXEC.

Exemplos
TBCURSOS1
------------------------MATR CURSO
VALOR
---- ----------- ------0001 ALEMAO
10,00
0001 INGLES
8,00
0004 INGLES
5,00

TBCURSOS2
------------------------MATR CURSO
VALOR
---- ----------- ------0001 ALEMAO
10,00
0001 INGLES
8,00
0004 INGLES
5,00
0005 JAPONES
9,00

Copyright by UPNGO Training 2006 www.upngo.com.br

RESULTADO
-------------------------------MATR CURSO
VALOR
---- ---------- ------0001 ALEMAO
10,00
0004 INGLES
5,00
0005 JAPONES
9,00

40

DATA BASE 2
COMANDOS
UNINDO duas ou mais tabelas
Para unirmos em uma pesquisa duas ou mais tabelas usamos o parmetro UNION ALL, isto far com que as colunas repetidas
sejam selecionadas.

COBOL

SPUFI

*----------------------------------------------*
WORKING-STORAGE SECTION.
*----------------------------------------------*
EXEC SQL DECLARE CURSOR-UNIAO CURSOR FOR
SELECT
T1.MATRICULA,
T1.CURSO,
T1.VALOR
FROM
DBAUPNGO. TBCURSOS1 T1
UNION ALL
SELECT
T2.MATRICULA,
T2.CURSO,
T2.VALOR
FROM
DBAUPNGO.TBCURSOS2 T2
END-EXEC.
EXEC SQL FETCH
INTO
END-EXEC.
EXEC SQL CLOSE

SELECT

T1.MATRICULA,
T1.CURSO,
T1.VALOR
FROM
DBAUPNGO. TBCURSOS1 T1
UNION ALL
SELECT
T2.MATRICULA,
T2.CURSO,
T2.VALOR
FROM
DBAUPNGO.TBCURSOS2 T2;

CURSOR-UNIAO
:MATRICULA, :CURSO, :VALOR
CURSOR-UNIAO END-EXEC.

Exemplos
TBCURSOS1
------------------------MATR CURSO
VALOR
---- ----------- ------0001 ALEMAO
10,00
0001 INGLES
8,00
0004 INGLES
5,00
0008 ITALIANO
5,00

TBCURSOS2
------------------------MATR CURSO
VALOR
---- ----------- ------0001 ALEMAO
7,00
0001 INGLES
3,00
0004 INGLES
1,00
0005 JAPONES
9,00

Copyright by UPNGO Training 2006 www.upngo.com.br

RESULTADO
-------------------------------MATR CURSO
VALOR
---- ---------- ------0001 ALEMAO
10,00
0001 INGLES
8,00
0001 ALEMAO
7,00
0001 INGLES
3,00
0004 INGLES
5,00
0004 INGLES
1,00
0005 JAPONES
9,00
0008 ITALIANO
5,00

41

DATA BASE 2
COMANDOS
AGRUPANDO colunas de uma tabela
Para agruparmos em uma pesquisa uma ou mais colunas de uma tabela, usamos o parmetro GROUP BY e HAVING.

COBOL

SPUFI

*----------------------------------------------*
WORKING-STORAGE SECTION.
*----------------------------------------------*
EXEC SQL DECLARE CURSOR-GRUPO CURSOR FOR
SELECT
CURSO, VALOR
FROM
DBAUPNGO.TBCURSOS
WHERE
VALOR > 1
GROUP BY CURSO, VALOR
END-EXEC

SELECT CURSO,
VALOR
FROM
DBAUPNGO.TBCURSOS
WHERE
VALOR > 1
GROUP BY CURSO, VALOR;

OU

OU
EXEC SQL DECLARE
SELECT
FROM
WHERE
GROUP BY
HAVING
END-EXEC
EXEC SQL FETCH
INTO
END-EXEC.
EXEC SQL CLOSE

CURSOR-GRUPO CURSOR FOR


CURSO, VALOR
DBAUPNGO.TBCURSOS
VALOR > 1
CURSO, VALOR
VALOR > 5

SELECT CURSO,
VALOR
FROM
DBAUPNGO.TBCURSOS
WHERE
VALOR > 1
GROUP BY CURSO, VALOR
HAVING
VALOR > 5;

CURSOR-GRUPO
:CURSO, :VALOR
CURSOR-GRUPO END-EXEC.

Parmetros
GROUP BY : Agrupar os cursos e valores iguais, obedecendo a ordem de curso e valor.
HAVING : Selecionar somente as linhas que satisfizerem as condies do parmetro, funciona como um WHERE, mas s
vlido para o parmetro GROUP BY.

Copyright by UPNGO Training 2006 www.upngo.com.br

42

DATA BASE 2
COMANDOS
SELECIONANDO por PARTES do contedo da coluna
Para selecionarmos as linhas de uma determinada tabela cujo o argumento de pesquisa seja parte do contedo de uma coluna,
usaremos o comando LIKE ou SUBSTR.

COBOL
*----------------------------------------------*
WORKING-STORAGE SECTION.
*----------------------------------------------*
EXEC SQL DECLARE CURSOR-PARTE CURSOR FOR
SELECT NOME
FROM
DBAUPNGO.TBALUNOS
WHERE
NOME LIKE JO%
END-EXEC.
*
OU
*
EXEC SQL DECLARE CURSOR-PARTE CURSOR FOR
SELECT NOME
FROM
DBAUPNGO.TBALUNOS
WHERE
SUBSTR(NOME,1,2) = JO
END-EXEC.
EXEC SQL FETCH
INTO
END-EXEC.
EXEC SQL CLOSE

SPUFI
SELECT
FROM
WHERE

NOME
DBAUPNGO.TBALUNOS
NOME LIKE JO%

OU
SELECT
FROM
WHERE

NOME
DBAUPNGO.TBALUNOS
SUBSTR(NOME,1,2) = JO

CURSOR-PARTE
:NOME
CURSOR-PARTE END-EXEC.

Parmetros
LIKE : Tem a finalidade de pesquisar todos os nomes da tabela TBALUNOS cujo nome inicie com JO, podem tambm assumir as
seguintes formas:
NOT LIKE JO%

- Todos os nomes que NO comecem com JO

LIKE _ _SE%

- Todos nomes que na 3a. e 4a. posio seja SE

NOT LIKE _ _SE% - Todos nomes que na 3a. e 4a. posio no seja SE
NOTA: % = No considera como argumento de pesquisa os caracteres aps este smbolo. _ _ = No considera como argumento
de pesquisa as posies que estes smbolos ocuparem .
SUBSTR : Tem a finalidade de pesquisar todos os nomes da tabela TBALUNOS cujo parte do nome tenha a constante JO.
1 = Posio inicial do argumento de pesquisa 2 = Nmero de posies aps a posio inicial

Copyright by UPNGO Training 2006 www.upngo.com.br

43

DATA BASE 2
SPUFI

Usando o Interativo do DB2


CUSTOMPAC MASTER APPLICATION MENU
OPTION ===> D

SCROLL ===> CSR


USERID - BIRA01
TIME
- 11:18

IS
P
D
IP
OS
OU
SM
IC
SD
R
HC
BMB
BMR
BMI
X

ISMF
PDF
DB2I
IPCS
SUPPORT
USER
SMP/E
ICSF
SDSF
RACF
HCD
BMR BLD
BMR READ
BMR INDX
EXIT

F1=HELP
F7=UP

Interactive Storage Management Facility


ISPF/Program Development Facility
DB2 Interactive
Interactive Problem Control Facility
OS/390 ISPF System Support Options
OS/390 ISPF User Options
SMP/E Dialogs
Integrated Cryptographic Service Facility
System Display and Search Facility
Resource Access Control Facility
Hardware Configuration Definition
BookManager Build (Create Online Documentation)
BookManager Read (Read Online Documentation)
BookManager Read (Create Bookshelf Index)
Terminate ISPF using list/log defaults

F2=SPLIT
F8=DOWN

F3=END
F9=SWAP

F4=RETURN
F10=LEFT

F5=RFIND
F11=RIGHT

F6=RCHANGE
F12=RETRIEVE

NOTA
Selecionar o opo D e teclar ENTER

Copyright by UPNGO Training 2006 www.upngo.com.br

44

DATA BASE 2
SPUFI

Selecionando a opo SPUFI


DB2I PRIMARY OPTION MENU
COMMAND ===> 1

SSID: DB2N

Select one of the following DB2 functions and press ENTER.


1
2
3
4
5
6
7
8
D
X

SPUFI
DCLGEN
PROGRAM PREPARATION
PRECOMPILE
BIND/REBIND/FREE
RUN
DB2 COMMANDS
UTILITIES
DB2I DEFAULTS
EXIT

F1=HELP
F7=UP

F2=SPLIT
F8=DOWN

(Process SQL statements)


(Generate SQL and source language declarations)
(Prepare a DB2 application program to run)
(Invoke DB2 precompiler)
(BIND, REBIND, or FREE plans or packages)
(RUN an SQL program)
(Issue DB2 commands)
(Invoke DB2 utilities)
(Set global parameters)
(Leave DB2I)

F3=END
F9=SWAP

F4=RETURN
F10=LEFT

F5=RFIND
F11=RIGHT

F6=RCHANGE
F12=RETRIEVE

NOTA
Selecionar o opo 1 e teclar ENTER

Copyright by UPNGO Training 2006 www.upngo.com.br

45

DATA BASE 2
SPUFI

Criando a sada das consultas


SPUFI
SSID: DB2N
===>
DSNE803A INPUT FILE WAS NOT CHANGED. PRESS ENTER TO CONTINUE
Enter the input data set name:
(Can be sequential or partitioned)
1 DATA SET NAME ... ===> 'UPNGO.ALUNO??.COBLIB(CREATE)'
2 VOLUME SERIAL ... ===>
(Enter if not cataloged)
3 DATA SET PASSWORD ===>
(Enter if password protected)
Enter the output data set name:
(Must be a sequential data set)
4 DATA SET NAME ... ===> UPNGO.BIRA01.LISTING
Specify processing options:
5 CHANGE DEFAULTS
===> yes
6 EDIT INPUT ...... ===> *
7 EXECUTE ......... ===> YES
8 AUTOCOMMIT ...... ===> YES
9 BROWSE OUTPUT ... ===> YES

(Y/N
(Y/N
(Y/N
(Y/N
(Y/N

Display SPUFI defaults panel?)


Enter SQL statements?)
Execute SQL statements?)
Commit after successful run?)
Browse output data set?)

For remote SQL processing:


10 CONNECT LOCATION ===>
F1=HELP
F7=UP

F2=SPLIT
F8=DOWN

F3=END
F9=SWAP

F4=RETURN
F10=LEFT

F5=RFIND
F11=RIGHT

F6=RCHANGE
F12=RETRIEVE

NOTA
Para criarmos o arquivo que conter os resultados dos nossos comandos SQL(UPNGO.ALUNO??.LINTING) colocaremos YES na
opo de especificao de processos (opo 5)

Copyright by UPNGO Training 2006 www.upngo.com.br

46

DATA BASE 2
SPUFI

Definindo os parmetros do arquivo de sada


CURRENT SPUFI DEFAULTS
===>

SSID: DB2N

Enter the following to control your SPUFI session:


1 ISOLATION LEVEL
===> RR
(RR=Repeatable Read, CS=Cursor Stability)
2 MAX SELECT LINES ===> 1000
(Maximum number of lines to be
returned from a SELECT)
Output data set characteristics:
3 RECORD LENGTH ... ===> 4096
(LRECL=Logical Record length)
4 BLOCK SIZE ...... ===> 27998
(Size of one block)
5 RECORD FORMAT ... ===> VB
(RECFM=F, FB, FBA, V, VB, or VBA)
6 DEVICE TYPE ..... ===> 3390
(Must be DASD unit name)
Output format characteristics:
7 MAX NUMERIC FIELD ===> 33
8 MAX CHAR FIELD .. ===> 4096
9 COLUMN HEADING .. ===> NAMES

F1=HELP
F7=UP

F2=SPLIT
F8=DOWN

F3=END
F9=SWAP

(Maximum width for numeric fields)


(Maximum width for character fields)
(NAMES, LABELS, ANY or BOTH)

F4=RETURN
F10=LEFT

F5=RFIND
F11=RIGHT

F6=RCHANGE
F12=RETRIEVE

NOTA
Aps digitarmos os dados acima teclar ENTER

Copyright by UPNGO Training 2006 www.upngo.com.br

47

DATA BASE 2
SPUFI

Editando um comando SQL


SPUFI
SSID: DB2N
===>
DSNE803A INPUT FILE WAS NOT CHANGED. PRESS ENTER TO CONTINUE
Enter the input data set name:
(Can be sequential or partitioned)
1 DATA SET NAME ... ===> 'UPNGO.ALUNO??.COBLIB(CREATE)'
2 VOLUME SERIAL ... ===>
(Enter if not cataloged)
3 DATA SET PASSWORD ===>
(Enter if password protected)
Enter the output data set name:
(Must be a sequential data set)
4 DATA SET NAME ... ===> UPNGO.ALUNO??.LISTING
Specify processing options:
5 CHANGE DEFAULTS
===> *
6 EDIT INPUT ...... ===> YES
7 EXECUTE ......... ===> YES
8 AUTOCOMMIT ...... ===> YES
9 BROWSE OUTPUT ... ===> YES

(Y/N
(Y/N
(Y/N
(Y/N
(Y/N

Display SPUFI defaults panel?)


Enter SQL statements?)
Execute SQL statements?)
Commit after successful run?)
Browse output data set?)

For remote SQL processing:


10 CONNECT LOCATION ===>
F1=HELP
F7=UP

F2=SPLIT
F8=DOWN

F3=END
F9=SWAP

F4=RETURN
F10=LEFT

F5=RFIND
F11=RIGHT

F6=RCHANGE
F12=RETRIEVE

NOTA
A opo EDIT INPUT igual a YES (opo 6) , ser para editarmos/criarmos um membro CREATE na UPNGO.ALUNO??.COBLIB
que conter os comando do SQL, que ser executado posteriormente.

Copyright by UPNGO Training 2006 www.upngo.com.br

48

DATA BASE 2
SPUFI

Editando um comando SQL


File Edit Confirm Menu Utilities Compilers Test Help
------------------------------------------------------------------------------EDIT
UPNGO.ALUNO??.COBLIB(CREATE) - 01.00
Columns 00001 00072
****** ***************************** Top of Data ******************************
==MSG> -Warning- The UNDO command is not available until you change
==MSG>
your edit profile using the command RECOVERY ON.
000100 DROP TABLE DBAUPNGO.TBALUNOS
000200
IN DBAUPNGO.TBSUPNGO;
000300 CREATE TABLE DBAUPNGO.TBALUNOS
000400
MATRICULA
DECIMAL (07) NOT NULL,
000500
NOME
CHAR
(35) NOT NULL,
000600
NASCIMENTO DATE)
000700
IN DBAUPNGO.TBSUPNGO;
****** **************************** Bottom of Data ****************************
Command ===>
F1=Help

F3=Exit

F5=Rfind

F6=Rchange

Scroll ===> PAGE


F12=Cancel

NOTA
Aps a edio do comando SQL devemos acionar PF3, para executa-lo.

Copyright by UPNGO Training 2006 www.upngo.com.br

49

DATA BASE 2
SPUFI

Executando um comando SQL


SPUFI

SSID: DB2N

===>
DSNE803A INPUT FILE WAS NOT CHANGED. PRESS ENTER TO CONTINUE
Enter the input data set name:
(Can be sequential or partitioned)
1 DATA SET NAME ... ===> 'UPNGO.ALUNO??.COBLIB(CREATE)'
2 VOLUME SERIAL ... ===>
(Enter if not cataloged)
3 DATA SET PASSWORD ===>
(Enter if password protected)
Enter the output data set name:
(Must be a sequential data set)
4 DATA SET NAME ... ===> UPNGO.ALUNO??.LISTING
Specify processing options:
5 CHANGE DEFAULTS
===> *
6 EDIT INPUT ...... ===> *
7 EXECUTE ......... ===> YES
8 AUTOCOMMIT ...... ===> YES
9 BROWSE OUTPUT ... ===> YES

(Y/N
(Y/N
(Y/N
(Y/N
(Y/N

Display SPUFI defaults panel?)


Enter SQL statements?)
Execute SQL statements?)
Commit after successful run?)
Browse output data set?)

For remote SQL processing:


10 CONNECT LOCATION ===>
F1=HELP
F7=UP

F2=SPLIT
F8=DOWN

F3=END
F9=SWAP

F4=RETURN
F10=LEFT

F5=RFIND
F11=RIGHT

F6=RCHANGE
F12=RETRIEVE

NOTA
Ser exibida novamente a tela de parmetros, a opoEXECUTE (opo 7) dever estar com YES, ops alterarmos a opo
teclamos ENTER

Copyright by UPNGO Training 2006 www.upngo.com.br

50

DATA BASE 2
SPUFI

Obtendo o resultado do comando


Menu Utilities Compilers Help
------------------------------------------------------------------------------BROWSE
BIRA01.UPNGO.ALUNO??.LISTING
Line 00000000 Col 001 080
********************************* Top of Data **********************************
---------+---------+---------+---------+---------+---------+---------+---------+
DROP TABLE DBAUPNGO.TBALUNOS
IN DBAUPNGO.TBSUPNGO;
CREATE TABLE DBAUPNGO.TBALUNOS
MATRICULA
DECIMAL (07) NOT NULL,
NOME
CHAR
(35) NOT NULL,
NASCIMENTO DATE)
IN DBAUPNGO.TBSUPNGO;
DSNE616I STATEMENT EXECUTION WAS SUCCESSFUL, IS 0
---------+---------+---------+---------+---------+---------+---------+---------+
DSNE617I COMMIT PERFORMED, IS 0
DSNE616I STATEMENT EXECUTION WAS SUCCESSFUL, IS 0
---------+---------+---------+---------+---------+---------+---------+---------+
DSNE601I SQL STATEMENTS ASSUMED TO BE BETWEEN COLUMNS 1 AND 72
Command ===>
Scroll ===> PAGE
F1=Help
F3=Exit
F5=Rfind F12=Cancel

NOTA
Ser exibido resultado do comando ou o erro caso o comando no for bem sucedido, repetir novamente o processo para outros
comando.

Copyright by UPNGO Training 2006 www.upngo.com.br

51

DATA BASE 2
DCLGEN

Usando o Interativo do DB2


O DCLGEN o mdulo do DB2 onde criamos as variveis HOST numa estrutura(Book),essas variveis iro hospedar as colunas
das linhas de uma tabela, a estrutura gerada para ser incorporada ao aplicativo COBOL, PLI e outros, atravs do comando
EXEC SQL INCLUDE ...

NOTA
O DCLGEN executado no ambiente TSO

Copyright by UPNGO Training 2006 www.upngo.com.br

52

DATA BASE 2
DCLGEN

Selecionando a opo DCLGEN


DB2I PRIMARY OPTION MENU
COMMAND ===> 2

SSID: DB2N

Select one of the following DB2 functions and press ENTER.


1
2
3
4
5
6
7
8
D
X

SPUFI
DCLGEN
PROGRAM PREPARATION
PRECOMPILE
BIND/REBIND/FREE
RUN
DB2 COMMANDS
UTILITIES
DB2I DEFAULTS
EXIT

F1=HELP
F7=UP

F2=SPLIT
F8=DOWN

(Process SQL statements)


(Generate SQL and source language declarations)
(Prepare a DB2 application program to run)
(Invoke DB2 precompiler)
(BIND, REBIND, or FREE plans or packages)
(RUN an SQL program)
(Issue DB2 commands)
(Invoke DB2 utilities)
(Set global parameters)
(Leave DB2I)

F3=END
F9=SWAP

F4=RETURN
F10=LEFT

F5=RFIND
F11=RIGHT

F6=RCHANGE
F12=RETRIEVE

NOTA
Selecionar o opo 2 e teclar ENTER

Copyright by UPNGO Training 2006 www.upngo.com.br

53

DATA BASE 2
DCLGEN

Gerando variveis HOST das tabelas


DCLGEN
SSID: DB2N
===>
DSNE294I SYSTEM RETCODE=000
USER OR DSN RETCODE=0
Enter table name for which declarations are required:
1 SOURCE TABLE NAME ===> TBALUNOS
2 TABLE OWNER ..... ===> DBAUPNGO
3 AT LOCATION ..... ===>

(Unqualified)
(Optional)
(Optional)

Enter destination data set:


(Can be sequential or partitioned)
4 DATA SET NAME ... ===> 'UPNGO.BIRA01.COBLIB(TBALUNOS)'
5 DATA SET PASSWORD ===>
(If password protected)
Enter options as desired:
6 ACTION .......... ===>
7 COLUMN LABEL .... ===>
8 STRUCTURE NAME .. ===>
9 FIELD NAME PREFIX ===>
10 DELIMIT DBCS .... ===>
11 COLUMN SUFFIX ... ===>
12 INDICATOR VARS .. ===>
F1=HELP
F7=UP

F2=SPLIT
F8=DOWN

ADD
NO
YES
NO
NO
F3=END
F9=SWAP

(ADD new or REPLACE old declaration)


(Enter YES for column label)
(Optional)
(Optional)
(Enter YES to delimit DBCS identifiers)
(Enter YES to append column name)
(Enter YES for indicator variables)
F4=RETURN
F10=LEFT

F5=RFIND
F11=RIGHT

F6=RCHANGE
F12=RETRIEVE

NOTA
Preencher as opes acima e teclar ENTER

Copyright by UPNGO Training 2006 www.upngo.com.br

54

DATA BASE 2
PROGRAMA COBOL BATCH COM DB2
Exibir contedo da tabela ALUNOS
Fluxo Operacional:

ALUNOS

PRGD??1

MATRCULA, NOME

Definio do programa:
1 Selecionar MATRCULA e NOME de todos os ALUNOS
2 Exibir seus contedos

Codificao do programa
*--------------------------------------*
IDENTIFICATION
DIVISION.
*--------------------------------------*
PROGRAM-ID.
PRGD??1.
*AUTHOR.
NOME DO ALUNOS.
*DATE-WRITEN.
DD/MM/AAAA.
*-----------------------------------------------------*
* OBJETIVO: LISTAR A MATRICULA E NOME DA TABELA ALUNOS *
*-----------------------------------------------------*
ENVIRONMENT
DIVISION.
CONFIGURATION
SECTION.
SPECIAL-NAMES.
DECIMAL-POINT IS COMMA.
*-------------------------------------*
WORKING-STORAGE
SECTION.
*-------------------------------------*
77 WK-LIDOS
PIC 9(05)
VALUE ZEROS.
77 WK-SQLCODE
PIC -(05)
VALUE ZEROS.
*-------------------------------------------------*
* INCLUDES DE AREAS DE CONTROLES E TABELAS DO DB2 *
*-------------------------------------------------*
EXEC SQL INCLUDE SQLCA END-EXEC.
EXEC SQL INCLUDE TBALUNOS END-EXEC.
*-------------------------*
* SELECAO DA TABELA ALUNOS *
*-------------------------*
EXEC SQL DECLARE CURSOR-ALUNOS CURSOR FOR
SELECT MATRICULA,
NOME
FROM DBAUPNGO.TBALUNOS
ORDER BY NOME
END-EXEC.

Copyright by UPNGO Training 2006 www.upngo.com.br

55

DATA BASE
Programa
BATCH 2em DB2
PROGRAMA COBOL BATCH COM DB2
Codificao do programa
*---------------------------------------------------------------*
PROCEDURE
DIVISION.
*---------------------------------------------------------------*
000-00-INICIO-PROGRAMA.
*-----------------------*
PERFORM 700-00-INICIA-PROGRAMA.
PERFORM 710-00-LER-ALUNOS.
PERFORM UNTIL SQLCODE NOT EQUAL ZEROS
ADD
1 TO WK-LIDOS
DISPALY MATRICULA = MATRICULA
NOME = NOME
PERFORM 710-00-LER-ALUNOS
END-PERFORM.
PERFORM 900-00-FINALIZA-PROGRAMA.
STOP RUN.
*-----------------------*
700-00-INICIA-PROGRAMA.
*-----------------------*
MOVE ZEROS TO WK-LIDOS.
EXEC SQL OPEN CURSOR-ALUNOS END-EXEC.
*-----------------------*
700-10-LER-ALUNOS.
*-----------------------*
EXEC SQL FETCH CURSOR-ALUNOS
INTO :MATRICULA,
:NOME
END-EXEC.
IF SQLCODE NOT EQUAL ZEROS
AND SQLCODE NOT EQUAL 100
MOVE SQLCODE TO WK-SQLCODE
DISPLAY ERRO NA LEITURA DA TABELA ALUNOS, = WK-SQLCODE
STOP RUN
END-IF.
*--------------------------*
900-00-FINALIZA-PROGRAMA.
*--------------------------*
DISPLAY LIDOS ALUNOS = WK-LIDOS.
EXEC SQL CLOSE CURSOR-ALUNOS END-EXEC.

Autor: Upngo
Copyright by UPNGO Training 2006 www.upngo.com.br

56

DATA BASE
Codificao
do JOB 2em DB2
PROGRAMA COBOL BATCH COM DB2
Codificao do JOB execuo

//* -------------------------------------------------------------*
//* JOB DE EXECUCAO PARA PROGRAMA COM DB2
*
//* -------------------------------------------------------------*
//ALUNO??X JOB ALUNO??',MSGCLASS=X,CLASS=C,NOTIFY= ALUNO??,TIME=1
//STEP001 EXEC PGM=IKJEFT01,DYNAMNBR=20
//STEPLIB DD DSN=????????.???????.SDSNLOAD,DISP=SHR
//DBRMLIB DD DSN=????????.???????.DBRMLIB.DATA,DISP=SHR
//SYSTSPRT DD SYSOUT=*
//SYSPRINT DD SYSOUT=*
//SYSUDUMP DD SYSOUT=*
//SYSOUT
DD SYSOUT=*
//REPORT
DD SYSOUT=*
//SYSTSIN DD *
DSN SYSTEM(DB2N)
RUN PROGRAM(PRGD??1) PLAN(PRGD??1) LIB(????????.???????.LOADLIB')
END
//

Copyright by UPNGO Training 2006 www.upngo.com.br

57

DATA BASE 2
PROGRAMA COBOL BATCH COM DB2
Juntar tabelas ALUNOS e CURSO

Fluxo Operacional:
CURSOS
PRGDB01B

ALUNOS

NOME, CURSO,VALOR

Definio do programa:
1 Juntar as tabelas ALUNOS e CURSOS
2 Exibir NOME, CURSO E VALOR

Exibir dados do ALUNOS e CURSO


Fluxo Operacional:
CURSOS
PRGDB01C

ALUNOS

NOME, CURSO,VALOR

Definio do programa:
1 Ler a tabela de ALUNOS
2 Ler a tabelas de CURSOS correspondente ao ALUNOS
3 Exibir cdigo e nome do ALUNOS, descrio e valor do curso

Copyright by UPNGO Training 2006 www.upngo.com.br

58

BASEPrticas
2
Dicas eDATA
Orientaes
DICAS E ORIENTAES PRTICAS

EVITE converses de variveis


Use sempre a DCLGEM para gerar o book das variveis HOST, (INCLUDE) pois assim estaremos gerando as variveis
compatveis com as colunas da tabela, sempre use na clusula INTO e no WHERE dos comandos FETCH e SELECT as variveis
HOST correspondentes as colunas, evite compara-las ou move-las para variveis de configuraes diferentes:
CORRETO:

SELECT VALOR INTO :VALOR WHERE VALOR = :VALOR

ERRADO:

SELECT VALOR INTO :ACUMULADO WHERE VALOR = :ACUMULADO

ONDE: VALOR na tabela um DECIMAL


VALOR na varivel HOST um COMP-3
ACUMULADO no aplicativo um ZONADO

SELECIONE somente as colunas necessrias


Evite SELECT *, motivos:
Teremos problemas com as colunas nulas,
Adies de novas colunas na tabelas, implicaro em manutenes nos aplicativos,
Os acessos aos catlogos do DB2 sero maiores

Copyright by UPNGO Training 2006 www.upngo.com.br

59

DATA BASE 2
DICAS E ORIENTAES PRTICAS

EVITE subquery
Os comandos de SELECT na sua forma mais bsicas so mais eficientes do que os complexos, veja os exemplos abaixo:
MAIS EFICIENTE:
SELECT MATRICULA, NOME
FROM ALUNOS T1, CLASSE T2
WHERE T1.DEPTO = T2.DEPTO AND T1.MATRICULA = MONITOR
MENOS EFICIENTE:
SELECT MATRICULA, NOME
FROM ALUNOS T1
WHERE DEPTO = (SELECT DEPTO
FROM CLASSE
WHERE MONITOR = T1.MATRICULA)

Uso do ORDER BY
Use ORDER BY para pequenas quantidades de linhas selecionadas, na dvida faa uma seleco dados linhas, criando um arquivo
seqencial, e use um SORT EXTERNO.

Copyright by UPNGO Training 2006 www.upngo.com.br

60

DATA BASE 2
DICAS E ORIENTAES PRTICAS

Uso do NDICE ou do SORTnos comandos


COLUNA INDEXADA

USO DO INDEX

IN
LIKE
BETWEEN
> ou <= ou < ou <= ou => ou =
<>
NOT
OR
ORDER BY
GROUP BY
DISTINCT

USO DO SORT
SIM
*
SIM
SIM
NO
NO
**
SIM
SIM
SIM

SIM
SIM
SIM

* SIM - Exceto quando a varivel HOST conter %ou _


* * SIM - Se entendermos que o sentido um IN

Copyright by UPNGO Training 2006 www.upngo.com.br

61

DATA BASE 2
DICAS E ORIENTAES PRTICAS

Uso de NDICE nas EXPRESSES ARITIMTICAS


O uso do ndice quanto a expresses aritimticas melhor quando as expresses no esto nos camandos SQL, vide exemplo abaixo:
MAIS EFICIENTE:
VALOR = VALOR + (VALOR * 30 / 100)
SELECT MATRICULA, CURSOR, VALOR
FROM CURSOS
WHERE VALOR > :VALOR
MENOS EFICIENTE:
SELECT MATRICULA, CURSOR, VALOR
FROM CURSOS
WHERE VALOR > :VALOR * 30 / 100

Uso de NDICE na clusula NOT


O uso do NOT tem que ser bem utilizado, pois em geral ele no uso o ndice, devemos utiliza-lo quando for de extrema
necessidade, exemplos abaixo mostraro como evita-los:
MAIS EFICIENTE:
WHERE NOTA IN (D, E)
WHERE NOTA BETWEEN D AND E
MENOS EFICIENTE:
WHERE NOTA NOT IN (A, C)
WHERE NOTA <= E AND NOTA >= D

Copyright by UPNGO Training 2006 www.upngo.com.br

62

DATA BASE 2
DICAS E ORIENTAES PRTICAS

Uso de NDICE na clusula LIKE


O uso do LIKE tem que ser bem utilizado, pois em geral ele tambm no uso o ndice, devemos utiliz-lo quando for de extrema
necessidade, exemplos abaixo mostraro como utiliza-los da melhor maneira:
MAIS EFICIENTE:
WHERE NOME LIKE I_COSTA %
MENOS EFICIENTE:
WHERE NOME LIKE %COSTA

Uso de NDICE na SUBQUERY


O uso de SUBQUERY deve ser muito bem estudado, pois, ns somente nos importamos com o uso do ndice da tabela de nvel
superior (tabela mandatria) e esquecemos de levar em conta o ndice na tabela de nvel inferior (tabela da sub-seleo), pois o
tempo para abteno dos dados, so dos dois nveis de seleo, veja o exemplo abaixo para maior esclarecimento:
MAIS EFICIENTE:
SELECT MATRICULA,
NOME
FROM ALUNO
WHERE MAIOR_NOTA > (SELECT AVG(NOTA)
FROM NOTAS)
MENOS EFICIENTE:
SELECT MATRICULA,
NOME
FROM ALUNO
WHERE MAIOR_NOTA > (SELECT AVG(NOTA)
FROM NOTAS
WHERE CURSO = INGLES )

Copyright by UPNGO Training 2006 www.upngo.com.br

63

DATA BASE 2
CDIGOS DE RETORNO

Anexo 1
Cdigos de retorno
Os cdigos de retorno dos comandos DB2 sero informados na varivel SQLCODE, os principais retornos so:
Cdigo
+100
-102
-117
-180
-181
-199
-204
-205
-206
-216
+222
+223
-224
-229
+231
+304
-305
-311
-482
-501
-502
-503
-530
-532
-536
-545
-747
+802
-803
-805
-811
-818
-904
-911
-913
-922
-927

Descrio
Row not found or end of cursor
String constant is too long
The number of values you are trying to INSERT does not match the number of columns
Bad data in Date/Time/Timestamp String representation of DATE, TIME, TIMESTAMP is invalid
Bad data in Date/Time/Timestamp Value for DATE, TIME, TIMESTAMP is invalid
Illegal use of the specified keyword.
Object not defined to DB2
Column name not in specified table
Column does not exist in any table in the SELECT
You need to use the same number of expressions on both sides of the comparison. when using multiple operands in a comparison, Correct
example: WHERE (E.SALARY, E.COMM) IN (SELECT S.PAY,
S.COMMISSION Incorrect example: WHERE (E.SALARY, E.COMM, E.BONUS) IN (SELECT
S.PAY, S.COMMISSION)
Trying to fetch a row that fell through a DELETE hole
Trying to fetch a row that fell through an UPDATE hole
FETCH cannot make an INSENSITIVE cursor SENSITIVE
The locale specified in a SET LOCALE statement was not found.
FETCH but you did a BEFORE or AFTER and you are not on a valid row
Value cannot be assigned to this host variable because it is out of range
Null indicator needed
Varchar, insert or update. You didnt set the -LEN field with the right data length
He procedure returned no locators
Cursor not open on FETCH
Opening cursor that is already open
Updating column which needs to be specified in FOR UPDATE OF
Referential integrity prevents the INSERT/UPDATE
Referential integrity (DELETE RESTRICT rule) prevents the DELETE
Referential integrity (DELETE RESTRICT rule) prevents the DELETE
Check constraint prevents the INSERT/UPDATE
The table specified is not available because tables and/or indexes need to be created.
The null indicator was set to -2 because an arithmetic statement didn't work.
Duplicate key on insert or update
DBRM or package not found in plan Is plan name correct?
More than one row retrieved in SELECT INTO
Plan and program: timestamp mismatch
Unavailable resource. Someone is locking the data you need you may choose to terminate the program
Deadlock or timeout. Rollback has been done.
Your program was the victim of a deadlock or timeout. NO rollback has been done. You should do a ROLLBACK.
Authorization needed
The language interface was called but no connection had been

Copyright by UPNGO Training 2006 www.upngo.com.br

64

DATA BASE 2
CDIGOS DE RETORNO

Anexo 1
Cdigos de retorno do
Como a lista de cdigos extensa, recomendamos consultar os sites:
www.mvshelp.com opo IBM MANUALS tpico DB2 manual DSNMC0F3
www.theamericanprogrammer.com/programming/s.html
Ou
Entre no site da google.com.br e na pesquisa digite por exemplo: SQLCODE=XXXX

Copyright by UPNGO Training 2006 www.upngo.com.br

65