Db2 Mainframes
Db2 Mainframes
Db2 Mainframes
DB2
Data Base 2
Pgina
Student Guide
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
O que o DB2
Processo de execuo
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
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.
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;
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;
11
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;
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;
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.
12
13
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;
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.
14
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;
15
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
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
BIN FIXED(15)
BIN FIXED(31)
BIN
BIN FLOAT(53)
DEC FIXED(03)
DECFIXED (3,2)
PL1
PL1
VAR DATE
VAR TIME
VAR TIMESTAMP
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
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
17
SPUFI x COBOL
SPUFI x COBOL
UPDATE
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
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.
19
SPUFI x COBOL
SPUFI x COBOL
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;
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.
21
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.
21