Você está na página 1de 12

DB2 para Mainframe

DB2
Data Base 2

DB2 para Mainframe


ndice

Pgina

Alterando atributos de uma tabell


Alterando o contedo de uma coluna em uma tabela
Atributos das colunas
Conceito de LUW - Logical Unit of Work
Conceito de Variveis HOST
Contando linhas de uma tabela
Contando linhas distintamente de uma tabela
Criando ndice no nico em uma tabela
Criando ndice nico em uma tabela
Criando uma tabela
DB2I DEFAULTS PANEL 1
DB2I PRYMARY OPTION MENU
Desfazendo as alteraes nas tabelas
Efetivando as alteraes nas tabelas
Excluindo linhas de uma tabela
Excluindo uma tabela
Inserindo dados em uma tabela
Juntando duas tabelas onde a 1 tabela a mandatria
Juntando duas tabelas onde a 2 tabela a mandatria
Juntando duas tabelas onde a ambas tabelas so mandatrias
Juntando duas tabelas
O que o DB2
Pesquisando tabela por parte de uma coluna LIKE
Pesquisando tabela por parte de uma coluna SUBSTR
Processo de execuo
Selecionado o Menor, Maior, Somatria e Mdia aritmtica
Selecionando linhas de uma tabela entre valores determinados
Selecionando linhas de uma tabela entre valores especficos
Selecionando linhas de uma tabela
Selecionando linhas distintas de uma tabela
SPUFI - SQL Processor Using File Input
SPUFI X COBOL
SQLCODE Principais cdigos de retorno do acesso ao DB2
Utilizao do SPUFI

Student Guide
DB2 - Todos direitos reservados para Mainframe School Treinamentos Ltda

DB2 - Todos direitos reservados para Mainframe School Treinamentos Ltda

9
9
7
3
16
12
12
8
8
7
5
4
3
3
10
8
9
13
14
15
13
1
15
16
2
2
11
11
10
11
4
17
21
4

DB2 para Mainframe

DB2 para Mainframe

O que o DB2

Processo de execuo

O DB2 um banco de dados que utiliza um mdulo de acesso, e um dispositivo


fsico de armazenagem dos dados. No DB2 existe o conceito de DATA BASE,
TABLE SPACE, TABELAS, LINHAS e COLUNAS onde:
DATA BASE - rea que conter (o) os) table(s) space(s).
TABLE SPACE - rea que conter (o) a(s) tabela(s).
TABELA - Arquivo de dados.
LINHA - Registro de dados.
COLUNAS - Campos onde contero as informaes de dados.

Quando compilamos um fonte SQL, temos quatro fases distintas:Prcompilao, compilao, linkedio e BIND

DATA BASE
TABLE SPACE 1
TABELA1

TABELA2

Aplicativo2

Coluna

Linha

TABLE SPACE 2

TABELA3

DBRM2
Mdulo
Acesso2

Aplicativo1
ndices

DBRM1

Pr-Compilao
Verifica a sintaxe do SQL
Inclui as declaraes das tabelas SQL e variveis HOST
Inclui SQLCA
Cria o DBRM com os comando SQL copiados
Compilao
Gera o executvel a partir do fonte traduzido pelo pr-compilador
O TIMESTAMP copiado para o mdulo gerado para futuras comparaes
com a manipulao da tabela.
Linkedio
Gera os mdulos de carga a partir dos executveis
Gera os mdulos de acesso ao DB2
Bind
Gera o plano a partir da DBRM e mdulos de carga a partir dos executveis
O TIMESTAMP copiado para a DBRM
O plano contm a estratgia de acesso ao DB2, que so:
Validao: Checagem de referncias das tabelas e colunas;
Autorizao: Acessos requeridos, usurios autorizados;
Estratgia de acesso: ndices utilizados, estratgia de locking, estratgia de
resoluo dos comandos JOIN, UNION, etc.
Nota
DBRM - DATA BASE REQUEST MODULE, contm todas as instrues SQL do
programa fonte, deste mdulo que o BIND faz uso para criar o plano de
acesso.
TIMESTAMP Armazena um valor combinado entre DATA e HORA em
centsimos de segundo, para verificao da estrutura montada na tabela.
LOCKING Monitora e gerencia o mecanismo que o DB2 usa para checar a
integridade da Database.
.

Mdulo
Acesso1

DB2 - Todos direitos reservados para Mainframe School Treinamentos Ltda

DB2 - Todos direitos reservados para Mainframe School Treinamentos Ltda

DB2 para Mainframe

Conceito de LUW - Logical Unit of Work


A LUW um conceito onde todos os comandos de manuteno de dados nas
tabelas (INSERT,UPDATE,DELETE) espelham a imagem das linhas antes dessas
manutenes, de tal forma que se houver um ABEND, o DB2 far uso da mesma
para desfazer (RECOVERY) essas 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 alteraes nas tabelas
O comando COMMIT WORK efetiva, 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.
O trmino normal do aplicativo ser executado um COMMIT WORK
automaticamente.

DB2 para Mainframe


SPUFI - SQL Processor Using File Input
O SPUFI faz parte do DB2 z/OS e vem junto no DB2 Interactive Panel .
Basicamente SPUFI apenas uma maneira rpida de executar SQLs atravs de
um arquivo de entrada e sada com algumas poucas opes , porm considero a
maneira mais rpida e prtica para executar SQLs urgentes e que voc precisa
do resultado somente naquele determinado momento e no precisa formatar um
relatrio ou guardar estes dados por muito tempo.

DB2I PRYMARY OPTION MENU


Menu principal onde ser mostrado as opes de navegao no DB2. Neste
menu as principais opes so:
1: Utilizao do SPUFI, que um utilitrio interativo do DB2
2: DCLGEN, serve para gerar books das bases de dados para utilizao em
programas.
D: Configuraes do DB2, serve para indicar o SSID, (Sub-System Identification).

Desfazendo as alteraes nas tabelas


O comando ROLLBACK WORK no efetiva as manutenes feitas nas tabelas at
o momento de sua execuo, os dados contidos na LUW da aplicao sero
restaurados nas tabelas envolvidas.
O trmino anormal do aplicativo ser executado um ROLLBACK WORK
automaticamente.

DB2 - Todos direitos reservados para Mainframe School Treinamentos Ltda

DB2 - Todos direitos reservados para Mainframe School Treinamentos Ltda

DB2 para Mainframe

DB2 para Mainframe

No menu DB2I DEFAULTS PANEL 1, basta informar o nome DSN1 no parmetro


DB2 NAME para conectarmos o DB2 ativo no zOS.

Para entrarmos neste opo selecionamos a opo 1 no menu anterior (DB2I


Primary Option Menu) e informando o arquivo particionado que conter os
comandos SQL(Opo 1) e o arquivo particionado de sada do resultado da
execuo do comando (Opo 4), as opes 5,6,7,8, e 9 so os comandos que
sero executados a cada solicitao de execuo do SPUFI.

DB2 - Todos direitos reservados para Mainframe School Treinamentos Ltda

DB2 - Todos direitos reservados para Mainframe School Treinamentos Ltda

DB2 para Mainframe

Criando uma tabela


1
1
2
2
2
3
3
4
4
4
5
5
6
6
6
7 7
1...5....1...2...6...0...4...0...2...6...0...4...0...2...6...0...4...0.2
CREATE TABLE MFS.TBALUNOS
MATRICULA
DECIMAL (07) NOT NULL,
NOME
CHAR
(35) NOT NULL,
NASCIMENTO DATE,
IDADE
INTEGER
NOT NULL)
IN MSFBASE.MFSTABLE;

CREATE TABLE - Criao da tabela, este comando requer os parmetros:


MFS - Proprietrio (OWNER) da tabela, pois somente o mesmo pode fazer
manutenes na tabela.
TBALUNOS - Tabela onde as colunas sero informadas.
MATRICULA, NOME, NASCIMENTO e IDADE: Colunas da tabela, veja abaixo os
atributos das colunas.
NOT NULL - Coluna com contedo obrigatrio, significa que dever haver um
contedo na mesma quando for feita uma incluso de dados, na ausncia deste
parmetro o DB2 assume NULL (Contedo opcional).
MFSTABLE -TABLE SPACE que conter a tabela.
MFSBASE - DATA BASE onde conter a TABLE SPACE.
Atributos das colunas
DECIMAL: Define uma coluna de contedo numrico na tabela, com ou sem casas
decimais, ideal para clculos.
SMALLINT: Define uma coluna de contedo numrico cujo o maior valor para
armazenamento de 32768.
INTEGER: Define uma coluna de contedo numrico cujo o maior valor para
armazenamento de 65536.
CHAR: Define uma coluna cujo contedo ser um conjunto de caracteres
(string), no sendo utilizado para clculos numricos.
VARCHAR : Coluna para conjunto de caracteres que obter um tamanho
variado, dependendo do contedo armazenado.
DATE: Coluna que conter uma data no formato adequado ao DB2
(AAAA-MM-DD).
TIME: Coluna que conter hora no formato de (HH:MM:SS).
TIMESTAMP: Data e hora medida em centsimos de segundo.

DB2 - Todos direitos reservados para Mainframe School Treinamentos Ltda

DB2 para Mainframe

Excluindo uma tabela


1
1
2
2
2
3
3
4
4
4
5
5
6
6
6
7 7
1...5....1...2...6...0...4...0...2...6...0...4...0...2...6...0...4...0.2
DROP TABLE MFS.TBALUNOS;

DROP TABLE - Comando de deleo da tabela


Criando ndice nico em uma tabela
1
1
2
2
2
3
3
4
4
4
5
5
6
6
6
7 7
1...5....1...2...6...0...4...0...2...6...0...4...0...2...6...0...4...0.2
CREATE UNIQUE INDEX
MFS.TBALUNOS_I1 ON MFS.TBALUNOS
(MATRICULA ASC);

CREATE UNIQUE INDEX - Comando de criao de ndice, a clausula UNIQUE


indica que as colunas referenciadas no comando no podero ter valores iguais
dentro da mesma tabela.
ASC - Indica que a ordenao do ndice ser ascendente (do menor para o
maior), tambm podemos usar a clausula DESC indica que a ordenao ser
descendente (do maior para o menor).
Criando ndice no nico em uma tabela
1
1
2
2
2
3
3
4
4
4
5
5
6
6
6
7 7
1...5....1...2...6...0...4...0...2...6...0...4...0...2...6...0...4...0.2
CREATE INDEX
MFS.TBALUNOS_I2 ON MFS.TBALUNOS
(NOME ASC);

CREATE INDEX - Comando de criao de ndice, a clausula omisso da clausula


UNIQUE indica que as colunas referenciadas no comando podero ter valores
iguais dentro da mesma tabela.
Excluindo um ndice da tabela
1
1
2
2
2
3
3
4
4
4
5
5
6
6
6
7 7
1...5....1...2...6...0...4...0...2...6...0...4...0...2...6...0...4...0.2
DROP INDEX MFS.TBALUNOS_I1;

DROP INDEX - Comando de deleo do ndice da tabela

DB2 - Todos direitos reservados para Mainframe School Treinamentos Ltda

DB2 para Mainframe

Alterando atributos de uma tabela


1
1
2
2
2
3
3
4
4
4
5
5
6
6
6
7 7
1...5....1...2...6...0...4...0...2...6...0...4...0...2...6...0...4...0.2
ALTER TABLE MFS.TBALUNOS
ADD PRIMARY KEY(MATRICULA)
ALTER COLUMN IDADE SET DATA TYPE DECIMAL(3,0);

ALTER Comando usado para fazer as seguintes manutenes na tabela,


ADD PRIMARY KEY - Cria ndice primrio para a coluna MATRICULA.
ALTER COLUMN Altera o atributo da coluna IDADE passando de INTEGER
(originalmente definido) para DECIMAL(3).
Inserindo dados em uma tabela
1
1
2
2
2
3
3
4
4
4
5
5
6
6
6
7 7
1...5....1...2...6...0...4...0...2...6...0...4...0...2...6...0...4...0.2
INSERT INTO MFS.TBALUNOS
(MATRICULA, NOME, NASCIMENTO, IDADE)
VALUES (10,'CARLOS ALBERTO MENEZES','2000-02-29,13);

DB2 para Mainframe

10

A clusula WHERE poder assumir os formatos:


Comparaes Simples
WHERE COLUNA <> ARGUMENTO
WHERE COLUNA > ARGUMENTO
WHERE COLUNA < ARGUMENTO
WHERE COLUNA = ARGUMENTO
Comparaes Compostos
WHERE COLUNA1 <> ARGUMENTO1
AND COLUNA2 > ARGUMENTO2
OU
WHERE COLUNA = ARGUMENTO1
OR
COLUNA2 < ARGUMENTO2
Excluindo linhas de uma tabela
1
1
2
2
2
3
3
4
4
4
5
5
6
6
6
7 7
1...5....1...2...6...0...4...0...2...6...0...4...0...2...6...0...4...0.2
DELETE FROM MFS.TBALUNOS
WHERE MATRICULA = 10;

INSERT - Inserir linhas em uma tabela, Devemos ter muito cuidado com as
colunas NOT NULL, pois elas deveram sempre receber valores.
VALUES - Relao dos campos que contero os dados serem inseridas na
tabela, devero estar na mesma ordem das colunas definidas na clausula INTO.
NOTA
Para no popular as colunas nulas em uma linha da tabela podemos omitir as
colunas nulas que no desejamos popular, informando ao DB2 que aquelas
colunas no contero valores. Somente podero ser suprimidas as colunas que
foram declaradas como nulas na tabela.

DELETE Excluir linha(s) de uma tabela


As linhas que sero excludas na tabela devem satisfazer a clusula WHERE

Alterando o contedo de uma coluna em uma tabela

SELECT Obtm linha(s) de uma tabela


No caso acima o asterisco (*) indica que ser obtidas todas as colunas de uma
linha na tabela.
NOTA: Podemos especificar a clausula WHERE para obtermos uma seleo mais
especfica..

1
1
2
2
2
3
3
4
4
4
5
5
6
6
6
7 7
1...5....1...2...6...0...4...0...2...6...0...4...0...2...6...0...4...0.2
UPDATE MFS.TBALUNOS
SET
NOME = 'JOAO
WHERE MATRICULA = 10;

Selecionando linhas de uma tabela


1
1
2
2
2
3
3
4
4
4
5
5
6
6
6
7 7
1...5....1...2...6...0...4...0...2...6...0...4...0...2...6...0...4...0.2
SELECT * FROM MFS.TBALUNOS;

1
1
2
2
2
3
3
4
4
4
5
5
6
6
6
7 7
1...5....1...2...6...0...4...0...2...6...0...4...0...2...6...0...4...0.2
SELECT NOME, IDADE
FROM MFS.TBALUNOS;

UPDATE Alterar linh(s) de uma tabela


SET - Sero alteradas todas as colunas NOME da tabela que satisfazerem as
condies da clausula WHERE.
WHERE - Condio de pesquisa para a execuo do comando, caso esta
clusula no seja satisfeita (sqlcode <> 0) os dados no sero alterados.

Neste caso a especificao de NOME e IDADE torna o comando SELECT mais


eficiente, pois somente sero obtidas as colunas especificadas.

DB2 - Todos direitos reservados para Mainframe School Treinamentos Ltda

DB2 - Todos direitos reservados para Mainframe School Treinamentos Ltda

DB2 para Mainframe

11

Selecionando linhas de uma tabela entre valores especficos


1
1
2
2
2
3
3
4
4
4
5
5
6
6
6
7 7
1...5....1...2...6...0...4...0...2...6...0...4...0...2...6...0...4...0.2
SELECT NOME
FROM MFS.TBALUNOS
WHERE NOME BETWEEN 'ANTONIO' AND 'JOAO
ORDER BY NOME DESC;

BETWEEN - Clausula para obter coluna(s) da tabela cujo valores esto entre as
constantes ou rea de dados, tambm podemos usar a clausula NOT BETWEEN.
Selecionando linhas de uma tabela entre valores determinados
1
1
2
2
2
3
3
4
4
4
5
5
6
6
6
7 7
1...5....1...2...6...0...4...0...2...6...0...4...0...2...6...0...4...0.2
SELECT NOME
FROM MFS.TBALUNOS
WHERE NOME IN ('ANTONIO, JOAO)
ORDER BY NOME;

IN : Usado para selecionar linhas com vrios valores de uma determinada coluna,
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.
ORDER BY: As linhas selecionadas sero ordenadas pela coluna NOME em
ordem ascendente o default desta clausula ascendente (ASC).
ASC: Ordem ascendente (do menor para o maior)
DESC: Ordem desendente (do maior para o menor)
Selecionando linhas distintas de uma tabela
1
1
2
2
2
3
3
4
4
4
5
5
6
6
6
7 7
1...5....1...2...6...0...4...0...2...6...0...4...0...2...6...0...4...0.2
SELECT DISTINCT NOME FROM MFS.TBALUNOS;

DB2 para Mainframe


Contando linhas de uma tabela
1
1
2
2
2
3
3
4
4
4
5
5
6
6
6
7 7
1...5....1...2...6...0...4...0...2...6...0...4...0...2...6...0...4...0.2
SELECT COUNT (*)
FROM MFS.TBALUNOS
WHERE NOME = 'ANA';

COUNT - Conta quantas linhas existem em uma tabela que satisfaa a(s)
condio(es) do WHERE.
Contando linhas distintamente de uma tabela
1
1
2
2
2
3
3
4
4
4
5
5
6
6
6
7 7
1...5....1...2...6...0...4...0...2...6...0...4...0...2...6...0...4...0.2
SELECT COUNT (DISTINCT NOME)
FROM MFS.TBALUNOS;

DISTINCT - Somente contar as linhas que a condio WHERE no se repita.


Selecionado o Menor, Maior, Somatria e Mdia aritmtica de uma coluna
1
1
2
2
2
3
3
4
4
4
5
5
6
6
6
7 7
1...5....1...2...6...0...4...0...2...6...0...4...0...2...6...0...4...0.2
SELECT MIN (IDADE),
MAX (IDADE),
SUM (IDADE),
AVG (IDADE)
FROM MFS.TBALUNOS;

MIN
MAX
SUM
AVG

- Menor idade
- Maior idade
- Somatria das idades
- Mdia aritmtica das idades

DISTINCT - Seleciona apenas uma linha cujo o contedo seja repetitivo, a coluna
com contedo repetido s aparea uma vez.

DB2 - Todos direitos reservados para Mainframe School Treinamentos Ltda

12

DB2 - Todos direitos reservados para Mainframe School Treinamentos Ltda

DB2 para Mainframe

13

Juntando duas tabelas


1
1
2
2
2
3
3
4
4
4
5
5
6
6
6
7 7
1...5....1...2...6...0...4...0...2...6...0...4...0...2...6...0...4...0.2
SELECT T1.MATRICULA,T1.NOME,T2.CURSO,T2.VALOR
FROM MFS.TBALUNOS T1,
MFS.TBCURSOS T2
WHERE T1.MATRICULA = T2.MATRICULA;

Ou
1
1
2
2
2
3
3
4
4
4
5
5
6
6
6
7 7
1...5....1...2...6...0...4...0...2...6...0...4...0...2...6...0...4...0.2
SELECT T1.MATRICULA,T1.NOME,T2.CURSO,T2.VALOR
FROM MFS.TBALUNOS T1
INNER JOIN MFS.TBCURSOS T2
ON T1.MATRICULA = T2.MATRICULA;

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 entre as tabelas pelo(s) campo(s) da clusula WHERE.
O sufixo T1 e T2 so os alias (apelidos) que as tabelas podero ter, o alias pode
assumir qualquer valor alfanumrico.
Juntando duas tabelas onde a 1 tabela a mandatria
1
1
2
2
2
3
3
4
4
4
5
5
6
6
6
7 7
1...5....1...2...6...0...4...0...2...6...0...4...0...2...6...0...4...0.2
SELECT T1.MATRICULA,T1.NOME,T2.CURSO,T2.VALOR
FROM MFS.TBALUNOS T1
LEFT OUTER JOIN MFS.TBCURSOS T2
ON
T1.MATRICULA = T2.MATRICULA;

LEFT OUTER JOIN - A funo desta clausula parmetro juntar as tabelas cuja a
matrcula tenha correspondente entre TBALUNOS e TBCURSOS, mas da tabela
TBALUNOS viro todas as linhas e da tabela TBCURSOS somente viro as linhas
que tiverem correspondentes na tabela TBALUNOS.
As colunas com contedos ---------- so colunas nulas, no COBOL
devemos assinalar as variveis indicadoras para cada uma delas.

DB2 - Todos direitos reservados para Mainframe School Treinamentos Ltda

DB2 para Mainframe

14

Juntando duas tabelas onde a 2 tabela a mandatria


1
1
2
2
2
3
3
4
4
4
5
5
6
6
6
7 7
1...5....1...2...6...0...4...0...2...6...0...4...0...2...6...0...4...0.2
SELECT T1.MATRICULA,T1.NOME,T2.CURSO,T2.VALOR
FROM MFS.TBALUNOS T1
RIGHT OUTER JOIN MFS.TBCURSOS T2
ON
T1.MATRICULA = T2.MATRICULA;

RIGHT OUTER JOIN - A funo desta clausula juntar as tabelas cuja a matricula
tenha correspondente entre TBCURSOS e TBALUNOS, mas da tabela
TBCURSOS viro todas as linhas e da tabela TBALUNOS somente viro as linhas
que tiverem correspondentes na tabela TBCURSOS.
Juntando duas tabelas onde a ambas tabelas so mandatrias
1
1
2
2
2
3
3
4
4
4
5
5
6
6
6
7 7
1...5....1...2...6...0...4...0...2...6...0...4...0...2...6...0...4...0.2
SELECT T1.MATRICULA,T1.NOME,T2.CURSO,T2.VALOR
FROM MFS.TBALUNOS T1
FULL OUTER JOIN MFS.TBCURSOS T2
ON
T1.MATRICULA = T2.MATRICULA;

FULL OUTER JOIN - A funo deste parmetro juntar as tabelas cuja a


matrcula
tenha
correspondente
entre as tabelas TBALUNOS e
TBCURSOS , mas as matrculas da tabela TBCURSOS que no tenham
correspondente na tabela TBALUNOS sero listadas com as colunas com
contedos nulos.
Pesquisando tabela por parte de uma coluna - LIKE
1
1
2
2
2
3
3
4
4
4
5
5
6
6
6
7 7
1...5....1...2...6...0...4...0...2...6...0...4...0...2...6...0...4...0.2
SELECT DESCRICAO, VALOR
FROM MFS.TBCURSOS
WHERE DESCRICAO LIKE 'C%;

LIKE - Tem a finalidade de pesquisar todos os nomes da tabela


TBCURSOS 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

DB2 - Todos direitos reservados para Mainframe School Treinamentos Ltda

DB2 para Mainframe

15

Pesquisando tabela por parte de uma coluna - SUBSTR

DB2 para Mainframe


SPUFI x COBOL

1
1
2
2
2
3
3
4
4
4
5
5
6
6
6
7 7
1...5....1...2...6...0...4...0...2...6...0...4...0...2...6...0...4...0.2
SELECT DESCRICAO, VALOR
FROM
MFS.TBCURSOS
WHERE SUBSTR (DESCRICAO,1,2) = 'CI';

INCLUDE
SPUFI
No tem

SUBSTR - Indica que campo ser pesquisado por uma parte do texto que ser
informado na clusula WHERE.
Nota
No exemplo acima sero selecionadas as linhas cuja as duas primeiras posies
do campo descrio for igual a CI.
Conceito de Variveis HOST
So variveis definidas conforme a linguagem usada, e nas instrues SQL,
essas variveis devem ser compatveis com os atributos das colunas definidas
na tabela a qual elas fazem referncias.
Campos Numricos
DB2
COBOL

PL1

VAR
VAR
VAR
VAR
VAR
VAR

DCL
DCL
DCL
DCL
DCL
DCL

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

01
01
01
01
01
01

VAR
VAR
VAR
VAR
VAR
VAR

PIC S9(04) COMP.


PIC S9(09) COMP.
COMP-1.
COMP-2.
PIC S9(03)V COMP-3.
PIC S9(01)V99 COMP-3.

Campos Alfanumricos
DB2
COBOL
VAR CHAR (20)
VAR VARCHAR(20)

COBOL
*---------------------------------------*
WORKING-STORAGE SECTION.
*---------------------------------------*
* DECLARACOES DAS VARIAVEIS DE AMBIENTE *
*---------------------------------------*
EXEC SQL
INLUDE SQLCA
END-EXEC.
*---------------------------------------*
*
DECLARACOES DA TABELA TBALUNOS
*
*---------------------------------------*
EXEC SQL
INCLUDE TBALUNOS
END-EXEC

O include no COBOL no obtm os dados da tabela em questo e sim traz para a


work do programa a estrutura da tabela (colunas, atributos).
VAR
VAR
VAR
VAR
VAR
VAR

BIN FIXED(15)
BIN FIXED(31)
BIN
BIN FLOAT(53)
DEC FIXED(03)
DECFIXED (3,2)

PL1

01 VAR PIC X(20)


DCL VAR CHAR (20)
01 VAR.
DCL VAR CHAR (20) VAR
05 VAR-LEN PIC S9(04) COMP.
05 VAR-TEXT PIC X(20).

Campos Data / Hora / Timestamp


DB2
COBOL

PL1

VAR DATE
VAR TIME
VAR TIMESTAMP

DCL VAR CHAR(10)


DCL VAR CHAR (08)
DCL VAR CHAR (26)

01 VAR PIC X(10).


01 VAR PIC X(08).
01 VAR PIC X(26).

16

INSERT
SPUFI
INSERT INTO MFS.TBALUNOS
(MATRICULA,
NOME,
NASCIMENTO)
VALUES (10,
JOSE,
1988-05-15);

COBOL
*---------------------------------------*
PROCEDURE DIVISION.
*---------------------------------------*
MOVE 10
TO MATRICULA
MOVE JOSE
TO NOME
MOVE 1988-05-15 TO NASCIMENTO
EXEC SQL
INSERT INTO MFS.TBALUNOS
(MATRICULA,
NOME,
NASCIMENTO)
VALUES (:MATRICULA,
:NOME,
:NASCIMENTO)
END-EXEC

Note que no COBOL as as variveis HOST so alimentadas antes da incluso na


tabela e na clusula VALUES essas variveis esto precedidas pelos :

OBS - VAR, simboliza o nome das colunas na tabela que futuramente sero
utilizadas como variveis que sero utilizadas nos programas
DB2 - Todos direitos reservados para Mainframe School Treinamentos Ltda

DB2 - Todos direitos reservados para Mainframe School Treinamentos Ltda

DB2 para Mainframe

17

DB2 para Mainframe

SPUFI x COBOL

SPUFI x COBOL

UPDATE

SELECT Acesso direto

SPUFI
UPDATE MFS.TBALUNOS
SET NOME = JOAO,
NASCIMENTO = 1980-02-10
WHERE MATRICULA = 10;

COBOL
*---------------------------------------*
PROCEDURE DIVISION.
*---------------------------------------*
MOVE 10
TO MATRICULA
MOVE JOAO
TO NOME
MOVE 1980-02-10 TO NASCIMENTO
EXEC SQL
UPDATE MFS.TBALUNOS
SET NOME
= :NOME,
NASCIMENTO = :NASCIMENTO
WHERE MATRICULA = :MATRICULA
END-EXEC

No comando UPDATE tambm alimentamos as variveis HOST antes da


alterao.

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

18

COBOL
MOVE 10
EXEC SQL

TO MATRICULA
SELECT MATRICULA,
NOME,
NASCIMENTO
INTO :MATRICULA,
:NOME,
:NASCIMENTO
FROM MFS.TBALUNOS
WHERE MATRICULA = :MATRICULA
END-EXEC.

Para fazer um acesso indexado (por uma determinada chave) em uma tabela,
basta alimentar a varivel HOST que representa o ndice e compar-lo na clusula
WHERE.

DELETE
SPUFI
DELETE FROM MFS.TBALUNOS
WHERE MATRICULA = 10;

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

Para fazer um acesso indexado (por uma determinada chave) em uma tabela,
basta alimentar a varivel HOST que representa o ndice e compar-lo na clusula
WHERE.

DB2 - Todos direitos reservados para Mainframe School Treinamentos Ltda

DB2 - Todos direitos reservados para Mainframe School Treinamentos Ltda

DB2 para Mainframe

19

DB2 para Mainframe

SPUFI x COBOL

SPUFI x COBOL

SELECT Acesso sequencial

JOIN Acesso relacional

SPUFI
SELECT MATRICULA, NOME,
NASCIMENTO
FROM MFS.TBALUNOS;

COBOL
*---------------------------------------*
WORKING-STORAGE SECTION.
*---------------------------------------*
* DECLARANDO O CURSOR
*---------------------------------------*
EXEC SQL DECLARE CURSOR01
CURSOR FOR
SELECT MATRICULA,
NOME,
NASCIMENTO
FROM
MFS.TBALUNOS
ORDER BY MATRICULA
END-EXEC.
*---------------------------------------*
PROCEDURE DIVISION.
*---------------------------------------*
* ABRINDO O CURSOR
*
*---------------------------------------*
EXEC SQL
OPEN CURSOR01
END-EXEC.
*---------------------------------------*
* LENDO O CURSOR
*---------------------------------------*
EXEC SQL FETCH CURSOR01
INTO :MATRICULA,
:NOME,
:NASCIMENTO
END-EXEC.
*---------------------------------------*
* FECHANDO O CURSOR
*---------------------------------------*
EXEC SQL CLOSE CURSOR01 END-EXEC.

SPUFI
SELECT
T1.MATRICULA,
T1.NOME,
T2.CURSO,
T2.VALOR
FROM MFS.TBALUNOS T1,
MFS.TBCURSOS T2
WHERE T1.MATRICULA =
T2.MATRICULA;

Para fazer um acesso entre


tabelas JOIN, devemos criar um
CURSOR, que acesse as 2
tabelas com isso estaremos
informando ao DB2 que linhas
de
contedo
da
tabela,
retornaro ao programa.
OBS - Na definio do cursor
para o JOIN, criamos
as
variveis com o prefixo VI, elas
indicam
se a tabela possui
colunas nulas. Uma coluna nula
uma coluna que no possui
contedo, as variveis VI so
definidas na WORKING como
uma
HALF-WORD
binria
(S9(04) COMP), se seu valor
aps o comando se retornar -1 a
varivel em questo ser nula.

20

COBOL
EXEC SQL DECLARE CURSOR01
CURSOR FOR SELECT
T1.MATRICULA,
T1.NOME,
T2.CURSO,
T2.VALOR
FROM MFS.TBALUNOSS T1,
MFS.TBCURSOS T2
WHERE T1.MATRICULA =
T2.MATRICULA
END-EXEC.
*--------------------------------------*
PROCEDURE DIVISION.
*--------------------------------------*
*
ABRINDO O CURSOR
*
*--------------------------------------*
EXEC SQL
OPEN CURSOR01
END-EXEC.
*--------------------------------------*
*
LENDO O CURSOR
*--------------------------------------*
EXEC SQL
FETCH CURSOR01
INTO :MATRICULA,
:NOME
:VI-NOME,
:DESCRICAO :VI-DESC,
:VALOR
:VI-VALOR
END-EXEC.
*--------------------------------------*
*
FECHANDO O CURSOR
*--------------------------------------*
EXEC SQL
CLOSE CURSOR01
END-EXEC.

Para fazer um acesso sequencial em uma tabela, devemos criar um CURSOR,


com isso estaremos informando ao DB2 que vrias linhas de contedo da tabela,
retornaro ao programa.
OBS - A instruo de definio do CURSOR deve ser feita na WORKINGSTORAGE SECTION do COBOL, j o comando de abertura (OPEN), leitura
(FETCH) e fechamento (CLOSE) da tabela, devem ser feitos em rotinas diferentes
do programa, localizadas na PROCEDURE DIVISION.
DB2 - Todos direitos reservados para Mainframe School Treinamentos Ltda

DB2 - Todos direitos reservados para Mainframe School Treinamentos Ltda

DB2 para Mainframe

21

DB2 para Mainframe

SQLCODE Principais cdigos de retorno do acesso ao DB2


Os cdigos de retorno do DB2 so informados na varivel SQLCODE, veja
abaixo alguns valores mais usuais:
CD.
+100
-102
-117
-180
-181
-199
-204
-205
-206
-224
-229
+231
+304
-305
-311
-501
-502
-503
-530
-545
-803
-805
-811
-818
-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
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
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
Check constraint prevents the INSERT/UPDATE
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
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.

DB2 - Todos direitos reservados para Mainframe School Treinamentos Ltda

DB2 - Todos direitos reservados para Mainframe School Treinamentos Ltda

21

Você também pode gostar