Escolar Documentos
Profissional Documentos
Cultura Documentos
DB2
(Data Base 2)
DB2
Programao
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
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.
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
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.
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
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
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
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
DATA BASE 2
AMBIENTE DB2
Aplicativo
BIND
Mdulos
Acesso
Tabela
Tabela
Mdulos
Acesso
Tabela
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.
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.
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.
DATA BASE 2
COMANDOS
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;
10
DATA BASE 2
COMANDOS
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
11
DATA BASE 2
COMANDOS
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.
12
DATA BASE 2
COMANDOS
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;
13
DATA BASE 2
COMANDOS
COBOL
EXEC SQL DROP VIEW DBAUPNGO.TBVIEW
IN DBAUPNGO.TBSUPNGO
END-EXEC
SPUFI
DROP VIEW DBAUPNGO.TBVIEW
IN DBAUPNGO.TBSUPNGO;
Parmetros
TBVIEW
14
DATA BASE 2
COMANDOS
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
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.
15
DATA BASE 2
COMANDOS
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.
16
DATA BASE 2
COMANDOS
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.
17
DATA BASE 2
COMANDOS
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.
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
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.
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.
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.
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).
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.
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.
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
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.
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.
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..
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
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.
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.
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)
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.
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
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.
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;
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.
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.
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.
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
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
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
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.
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%
LIKE _ _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
43
DATA BASE 2
SPUFI
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
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
44
DATA BASE 2
SPUFI
SSID: DB2N
SPUFI
DCLGEN
PROGRAM PREPARATION
PRECOMPILE
BIND/REBIND/FREE
RUN
DB2 COMMANDS
UTILITIES
DB2I DEFAULTS
EXIT
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
Selecionar o opo 1 e teclar ENTER
45
DATA BASE 2
SPUFI
(Y/N
(Y/N
(Y/N
(Y/N
(Y/N
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)
46
DATA BASE 2
SPUFI
SSID: DB2N
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
Aps digitarmos os dados acima teclar ENTER
47
DATA BASE 2
SPUFI
(Y/N
(Y/N
(Y/N
(Y/N
(Y/N
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.
48
DATA BASE 2
SPUFI
F3=Exit
F5=Rfind
F6=Rchange
NOTA
Aps a edio do comando SQL devemos acionar PF3, para executa-lo.
49
DATA BASE 2
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
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
50
DATA BASE 2
SPUFI
NOTA
Ser exibido resultado do comando ou o erro caso o comando no for bem sucedido, repetir novamente o processo para outros
comando.
51
DATA BASE 2
DCLGEN
NOTA
O DCLGEN executado no ambiente TSO
52
DATA BASE 2
DCLGEN
SSID: DB2N
SPUFI
DCLGEN
PROGRAM PREPARATION
PRECOMPILE
BIND/REBIND/FREE
RUN
DB2 COMMANDS
UTILITIES
DB2I DEFAULTS
EXIT
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
Selecionar o opo 2 e teclar ENTER
53
DATA BASE 2
DCLGEN
(Unqualified)
(Optional)
(Optional)
F2=SPLIT
F8=DOWN
ADD
NO
YES
NO
NO
F3=END
F9=SWAP
F5=RFIND
F11=RIGHT
F6=RCHANGE
F12=RETRIEVE
NOTA
Preencher as opes acima e teclar ENTER
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.
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
//
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
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
58
BASEPrticas
2
Dicas eDATA
Orientaes
DICAS E ORIENTAES PRTICAS
ERRADO:
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.
60
DATA BASE 2
DICAS E ORIENTAES PRTICAS
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
61
DATA BASE 2
DICAS E ORIENTAES PRTICAS
62
DATA BASE 2
DICAS E ORIENTAES PRTICAS
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
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
65