Baixar Agora - Maceiras Sistemas

Propaganda
GENNARI & PEARTREE PROJETOS E SISTEMAS
BANCO DE DADOS DB2
Desenvolvida para o programa de treinamento Unibanco por:
Luiz Roberto de Souza
ÍNDICE ANALÍTICO
1. BANCO DE DADOS DB2.................................................................................................................. 2
1.1. INTRODUÇÃO ................................................................................................................................. 2
1.2. CATÁLOGO .................................................................................................................................... 2
1.3. TABELAS DB2 ............................................................................................................................... 2
1.4. TIPOS DE DADOS DB2 .................................................................................................................... 2
1.5. CHAVES ......................................................................................................................................... 3
2. RELACIONAMENTOS .................................................................................................................... 4
2.1. TIPOS DE RELACIONAMENTOS ........................................................................................................ 4
2.2. INTEGRIDADE REFERENCIAL .......................................................................................................... 5
2.3. REGRAS DE INTEGRIDADE REFERENCIAL DO DB2 .......................................................................... 5
3. A LINGUAGEM SQL ........................................................................................................................ 6
3.1. INTRODUÇÃO ................................................................................................................................. 6
3.2. DB2 INTERACTIVE (DB2 INTERATIVO) – SPUFI ........................................................................... 6
3.3. OPERADORES RELACIONAIS ........................................................................................................... 7
3.4. COMANDOS DA STRUCTURED QUERY LANGUAGE ......................................................................... 7
3.5. TABELAS EXEMPLO ........................................................................................................................ 8
3.6. SELECT BÁSICO ........................................................................................................................... 9
3.7. SELECT AVANÇADO ................................................................................................................... 14
3.8. UPDATE..................................................................................................................................... 15
3.9. DELETE ..................................................................................................................................... 15
3.10. INSERT .................................................................................................................................... 16
4. O DB2 E O COBOL ......................................................................................................................... 17
4.1. LINGUAGEM HOSPEDEIRA ........................................................................................................... 17
4.2. SQLCA ....................................................................................................................................... 18
4.3. VARIÁVEIS HOST ......................................................................................................................... 18
4.4. SQLCODE .................................................................................................................................. 19
4.5. TRABALHANDO COM CONJUNTO DE REGISTROS ........................................................................... 19
4.5.1. Cursor ................................................................................................................................. 19
5. EXERCÍCIOS ................................................................................................................................... 20
DB2 e Linguagem SQL
Página 1
1. BANCO DE DADOS DB2
1.1. Introdução
O DB2 é um gerenciador de bancos de dados relacional, desenvolvido pela IBM para
acessar e manipular as bases de dados. Faz uso da linguagem SQL como DML (Data
Manipulation Language – Linguagem de Manipulação de Dados).
Roda apenas em ambiente MVS, mas existe também uma versão de banco de dados
relacional desenvolvida para o DOS/VSE denominada SQL/DS. Seu manuseio é idêntico ao
do DB2 em termos de programação.
Este curso é introdutório, e nele aprenderemos os conceitos básicos do DB2, e os
principais comandos da linguagem SQL, utilizada para acesso as bases.
1.2. Catálogo
O catálogo é um elemento muito importante no banco de dados DB2. Trata-se na
verdade de um arquivo no qual são armazenadas as definições de todos os elementos: as
tabelas com suas respectivas características e os índices.
1.3. Tabelas DB2
A estrutura de arquivo de uma tabela DB2 pode ser comparada a de um arquivo
DBASE/CLIPPER. A tabela DB2 estará dividida em linhas (que chamaremos de registros) e
colunas (que serão os nossos campos).
Analogamente ao DBASE, quando se cria uma tabela DB2, cada um dos campos do
registro precisa ser previamente definido e nomeado. Cada uma dessas colunas, com seu
respectivo nome, será a referência que o DB2 terá para tratar cada dado que será armazenado.
Observe com isso, uma diferença gritante com os arquivos que utilizávamos em
Cobol. O chamado Registro 0. Os arquivos do VSAM por exemplo apenas contém
informações gravadas no disco, agrupadas por linhas. De dentro do nosso programa
determinamos como cada informação será acessada, dando seus nomes na DATA DIVISION
e podendo inclusive tratar cada registro de maneira diferente (header, detalhe e trailler). Na
tabela DB2 o nome do campo também é obrigatoriamente gravado na tabela.
1.4. Tipos de dados DB2
Os tipos de dados, como já sabemos, definem os tipos de informações que podem ser
armazenadas pelos campos. Os campos são definidos durante a criação da tabela,
procedimento que deve ser realizado apenas pelo DBA (Data Base Administrator). Ao
programador cabe saber o que quer dizer cada definição.
DB2 e Linguagem SQL
Página 2
Observe a tabela:
Tipo DB2
Descrição
Correspondente COBOL
CHAR
Alfanumérico
PIC X
DECIMAL
Numérico
PIC 9 COMP-3
DATE
Valores do tipo data
PIC X(10)
TIME
Valores do tipo hora
PIC X(06)
TIMESTAMP
Valores de data com hora
PIC X(26)
INT
Inteiros com sinal
PIC S9(9) COMP
SMALLINT
Inteiros menores
PIC S9(4) COMP
OBSERVAÇÕES
 Decimal  todos os campos numéricos para o DB2 são armazenados no formato
compactado. Portanto, sempre serão acessados no Cobol através de variáveis
COMP-3.
 Date  os valores definidos como date são armazenados no formato aaaammdd,
compactado. Porém, os comandos de acesso ao DB2 sempre receberão e enviarão
as datas no formato aaaa-mm-dd (depende do adotado pe lo cliente).
 Time  os comandos de acesso ao DB2 sempre receberão e enviarão os horas no
formato hh:mm:ss.
 Valor NULL  Null representará a ausência de informação em um determinado
campo. Não será 0 (zero) nem espaço em branco. Por exemplo, na digitação de um
saldo, zero será um valor absolutamente válido porém, deixar o campo sem digitar
nada não será permitido.
Cabeçalho ou Registro 0 
Codigo
Nome
Fone
Registro 1 
001
Fulano de Tal
2527070
Registro 2 
002
Ciclano da Silva
9714698
Registro 3 
003
Jurema Emengarda
2345696
Registro 4 
004
Eustákio Parreira
2302156
Registro 5 
005
Astrogildo Figueira
2236652
1.5. Chaves
Uma chave é um campo que será utilizado para a criação de um índice e,
consequentemente, utilizado como argumento de pesquisa em uma tabela.
A chave primária será o primeiro índice de uma tabela. É também aquele que torna o
registro único, ou seja, nenhum outro na tabela inteira será igual a ele.
Uma chave estrangeira é constituída de um ou mais campos de uma tabela que se
referem à chave primária de uma outra tabela. Ela indica um relacionamento entre as duas.
DB2 e Linguagem SQL
Página 3
2. RELACIONAMENTOS
Os dados são representados na forma de tabelas, que podem possuir diversas
associações entre si, as quais serão chamadas de relacionamentos.
Suponha as tabelas de Produtos e Fornecedores a seguir:
Campos
Código Produto Nome
Fornecedor
Código Fornecedor Razão Social
001 A
01
01 Empresa S/A
002 B
01
02 Indústria Ltda.
003 C
03
03 Fábrica Ind. e Com.
004 D
02
04 Siderúrgica do Ferro
005 E
01
05 Mineradora de Minério
006 F
04
06 Eng. Engenharia Ltda.
007 G
05
008 H
06
009 I
02
010 J
04
Registros
Determinaremos para a tabela Produtos o campo Código Produto como sendo chave
primária. Isso quer dizer que ele nunca se repetirá na tabela (haverá apenas um produto de
código 001, um produto de código 002 e assim por diante). Na tabela Fornecedores o campo
Código Fornecedor será a chave primária com as mesmas características. Isso representa que
foram criados até então dois índices diferentes que poderão ser utilizados para localizar
registros de forma mais rápida.
Em um dado momento, pode ser interessante saber quem é o fornecedor de um
determinado produto, bem como obter outras informações deste fornecedor. Primeiramente,
devemos determinar o que há de comum entre os registros das duas tabelas. Observaremos
então que cada uma das tabelas possui um campo destinado a armazenar o código do
fornecedor. Este campo pode ser um elo de ligação entre elas.
Sendo assim, se tomarmos como referência a tabela Produtos, o campo Código
Produto será a chave primária e Código Fornecedor da tabela Fornecedores será uma chave
estrangeira. Uma observação muito importante deve ser levada em consideração: os campos
que são utilizados para ligação entre duas tabelas devem possuir as mesmas propriedades.
Na associação lógica entre as ocorrências das entidades, as chaves primárias e
estrangeiras serão utilizadas como argumentos de um operador relacional da linguagem SQL.
2.1. Tipos de relacionamentos
Relacionamentos um para muitos
Em um relacionamento do tipo um para muitos, qualquer ocorrência de uma entidade
pode estar associada à várias ocorrências em outra entidade. Qualquer outra deve estar
DB2 e Linguagem SQL
Página 4
associada à apenas uma ocorrência da primeira. Por exemplo, um fornecedor pode fornecer
vários produtos.
Relacionamentos muitos para muitos
Em um relacionamento deste tipo, qualquer ocorrência de ambas as entidades pode
estar associada à várias ocorrências da entidade oposta.
Exemplo:
EMPREGADOS
PROJETOS
Josefina
Natal
Pafúncio
Qualidade
Godofredo
Supondo Empregados como tabela primária, e a chave primária de Projetos como
estrangeira, Josefina e Godofredo estão alocados no projeto Natal (n:1). Porém, observe que
Pafúncio sozinho está alocado nos projetos Natal e Qualidade (1:n).
2.2. Integridade referencial
A integridade referencial garante que qualquer valor apontado pela chave estrangeira
tenha um valor correspondente na chave primária à qual está associada. Por exemplo, na tela
de cadastro de produtos não é possível especificar um código de fornecedor que não tenha
sido previamente cadastrado na tabela fornecedores.
No DB2 a integridade referencial é implementada através da programação SQL. Em
outros bancos de dados, como Access do ambiente Windows, existe o objeto relacionamento
criado juntamente com os demais objetos do sistema. Neste caso, através de propriedades
predefinidas, a integridade pode ser estabelecida automaticamente.
2.3. Regras de integridade referencial do DB2
 Uma chave primária tem valor único e não nulo;
 Uma chave estrangeira é nula ou tem valor correspondente na chave primária;
 Todas as tabelas associadas entre si via regra de integridade referencial forma um
conjunto chamado de ESTRUTURA REFERENCIAL ou REFERENTIAL
STRUCTURE;
 Uma tabela com chave primária definida é chamada de PARENT TABLE ou
TABELA MÃE;
 Uma tabela com chave estrangeira definida é chamada de DEPENDENT TABLE
ou TABELA DEPENDENTE;
 Uma linha da PARENT TABLE é chamada de PARENT ROW ou LINHA MÃE
se existir pelo menos uma linha na tabela dependente com chave estrangeira
correspondente à sua chave primária;
 Uma linha de uma DEPENDENT TABLE é chamada de DEPENDENT ROW ou
LINHA DEPENDENTE se existir uma linha mão com valor de chave primária
correspondente à da sua chave estrangeira.
DB2 e Linguagem SQL
Página 5
Quando ocorre a deleção de uma linha da tabela mãe, podem ocorrer situações
conforme segue:
CASCADE  todas as linhas dependentes são eliminadas juntamente com a mãe;
SET NULL  regra onde as chaves estrangeiras das linhas dependentes são
atualizadas com valor nulo após a eliminação da mãe.
RESTRICT  a eliminação da linha mãe é impedida. Neste caso somente as linhas
que não são mãe podem ser eliminadas.
3. A LINGUAGEM SQL
3.1. Introdução
A SQL (Structured Query Language ou Linguagem Estruturada de Consultas)
originou-se inicialmente em 1970 de uma linguagem chamada Sequel. Na verdade, em inglês,
muitas vezes tem seu nome pronunciado como Sequel em lugar de ess cue ell. Hoje ela possui
diversas variações e é utilizada para acesso a muitas bases de dados diferentes.
Pode ser encarada também como uma espécie de linguagem universal para acesso a
bancos de dados. Encontraremos SQL em DB2, Delphi, Access, Visual Basic e na grande
maioria dos gerenciadores de bancos de dados atuais. Isso significa que um programador
conhecedor de SQL tem uma grande vantagem e pode trabalhar em vários ambientes e bases
de dados diferentes.
3.2. DB2 Interactive (DB2 Interativo) – SPUFI
O DB2 Interativo é constituído por um conjunto de programas que possibilitam a
execução imediata de alguma tarefa na base de dados.
O SPUFI (SQL Processing Using File Input – Processador de SQL Usando Arquivo
de Entrada) é uma ferramenta para executar instruções SQL. Trabalha com um arquivo de
entrada e um arquivo de saída. Dirige o usuário para um ciclo de trabalho que consiste
basicamente de três fases:
EDIT  edição de arquivo de entrada onde é codificada uma ou mais instruções SQL;
EXECUTE  interpreta e executa as instruções constantes do arquivo de entrada.
BROWSE  mostra o arquivo de saída como um relatório do resultado da execução
DB2 e Linguagem SQL
Página 6
DB2
SPUFI
Edit
Execute
Browse
Input
Output
Select ...
Relatório
BANCO DE DADOS
3.3. Operadores relacionais
Operador
Significado
=
Igual
<> ou ¬=
Diferente
>
Maior
>=
Maior ou igual
<
Menor
<=
Menor ou igual
¬>
Não maior
¬<
Não menor
3.4. Comandos da Structured Query Language
Abaixo, veremos uma listagem dos comandos SQL que utilizaremos em nossos
programas Cobol. Depois veremos a sintaxe de cada um deles e exemplos de utilização.
DML (Data Manipulation Language – Linguagem de Manipulação de Dados)
SELECT 
pesquisa de dados
UPDATE 
atualização de dados
DELETE 
deleção de dados
INSERT 
inserção de dados
DB2 e Linguagem SQL
Página 7
DDL (Data Definicion Language – Linguagem de Definição de Dados)
CREATE 
definição de um objeto (tabela, índice, etc.)
ALTER 
alteração da definição de um objeto
DROP 
deleção de um objeto (não confundir com dados)
CONTROL
GRANT 
fornece um privilégio
REVOKE 
revoga um privilégio
3.5. Tabelas exemplo
As tabelas a seguir serão utilizadas como base para a execução de todos os comandos
que iremos aprender:
PRODUTOS
Codigo Nome
Preco
Fornecedor
001 Drive CD-ROM 2X
13,01
04
002 Ensacador de fumaça
45,32
01
003 Placa FAX/Modem 2.400 bps
0,50
03
004 Prego de areia
7,42
01
56,23
03
2,37
04
007 Enxugador de gelo seco
12,36
01
008 Impressora matricial Rima XT 180
10,00
03
5,00
02
150,00
02
005 Calibrador de pneu de trem
006 Microcomputador PC 4,77 MHz
009 Tesoura d’água
010 Vídeo Cassete Betamax
FORNECEDORES
Codigo Razao
Cidade
01 ACME & Pernalonga Associados
Bauru
02 Agapê Corp.
Pederneiras
03 Itautreco
São Paulo
04 Ibeême do Brasil Ltda.
Bauru
DB2 e Linguagem SQL
Página 8
3.6. SELECT básico
Pesquisa por registros em uma tabela, podendo retornar um registro único (apenas o
primeiro encontrado) ou gerar um conjunto de registros que poderá ser tratado
independentemente. Dentro do Cobol o conjunto gerado será chamado de cursor.
Sintaxe:
SELECT [DISTINCT] <campos>
FROM <tabela>
WHERE <condição>
ORDER BY <campo> [ASC | DESC]
Não há necessidade dos argumentos do comando SELECT serem colocados em linhas
diferentes. Tal codificação é utilizada apenas para efeitos de melhor entendimento do
programa que está sendo escrito.
Exemplos:
 Para todos os registros de uma tabela disponibilizando apenas alguns campos
SELECT CODIGO, NOME, PRECO
FROM PRODUTOS
 Para selecionar todos os registros de uma tabela disponibilizando também todos
os campos
SELECT *
FROM PRODUTOS
Todas as vezes que se quiser selecionar todos os campos de uma tabela, basta
substituir a lista de nomes de campos por um asterisco (*).
DB2 e Linguagem SQL
Página 9
 Selecionar todos os campos que satisfaçam uma determinada condição
Aqueles que possuam preço superior a 10
SELECT * FROM PRODUTOS
WHERE PRECO > 10
Codigo Nome
Preco
Fornecedor
001 Drive CD-ROM 2X
13,01
04
002 Ensacador de fumaça
45,32
01
005 Calibrador de pneu de trem
56,23
03
007 Enxugador de gelo seco
12,36
01
010 Vídeo Cassete Betamax
150,00
02
 Outros exemplos de condições
SELECT * FROM PRODUTOS
WHERE PRECO >= 10 AND PRECO <=50
SELECT * FROM PRODUTOS
WHERE PRECO < 10 OR PRECO > 50
SELECT * FROM PRODUTOS
WHERE FORNECEDOR <> 1
Observe que podem ser utilizadas também múltiplas condições, ligadas através dos
operadores lógicos AND e OR.
O uso de parênteses para impor a ordem em que as expressões lógicas serão resolvidas
também é permitido conforme segue:
SELECT * FROM PRODUTOS
WHERE FORNECEDOR = 1 AND (PRECO < 10 OR PRECO > 30)
Codigo Nome
002 Ensacador de fumaça
DB2 e Linguagem SQL
Preco
Fornecedor
45,32
01
Página 10
Procurando por um conjunto predefinido de valores
SELECT * FROM PRODUTOS
WHERE FORNECEDOR IN (2 , 3 , 4)
O conjunto resultante será:
Codigo Nome
001 Drive CD-ROM 2X
003 Placa FAX/Modem 2.400 bps
005 Calibrador de pneu de trem
006 Microcomputador PC 4,77 MHz
008 Impressora matricial Rima XT 180
009 Tesoura d’água
010 Vídeo Cassete Betamax
Preco
Fornecedor
13,01
04
0,50
03
56,23
03
2,37
04
10,00
03
5,00
02
150,00
02
Observe que a expressão
FORNECEDOR IN (2 , 3 , 4)
substitui a expressão
FORNECEDOR = 2 OR FORNECEDOR = 3 OR FORNECEDOR = 4
 Selecionando registros em que determinado campo esteja em um intervalo
fechado de valores
SELECT * FROM PRODUTOS
WHERE PRECO BETWEEN 10 AND 50
O conjunto resultante será:
Codigo Nome
Preco
Fornecedor
001 Drive CD-ROM 2X
13,01
04
002 Ensacador de fumaça
45,32
01
007 Enxugador de gelo seco
12,36
01
008 Impressora matricial Rima XT 180
10,00
03
A cláusula BETWEEN (entre) determina todos os registros cujo campo esteja entre o
valor inicial e o valor final especificados, inclusive.
DB2 e Linguagem SQL
Página 11
Sendo assim,
PRECO BETWEEN 10 AND 50
é igual a
PRECO >= 10 AND PRECO <= 50
 Selecionando registros através de pesquisas parciais
SELECT * FROM FORNECEDORES
WHERE RAZAO LIKE ‘A%’
O conjunto resultante será:
Codigo Razao
Cidade
01 ACME & Pernalonga Associados
Bauru
02 Agapê Corp.
Pederneiras
A cláusula LIKE permite que sejam utilizados dois caracteres como curingas para
estabelecer um padrão a ser utilizado na consulta.
O caracter % especifica uma seqüência de caracteres quaisquer e o caracter _
(sublinhado) indica a substituição de um único caracter.
Sendo assim, RAZAO LIKE ‘A%’ traria todos os fornecedores cuja razão social
começa com a letra ‘A’, não importando quais ou quantos caracteres viessem depois. Este
caracter também pode ser utilizado no meio ou no final da cláusula LIKE.
Observe agora outros exemplos dos curingas da cláusula LIKE:
Padrão
Exemplos de retorno
‘LU%’
Luiz
Luciane
Luís
Lucas
Luzia
‘LUI_’
Luiz
Luis
‘LU_Z
Luiz Roberto
Luíz Carlos
Luiz Augusto
DB2 e Linguagem SQL
Página 12
OBS  Para negar os operadores LIKE e BETWEEN basta inserir o operador lógico
NOT antes deles. Por exemplo, o comando abaixo localiza todos os registros em que o preço
não esteja entre 10 e 50 inclusive:
SELECT * FROM PRODUTOS
WHERE PRECO NOT BETWEEN 10 AND 50
 Selecionando registros com valores nulos
SELECT * FROM PRODUTOS
WHERE PRECO IS NULL
Colocando como condição da cláusula WHERE a expressão <CAMPO> IS NULL,
serão localizados todos os registros onde o campo especificado tenha valor nulo. Lembre-se,
conforme foi visto antes, que NULO é diferente de BRANCOS ou de ZEROS, representa a
ausência de qualquer valor.
 Selecionando registros com valores não nulos
É bastante parecido com o exemplo anterior. A diferença é que o operador lógico
NOT será inserido antes do valor NULL.
SELECT * FROM FORNECEDORES
WHERE CIDADE IS NOT NULL
 Selecionando apenas um registro
Como visto até aqui, o comando SELECT gera um conjunto de registros que poderá
ser processado da melhor maneira pelo programa. Porém pode existir o caso em que apenas
um registro nos interessará.
SELECT DISTINCT * FROM FORNECEDORES
WHERE CODIGO = 1
Codigo Razao
01 ACME & Pernalonga Associados
Cidade
Bauru
A cláusula DISTINCT localiza apenas o primeiro registro que satisfaça a condição
estabelecida pela cláusula WHERE, ignorando quaisquer outros que possam existir.
DB2 e Linguagem SQL
Página 13
 Ordenando o conjunto resultante
Exemplo
SELECT NOME PRECO FROM PRODUTOS
WHERE PRECO > 10
ORDER BY NOME
OBSERVAÇÕES
 O SELECT anterior trará todos os registros de produtos que satisfaçam a condição
porém, o resultado estará em ordem alfabética de NOME;
 As colunas classificadas (através da cláusula ORDER BY) devem obrigatoriamente
ser referenciadas pelo SELECT;
 Podemos especificar colunas para o ORDER BY fornecendo o número que indica a
posição de cada uma no SELECT. A única cláusula que permite isso é a ORDER
BY;
 ORDER BY classifica uma tabela resultante (conjunto). Sendo assim deve ser
sempre a última linha a aparecer numa instrução SELECT e deve estar sozinha.
 Selecionando registros de tabelas diferentes
SELECT PRODUTOS.CODIGO, PRODUTOS.NOME, PRODUTO.FORNECEDOR
FORNECEDORES.CODIGO, FORNECEDORES.RAZAO
FROM PRODUTOS, FORNECEDORES
WHERE PRODUTOS.NOME = ‘Enxugador de gelo seco’
AND
FORNECEDORES.CODIGO
PRODUTOS.FORNECEDOR
=
Observe que para especificar os campos que interessavam foi utilizado o formato
TABELA.CAMPO. Este formato não é obrigatório a não ser que existam campos com o
mesmo nome nas duas tabelas. Neste caso, não há como o SQL “saber” de qual das duas está
sendo feita a seleção.
3.7. SELECT avançado
Transforma dados de uma coluna em um único valor.
Dados numéricos
SUM  total dos valores da coluna
AVG  média dos valores da coluna
DB2 e Linguagem SQL
Página 14
3.8. UPDATE
Atualiza (altera) dados dos campos de uma tabela
Sintaxe:
UPDATE TABELA
SET <CAMPO 1> = <VALOR 1>
<CAMPO 2> = <VALOR 2>
...
<CAMPO N> = <VALOR N>
WHERE <CONDIÇÃO>
A cláusula WHERE é de suma importância. Se a mesma não for especificada
juntamente com uma condição para determinar quais registros serão atualizados, todos serão,
independente do valor que possuírem.
Exemplos
O exemplo a seguir grava o valor 10 no campo CODIGO da tabela PRODUTOS em
todos os registros em que o CODIGO é igual a 10.
UPDATE PRODUTOS
SET CODIGO = 10
WHERE CODIGO = 1
O próximo exemplo reajusta o PRECO em 10% em todos os registros onde PRECO
seja inferior a 10.
UPDATE PRODUTOS
SET PRECO = PRECO * 1.10
WHERE PRECO < 10
3.9. DELETE
Deleta um ou mais registros de uma tabela. O número de registros a ser deletados é
determinado pela condição imposta na cláusula WHERE.
Sintaxe
DELETE FROM <TABELA>
WHERE <CONDIÇÃO>
Deve-se também atentar para a condição estabelecida na cláusula WHERE. Se a
mesma for omitida todos os registros da tabela serão apagados.
DB2 e Linguagem SQL
Página 15
Exemplos
Deletar todos os fornecedores de Pederneiras:
DELETE FROM <FORNECEDORES>
WHERE CIDADE = ‘PEDERNEIRAS’
Deletar todos os produtos do fornecedor 1 cujo preço seja superior a 50:
DELETE FROM <PRODUTOS>
WHERE PRECO > 50 AND FORNECEDOR = 1
Deletar todos os produtos que sejam dos fornecedores 1, 3 ou 5:
DELETE FROM PRODUTOS
WHERE FORNECEDOR IN (1 , 3 , 5)
3.10. INSERT
Insere uma nova linha na tabela. O comando INSERT permite que não sejam
codificados todos os campos. Os não obrigatórios não requerem que um valor seja
especificado. Se isso acontecer, o DB2 automaticamente atribuirá valor NULL para os
campos. Quando o campo for do tipo DATE e o mesmo permitir a inserção de valores NULL,
deverá ser especificado tal valor, do contrário o DB2 retornará SQLCODE –180 (data
inválida) e a inserção será mal sucedida.
Sintaxe:
INSERT INTO <TABELA>
(CAMPO1, CAMPO2, CAMPO3, CAMPO4, ..., CAMPON)
VALUES
(VALOR1, VALOR2, VALOR3, VALOR4, ..., VALORN)
Exemplo:
 Inserindo um novo registro na tabela de fornecedores
INSERT INTO FORNECEDORES
(CODIGO, RAZAO, CIDADE)
VALUES
(05, ‘Filipis’, ‘Bauru’)
 Gerando uma tabela AUXILIAR com todos os registros da tabela PRODUTOS
INSERT INTO AUXILIAR
DB2 e Linguagem SQL
Página 16
SELECT * FROM PRODUTOS
 Gerando uma tabela AUXILIAR com todos os PRODUTOS do FORNECEDOR
01:
INSERT INTO AUXILIAR
SELECT * FROM PRODUTOS
WHERE FORNECEDOR = 1
OBS  Para os dois últimos exemplos, as tabelas devem ter a mesma estrutura
definida.
4. O DB2 E O COBOL
4.1. Linguagem Hospedeira
Os exemplos de comandos SQL vistos até aqui nos serviram para aprender a sintaxe e
funcionamento da linguagem de maneira fácil. Porém, dentro do DB2 essa não é a ,maneira
que utilizaremos para acessar as bases de dados. Na verdade, já vimos que o DB2 é um
software que controla os acessos ao banco de dados, não uma linguagem de programação.
Sendo assim, ele precisa ser acessado a partir de programas codificados em linguagens como
Cobol ou CSP. Observe o esquema a seguir:
PROGRAMA
COBOL
SQL
TABELA
DB2
SQLCA
Podemos dizer que o Cobol servirá como linguagem hospedeira para o DB2 e fará
todos os acessos à base de dados através de linguagem SQL.
Todos os comandos do DB2 (SQL) que serão executados dentro de um programa
Cobol deverão ser precedidos da linha EXEC SQL e seguidos por END-EXEC, conforme
sintaxe geral a seguir:
EXEC SQL
<COMANDOS SQL>
END-EXEC
DB2 e Linguagem SQL
Página 17
O programa Cobol, antes de ser compilado, passará por um Translator. Depois será
executado a partir de um utilitário DB2, em JCL1 próprio.
Para que tudo isso funcione e que a linguagem Cobol possa atuar como hospedeira
para o DB2, precisaremos de alguns elementos que possibilitem essa comunicação. Esses
elementos são a SQLCA e as variáveis host.
4.2. SQLCA
SQLCA é o nome dado à área de comunicação entre o programa e o DB2. O layout
dessa área precisa ser copiado para o programa, bastando para tanto, incluir na WORKINGSTORAGE SECTION o comando:
EXEC SQL
INCLUDE SQLCA
END-EXEC
O comando INCLUDE é utilizado para copiar no programa books de registros do
DB2. Pode ser utilizado tanto para a SQLCA, como para registros de tabelas, catalogadas
através do utilitário DCLGEN.
A SQLCA também disponibiliza um recurso muito importante chamado SQLCODE,
um campo que contém o código de retorno dos acessos efetuados e deverá sempre ser testado
após a execução de cada EXEC SQL codificada na PROCEDURE DIVISION. Entenda este
código de retorno como sendo a File Status do DB2.
4.3. Variáveis Host
São variáveis criadas para fazer a permuta de valores entre o DB2 (SQL) e a
linguagem de programação utilizada como hospedeira, no nosso caso o Cobol.
Podem ser definidas normalmente na WORKING-STORAGE SECTION do programa
seguindo as correspondências de tipos de dados que são apresentadas no início dessa apostila,
mas o DB2 oferece um utilitário para facilitar a definição das hosts. O DCLGEN pode gerar
descrições em Cobol para os campos das tabelas. As definições são geradas em books que
podem depois ser copiados através do INCLUDE. Criar as definições manualmente pelo
programa pode ser vantagem, uma vez que tabelas diferentes podem conter nomes iguais e,
neste caso, o programador poderá diferenciar os nomes das variáveis.
Sempre que um comando SQL se referenciar a uma variável host, está deverá ter seu
nome precedido por dois pontos (:).
Exemplo
1
Job Control Language, é a linguagem que controla a execução de todas as tarefas no mainframe. Neste
caso, não faremos uso da linguagem nativa, mas sim de uma implementada pelo próprio DB2.
DB2 e Linguagem SQL
Página 18
MOVE 2904 TO CH-CLI.
EXEC SQL
SELECT CODIGO, NOME, TELEFONE
FROM CLIENTES
WHERE CODIGO = :CH-CLI
4.4. SQLCODE
Como visto anteriormente é o código de retorno da execução de comandos SQL.
Possui quatro posições no formato:
S
9
9
9
Podemos dizer que existem três tipos de SQLCODE, conforme segue:
 SQLCODE negativo  aconteceu um erro grave ou de hardware no acesso. Pode
exigir o cancelamento do programa.
 SQLCODE zero  a operação foi concluída com sucesso.
 SQLCODE positivo  indica warnings (avisos) que podem gerar um caminho
diferente a ser executado pelo programa sem que haja necessariamente
cancelamento.
Principais códigos de retorno do SQL
Código
Descrição
-180
Data inválida
-803
Chave duplicada
-922
Falta de autorização
ZEROS
Comando concluído com êxito
+100
Chave não encontrada ou
Fim da query de múltiplas linhas ou
Fim do arquivo (tabela)
4.5. Trabalhando com conjunto de registros
4.5.1. Cursor
Suponha a seguinte situação: tem-se uma tabela com 50.000 registros; um programa
deverá realizar uma atualização em todos os registros dessa tabela que satisfaçam a uma
determinada condição qualquer.
DB2 e Linguagem SQL
Página 19
5. EXERCÍCIOS
Exercício 1
É dada a tabela PRODUTOS com a seguinte estrutura:
CODPROD
DECIMAL (2)
NOME
CHAR (30)
TIPO
DECIMAL (1)
EMBALAGEM
CHAR (10)
ALIQUOTA
DECIMAL (2)
VALIDADE
DATE
PRECO
DECIMAL (7,2)
a) Inserir um registro com os dados que quiser
b) Alterar o tipo de todos os produtos de 5 para 9
c) Aumentar em duas unidades o valor da alíquota
d) Excluir todos os registros com produto vencido. Suponha a data atual igual a
1998-06-16
e) Atualize o preço em 23.71% em todos os registros
f) Calcule o preço utilizando a alíquota como base. Fórmula: preço = preço +
alíquota %
g) Exclua todos os produtos que custem menos de R$ 10 e sejam embalados em
caixa
h) Suponha uma tabela de nome PROD-AUX de estrutura identica a tabela
PRODUTOS.
h.1) copie todos os registros de produtos para ela
h.2) copie os registros de produtos vencidos para ela
h.3) todos os produtos com preço entre 200 e 950
Exercício 2
Utilizando a tabela PRODUTOS do exercício anterior, codificar um programa
COBOL/SQL que faça a inclusão de um registro nesta tabela.
OBS:
1 – Acessar os valores via console
2 – Codificar as variáveis HOST na WORKING
3 – Carregar a SQLCA
DB2 e Linguagem SQL
Página 20
4 – Testar SQLCODE.
Exercício 3
Ainda utilizando a tabela PRODUTOS, codifique um programa para acessar via
console um código de produto, consistindo conforme seu tamanho. Procurar por esse código
na tabela exibindo os demais dados do produto.
Exercício 4
São dadas as tabelas PEDIDOS e COMPOSIÇÃO conforme segue:
PEDIDOS:
NUMPED
DECIMAL (7)
DATAPED
DATE
QTDEPED
DECIMAL (3)
VLTOTPED
DECIMAL (8,2)
COMPOSICAO:
NUMPED
DECIMAL (7)
SEQ
DECIMAL (1)
CODPROD
DECIMAL (4)
PRECOPROD
DECIMAL (8,2)
Codificar em linguagem SQL as seguintes querys (consultas):
a) da tabela PEDIDOS, o pedido de número 100
b) os pedidos com mais de 3 produtos
c) selecionar os registros onde a quantidade de produtos seja superior a 10 e o valor
total esteja entre 200 e 600, inclusive.
d) Todos os pedidos, cada qual com sua respectiva composição
e) Todos os registros da composição onde o preço do produto seja superior a 50 e
com a respectiva data e valor total do pedido
f) Todos os pedidos que possuam 4, 6 ou 10 produtos com preço de cada produto
g) Todos os pedidos do mês de maio
h) O segundo produto do pedido número 2048
i) Os pedidos com problemas (não possuem composição correspondente)
DB2 e Linguagem SQL
Página 21
Exercício 5
CODIGO
DECIMAL (4)
NOME
CHAR (30)
ENDERECO
CHAR (50)
STATUS
CHAR (1)
LIMITE
DECIMAL (2)
a) Codifique um programa para adicionar 10% ao limite dos clientes cujo status seja
igual a “E” (Especial).
b) Codifique um programa para excluir da tabela todos os clientes que tenham limite
inferior a 500 e status igual a “I” (Inadimplente)
Obs: - Usar cursor para os dois programas
-
imprimir o relatório dos registros processados a medida que o
processamento (deleção ou atualização) é efetuado
-
exibir estatística de processamento ao final.
Exercício 6
É dada a tabela VENDAS com a estrutura abaixo relacionada:
NUM_PEDIDO
DECIMAL(5)
DATA_VENDA
DATE
NUM_NF
DECIMAL(7)
VALOR_PEDIDO
DECIMAL(8,2)
SITUACAO
CHAR(1) (A
=
ATIVO
ou
C
=
CANCELADO
ou
R=REAJUSTADO)
1 – São dadas as tabelas ATIVOS e CANCELADOS de estrutura idêntica (inclusive
nos nomes dos campos) à tabela VENDAS. Codifique um programa batch seguindo os
procedimentos abaixo discriminados:
 Ler toda a tabela VENDAS, armazenando-a em um cursor.
 Processar este cursor da primeira a última linha, gravando as tabelas ATIVOS e
CANCELADOS, utilizando para tanto o campo SITUACAO.
 Ao final, imprimir estatística de processamento:
TOTAL DE REGISTROS LIDOS:
Z.ZZZ.ZZ9
TOTAL DE REGISTROS ATIVOS:
Z.ZZZ.ZZ9
TOTAL DE REGISTROS CANCELADOS:
ZZ.ZZZ.ZZ9
2 – Na tabela VENDAS, onde o campo STATUS determine que um registro precisa
ser reajustado, atualize em 2,37% o valor total do pedido.
DB2 e Linguagem SQL
Página 22
3 – É dada a tabela RESUMO, com estrutura descrita abaixo:
DATA_VENDA
DATE
SITUACAO
CHAR(1)
VALOR_TOTAL
DECIMAL(16, 2)
Codificar um programa, seguindo as instruções:
 Classificar a tabela VENDAS por DATA_VENDA e SITUACAO.
 Gerar a tabela RESUMO, onde cada data de venda será representada em dois
registros. O primeiro com o valor total de vendas canceladas no dia e o segundo
com o total de vendas ativas no dia..
 Ao final, exibir estatísticas de processamento:
NÚMERO DE REGISTROS LIDOS:
ZZ.ZZZ.ZZ9
NÚMERO DE REGISTROS GRAVADOS:
ZZ.ZZZ.ZZ9
NÚMERO DE REGISTROS CANCELADOS:
ZZ.ZZZ.ZZ9
NÚMERO DE REGISTROS ATIVOS:
ZZ.ZZZ.ZZ9
VALOR TOTAL CANCELADO:
ZZ.ZZZ.ZZ9
VALOR TOTAL ATIVO:
R$ ZZ.ZZZ.ZZ9,99
DIFERENÇA CANCELADO/ATIVO:
R$ ZZ.ZZZ.ZZ9,99
DB2 e Linguagem SQL
Página 23
Download