Você está na página 1de 175

DB2

1. INTRODUÇÃO..........................................................................................6
 Quando um DBMS pode ser considerado RELACIONAL?.....................................6
1.2 Notas................................................................................................7
1.3 Tabela relacional.................................................................................8
1.4 Notas................................................................................................9
2. OBJETOS DO DB2....................................................................................11
2.1 Notas..............................................................................................12
3. PROJETOS COM DB2................................................................................14
3.1 Integridade de referência.....................................................................14
3.2 Notas..............................................................................................15
4.ACESSO AO DB2......................................................................................16
4.1 Notas..............................................................................................16
5. DB2 INTERACTIVE...................................................................................17
5.1 SPUFI..............................................................................................17
5.2 QMF................................................................................................19
5.3 Editando Relatório..............................................................................22
5.4 Salvando a memória............................................................................24
6. LINGUAGEM SQL...................................................................................25
6.1 Notas..............................................................................................25
7. SELECT..............................................................................................26
7.1 Instrução SELECT...............................................................................26
7.2 Tabelas usadas nos exemplos................................................................28
7.3 QUERY............................................................................................30
7.4 Notas..............................................................................................31
7.5 Query em formato livre.......................................................................32
7.6 SELECT .... FROM..............................................................................33
7.7 SELECT de todas as colunas..................................................................34
7.8 Controle de Linhas.............................................................................35
7.9 Exemplos de WHERE...........................................................................36
7.10 Operadores de comparação................................................................36
7.11 Nulidade.......................................................................................37
7.12 Not null with default........................................................................37
7.13 Seleção de nulos.............................................................................37
7.14 Múltiplas Condições.........................................................................38
7.15 In................................................................................................39
7.16 Between.........................................................................................39
7.17 Pesquisas parciais............................................................................40
7.18 Negação........................................................................................41
7.19 User.............................................................................................41
7.20 Manipulando tabela resultante............................................................41
7.21 Order by.......................................................................................42

571774784.doc 1 de 175
DB2

7.22 Select Distinct................................................................................44


7.23 SELECT de valores calculados.............................................................45
7.24 Condições com valor calculado...........................................................46
7.25 ORDER BY por valor calculado............................................................46
7.26 Operador de concatenação................................................................47
8. SELECT AVANÇADO...............................................................................48
8.1 Funções de coluna..............................................................................48
8.3 SUM - AVG - MAX - MIN.......................................................................48
8.4 Count..............................................................................................49
8.5 Literais............................................................................................50
8.6 Group by.........................................................................................50
8.7 Group by ... order by..........................................................................51
8.8 Group by ... having.............................................................................52
8.9 Sumário funções de coluna...................................................................54
8.10 Funções escalares...........................................................................54
8.11 Substr(string, início, comprimento).....................................................55
8.12 Length (argumento).........................................................................56
8.13 Value (arg1, arg2,..., argn)................................................................56
8.15 Funções de conversão......................................................................57
8.16 Dados Date / Time...........................................................................58
8.17 Aritmética Date/Time.......................................................................58
8.18 Duração Date / Time........................................................................59
8.19 Exemplos......................................................................................60
8.20 Funções escalares Date/Time.............................................................60
8.21 Valores concorrentes.......................................................................61
8.22 Join de tabelas...............................................................................62
8.23 Join com mais de duas tabelas............................................................64
8.24 Qualificadores................................................................................64
8.25 Join de uma tabela com ela mesma......................................................65
8.26 Union...........................................................................................66
8.27 Union all vs. Union..........................................................................68
9. SUBQUERY..........................................................................................68
9.1 Considerações subquery......................................................................69
9.2 Subquery de uma linha........................................................................70
9.3 Subquery com uma linha......................................................................70
9.4 Subquery com várias linhas : ALL...........................................................70
9.5 Subquery com várias linhas : ANY ou SOME...............................................72
9.6 In...................................................................................................72
9.7 Having com subquery..........................................................................73
9.8 Subquery correlacionado.....................................................................73
9.9 Subquery testando V ou F....................................................................74
10. DIAGRAMA DE SINTAXE DE SQL.................................................................75
10.1 Funções escalares...........................................................................75
11. MANUTENÇÃO DE DADOS........................................................................75

571774784.doc 2 de 175
DB2

11.1 Insert de uma linha..........................................................................75


11.2 Insert de múltiplas linhas..................................................................76
11.3 Update de colunas...........................................................................76
11.4 Delete de linhas..............................................................................77
12. DDL..................................................................................................78
12.1 Notas...........................................................................................78
12.2 Storage group.................................................................................79
13. DATABASE..........................................................................................79
13.1 Notas...........................................................................................79
13.2 Tablespace....................................................................................80
13.3 Tabela..........................................................................................83
13.4 Índice...........................................................................................88
13.5 Sinônimo e Alias..............................................................................89
13.6 View............................................................................................89
13.7 Comentários e Rótulos......................................................................90
13.8 Drop............................................................................................91
13.9 DB2 Dependência entre objetos..........................................................92
14. APLICAÇÕES DB2..................................................................................93
14.1 SQL Estático vs. SQL Dinâmico............................................................93
15. PROGRAMAÇÃO EM LINGUAGENS TRADICIONAIS............................................94
15.1 Programação em SQL.........................................................................94
15.2 SQL Embutido.................................................................................95
15.3 Variáveis Host................................................................................96
15.4 Estrutura......................................................................................98
15.5 Definição de variáveis HOST...............................................................99
15.6 Processamento de múltiplas linhas.....................................................101
15.7 SELECT com FETCH........................................................................102
15.8 Delete via cursor...........................................................................103
15.9 Update via Cursor..........................................................................104
15.10 Manipulação de cursor....................................................................106
15.11 Cursor Hold..................................................................................107
15.12 Commit / RollBack..........................................................................108
15.13 Unidade de trabalho.......................................................................108
15.14 Commit / Rollback..........................................................................110
15.15 Exemplo de reposicionamento (pré V2.3).............................................111
15.16 SQL Communication Area (SQLCA)......................................................113
15.17 Formato SQLCA.............................................................................114
15.18 Códigos SQLCA..............................................................................114
15.19 SQLSTATE....................................................................................116
15.20 SQL Warning.................................................................................116
15.21 Variáveis indicadoras......................................................................117
15.22 Vetor de variáveis indicadoras..........................................................118
15.23 Uso de variáveis indicadoras.............................................................120

571774784.doc 3 de 175
DB2

15.24 Auxílio na codificação.....................................................................121


15.25 Instrução ‘WHENEVER’....................................................................121
15.26 Exemplo de WHENEVER...................................................................123
15.27 DCLGEN.......................................................................................124
15.28 DCLGEN para COBOL.......................................................................125
15.29 Saída DCLGEN – Cobol.....................................................................127
15.30 Descrição de tabela em SQL..............................................................129
15.31 Instrução SQL include.....................................................................130
15.32 Formatação de mensagens de erro......................................................131
16.PREPARAÇÃO E EXECUÇÃO DE PROGRAMA..................................................133
16.1 Notas..........................................................................................134
16.2 Precompilador..............................................................................135
16.3 Bind...........................................................................................137
16.4 Estratégia de acesso.........................................................................138
16.5 Painel de BIND................................................................................139
16.6 Execução de programa......................................................................142
17. LOCKING...........................................................................................143
17.1 Propósito.....................................................................................143
17.2 Modo..........................................................................................145
17.3 Granularidade...............................................................................147
17.3.1...................................................................................Granularidade
147
17.4 Duração.......................................................................................148
18 SEGURANÇA.......................................................................................151
18.1 Segurança externa do DB2...............................................................151
18.2 Segurança interna do DB2................................................................152
18.3 Recursos e privilégios.....................................................................153
18.4 Atribuição de autoridade.................................................................156
18.5 Atribuição de autoridade.................................................................157
18.6 Secondary auth-id..........................................................................158
18.7 Auditoria.....................................................................................159
19 BANCO DE DADOS DE CONTROLE.............................................................160
19.1 Tabelas do DB2.............................................................................160
20 UTILITÁRIOS DB2................................................................................161
20.2 Utilitário Load................................................................................163
20.3 Exemplo de Load.............................................................................164
20.4 Preparando JCL para utilitário............................................................165
21. CONSIDERAÇÕES SOBRE A PROGRAMAÇÃO..................................................166
21.2 Explain.........................................................................................168
21.3 Tabela PLAN_TABLE.........................................................................170
21.4 Considerações para Batch..................................................................174
22. MONITORAÇÃO E CONTROLE...................................................................175

571774784.doc 4 de 175
DB2

22.1 Ferramentas para monitoração...........................................................175


22.2 DB2 trace......................................................................................175

571774784.doc 5 de 175
DB2

1. INTRODUÇÃO
 Quando um DBMS pode ser considerado RELACIONAL?

INDEPENDÊNCIA

DOS

DADOS

ESTRUTURA OPERADORES

TABULAR DE DE

DADOS TABELAS

UNIFORMIDADE

E INTEGRIDADE

DOS DADOS

571774784.doc 6 de 175
DB2

1.2 Notas

DBMS significa Data Base Management System. Traduzindo : citam SGBD ou


Sistema Gerenciador de Banco de Dados.
Um DBMS Relacional exige:
 Estrutura tabular de dados
Os dados devem ser colocados em tabelas
 Operadores de tabelas
Deve ter operadores que conseguem manipular dados em tabelas.
 Uniformidade e integridade dos dados
Possui mecanismos que mantém a integridade dos dados que são adicionados ou
modificados. O DBMS deve também ter mecanismos capazes de forçar uma
uniformização dos dados que são nela armazenados. Por exemplo podemos forçar o
armazenamento dos dados sempre no formato numérico.
 Independência dos dados
A lógica das aplicações não devem se preocupar com a estrutura de
armazenamento e a teoria de acesso aos dados.

571774784.doc 7 de 175
DB2

1.3 Tabela relacional

Tabelas EMPREGADOS

MATR NOME SOBRENOME DEPARTAMENTO SALÁRIO


00010 CHRISTINE HAAS A00 52750
00020 MICHAEL THOMPSON S01 41250
linhas 00030 SALLY KWAN C01 38250
00050 JOHN GEYER E01 40175
00330 WING LEE E21 25370
00340 JASON GOUNOT E21 23840

Colunas

571774784.doc 8 de 175
DB2

1.4 Notas
Todos os dados e relacionamentos entre dados são representados por valores de campo.
Pointers físicos não são utilizados.
Cada ocorrência de tabela é chamada de linha. Os atributos são chamados de colunas. As
tabelas DB2 são definidas e manipuladas usando-se a linguagem SQL. Todas as tabelas são
referenciados pelo seu NOME.

SISTEMA DE GERÊNCIA DE BANCO DE DADOS


 Integridade e segurança de dados
 Recuperação e reinicio integrados
 Definição dinâmica
 Operação contínua

MODELO DE DADOS RELACIONAL LINGUAGEM SQL


 Os dados vistos como tabelas  Definição, Manipulação
 Projeto mais fácil e controle de dados

571774784.doc 9 de 175
DB2

1.5 Ambiente DB2

IMS TM CICS TSO BATCH

DPROP
IMS DM DB2
DXT

Notas

O DB2 pode ser acessado através do IMS, CICS, TSO e jobs BATCH
simultaneamente. Dados que estiverem em IMS/DM (antigo IMS/DB) podem ser
transferidos para o DB2 através do DPROP (Data Propagator) ou do DXT (Data
Extract).

571774784.doc 10 de 175
DB2

2. OBJETOS DO DB2

Data Base

Tablespace 1
Índice 1 Tabela 1

Tablespace 2
Índice 2 Tabela 2 View X

Storage Group A Storage Group B

571774784.doc 11 de 175
DB2

2.1 Notas

 Database
Conjunto de tabelas, índices e tablespaces agrupados sob um critério administrativo.
 Table (tabelas)
Conjunto de linhas com as mesmas colunas. Representam uma entidade de um modelo
entidade-relacionamento.
 Tablespace
Conjunto de datasets VSAM LDS (linear data sets) que contém dados de uma ou mais
tabelas. Suas páginas podem ser de 4k ou 32k. Existem três tipos de tablespaces:
 Simples
As páginas de seus data sets podem conter dados de uma ou mais tabelas;
 Segmentado
É dividido em segmentos que são constituídos de 4 a 64 páginas e
sempre múltiplos de 4. Cada segmento só pode conter dados de uma
tabela.
Utilização recomendada pois administra melhor o espaço.
 Particionado
Recomendado para tabelas gigantes. Pode ser dividido em até 254 partições.
Requer um índice cluster que serve de filtro para determinar a distribuição das
linhas entre as partições.
 Índice
Utilizado para agilizar a leitura de dados ou para garantir a unicidade dos dados.
Existem três tipos de índices:
 Unique
Força a unicidade dos dados através dos valores de uma coluna escolhida como
chave única.

571774784.doc 12 de 175
DB2

 Cluster
A seqüência física das linhas procura obedecer a seqüência das entradas do
índice. Existem utilitários que reorganizam um tablespace através do índice
cluster de suas tabelas.
 Normal
 View
É uma tabela lógica que é um subconjunto de uma ou mais tabelas. Sua utilização em
nada difere com a de uma tabela. Conforme o caso uma View pode ser somente para
leitura. Mais detalhes no item de definição de uma View no capítulo de DDL.
 Storage Group
É um conjunto de volumes (discos) onde estarão os tablespaces e índices. Os discos
devem ser do mesmo device type (3375, 3380, etc..)
A utilização do storage group nos poupa da codificação do AMS de VSAM para definir os
data sets de um tablespace.
Os discos de um storage group não precisam ser dedicados ao DB2.
 Sinônimo (SYNONYM)
É um NOME alternativo (apelido) para uma tabela ou uma View. Uma vez criado, a sua
utilização é restrita a um auth-id e válido em nível de subsistema DB2.
 Alias
É um NOME alternativo (apelido) para uma tabela ou View. Um alias é de uso
compartilhado ao contrário do sinônimo. É utilizado mais como apelido para uma tabela
remota e é válido em nível de subsistema DB2.

571774784.doc 13 de 175
DB2

3. PROJETOS COM DB2

3.1 Integridade de referência

Chave Chave
Estrangeira primária

EMPR DEPT
(dependent) (parent)
MATR NOME DEPT DCODIGO DNOME
491 MARIA A00 A00 VENDAS
003 CARLOS Z13 V75 CONTABILIDADE
: : : Z13 RESERVA
: :

INTEGRIDADE
REFERENCIAL

571774784.doc 14 de 175
DB2

3.2 Notas
A integridade de referência garante que qualquer valor apontado pela chave
estrangeira tenha uma valor correspondente na chave primária à qual está
associada.
A integridade de referência é implementado no DB2 via DDL (instruções de definição de
objetos da linguagem SQL).
No DB2 a integridade de referência obedece às seguintes regras.
 Uma chave primária tem valor único e não nulo.
 Uma chave estrangeira é nula ou tem valor correspondente na chave primária
Tanto na inserção como na atualização de linhas, o DB2 força a observação destas regras.
Todas as tabelas associadas entre si via regra de integridade de referência formam um conjunto
chamado de estrutura referencial ou referencial 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 de uma 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ãe com valor de chave primária correspondente a da sua chave
estrangeira. Em outras palavras a chave estrangeira não deve ter valor nulo para ser
uma linha dependente.
Na eliminação de uma linha da tabela mãe, podem ocorrer situações conforme a regra
de deleção estabelecida pela chave estrangeira.
 CASCADE : regra onde 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 eliminação da mãe.
 RESTRICT : regra onde a eliminação da linha mãe é impedida. Neste caso somente as
linhas que não são mães podem ser eliminadas.

571774784.doc 15 de 175
DB2

4.ACESSO AO DB2

BATCH TSO TSO CICS CICS IMS

PROGRAMA DB2I QMF PROGRAMA QMF PROGRAMA

TSO ATT. TSO ATT CAF CICS ATT. CICS ATT. IMS ATT.

DB2

BANCO
DE DADOS

4.1 Notas

Os Attachment Facilities são interfaces que permitem aos programas a emissão de CALL’s
para o DB2.
Para cada monitor de transação (CICS, IMS, TSO) temos um attachment
específico. Para aqueles que não vão trabalhar com estes monitores existe a
alternativa de ser utilizar o CAF (Call Attachment Facility).
O DB2 é um programa que é instalado com o DB2 e utiliza o TSO Attachment. O DB2
oferece uma série de recursos e é basicamente uma ferramenta para os que atuam na área
de suporte.
O QMF é um programa produto que pode ser executado sob TSO ou sob CICS, lançando mão
do TSO Attachment ou do CICS Attachment.
O QMF é um gerador de relatórios que acessa tabelas relacionais. É voltado
para o usuário final, mas é comum a sua utilização pelo pessoal de suporte.

571774784.doc 16 de 175
DB2

5. DB2 INTERACTIVE

 Ferramenta interativa
 Recursos
 Execução de instruções SQL (SPUFI)
 Execução de comandos DB2
 Preparação de programas de aplicação
 Execução de utilitários

5.1 SPUFI

DB2

SPUFI
Edit Execute Browse

INPUT DS OUTPUT DS

(SELECT..) (Relatório)

5.1.1. Notas

O SPUFI é uma ferramenta para executar instruções SQL.


Trabalha com um arquivo de entrada e um arquivo de saída, como sugere o NOME: SQL
Processing Using File Input.

571774784.doc 17 de 175
DB2

O SPUFI dirige o seu 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
O DB2 interpreta a instrução SQL do arquivo de entrada e a executa.
 Browse
Mostra o arquivo de saída com um relatório do resultado da execução.

571774784.doc 18 de 175
DB2

5.2 QMF

DB 2

QUERY DATA FORM REPORT

SELECT 00034 CARLOS COLUMN WIDTH MATR NOME


MATR.NOME 35880 MARIA EDIT 00034 CARLOS
FORM EMPR 08888 ALDO MATR 6 C
NOME 12 C

PF6 PF9 PF12

5.2.1 Notas

O Query Management Facility (QMF) é um gerador de relatórios que pesquisa tabelas


relacionais.
A memória do QMF é dividida em várias áreas, sendo as mais utilizadas :
 QUERY
Entrada da instrução SQL
 DATA
Resultado devolvido pelo DB2
 FORM
Formato do relatório de saída
 REPORT

571774784.doc 19 de 175
DB2

Relatório montado com base nos dados da área DATA e no formato


especificado em FORM.

O QMF trabalha também com relatórios gráficos usando para isto a


interface com GDDM.

5.2.2 Fluxo de trabalho do QMF

PF6 PF9

Edita Altera
QUERY FORMATO

PF2 PF12

Examina Relatório

571774784.doc 20 de 175
DB2

5.2.3 Notas

O QMF dirige o usuário a um ciclo de trabalho tal como no SPUFI.


A diferença é que no QMF temos a possibilidade de trabalhar o relatório final, enquanto
que no SPUFI o relatório é padronizado e com poucas alternativas de alteração.
O fluxo de trabalho do QMF tem dois ciclos:

1. Obtenção dos dados


No ciclo de obtenção dos dados, trabalhamos interessados somente no
conteúdo do resultado de uma instrução SQL.
O ciclo é percorrido através de algumas teclas PF:
 PF6
Mostra a área da QUERY para editarmos um instrução SQL
 PF2
Executa a instrução e mostra o relatório resultante.
2. Refinamento do relatório
Neste ciclo trabalhamos interessados no apresentação final do relatório
que resultou do ciclo anterior.
O ciclo percorrido através de algumas teclas PF:
 PF6
Mostra a área de FORM para alterarmos a especificação do formato do relatório.
É nesta etapa que fornecemos o cabeçalho, quebra de páginas, rodapés, etc..
 PF12
Mostra o relatório editado à partir de informações contidas na área de DATA e na
área de FORM.

571774784.doc 21 de 175
DB2

5.3 Editando Relatório

FORM MAIN FORM MAIN


Columns : Columns :

NUM COLUMN HEADING EDIT NUM COLUMN HEADING EDIT


1 NOME C 1 FUNCIONÁRIO C
2 SAL L2 2 SALÁRIO D2

PAGE HEADING: PAGE HEADING : RELATORIO RH

REPORT REPORT
RELATÓRIO RH
NOME SAL FUNCIONÁRIO SALÁRIO
SILVA 45000,00 SILVA $45.000,00
JOHNSON 20000,00 JOHNSON $20.000,00
SERRA 30000,00 SERRA $30.000,00
OLIVEIRA 190000,00 OLIVEIRA $190.000,00

5.3.1 Notas
Uma das características principais do QMF está na sua capacidade de permitir
a elaboração de relatórios complexos.
Para se editar um relatório, a área de dados deve estar carregada via execução de uma
query, por exemplo.
Digitada a tecla PF9, o QMF exibe a área de FORM, que vem inicialmente
carregado com um formato default.
No exemplo são mostrados quatro alterações no formato default.
1. Acréscimo do cabeçalho “RELATÓRIO RH”.
2. Alteração do NOME do cabeçalho da coluna NOME para FUNCIONÁRIO.
3. Alteração do NOME do cabeçalho da coluna SAL para SALÁRIO.

571774784.doc 22 de 175
DB2

4. Alteração do código de edição da coluna SALÁRIO para que seja exibida o caracter “$”.
Outras alterações possíveis no formato default:
 Acréscimo de rodapé
 Quebra de página por valor de coluna
 Cabeçalho e rodapé para cada quebra de página
 Quebras encadeadas em múltiplos níveis
 Cabeçalhos e rodapés com texto dependente dos dados
 Expansão dos dados de uma linha em múltiplas linhas
 Quebra e relatórios grandes (> 132 caracteres por exemplo) em páginas físicas menores
 Etc.

571774784.doc 23 de 175
DB2

5.4 Salvando a memória

QMF DB2
FORM
QUERY

REPORT DATA

QUERIES DATA

FORMS

TABELAS DE QMF

5.4.1 Notas

As áreas de memória do QMF podem ser salvas para posterior utilização.


As informações são salvas em tabelas de controle do QMF, que ficam sob controle do
DB2.
As informações podem ser salvas para uso compartilhado. Esta capacidade
pode ser utilizada para criar aplicações de uso geral.

571774784.doc 24 de 175
DB2

6. LINGUAGEM SQL
SQL

STRUCTURED

QUERY

LANGUAGE

SELECT
UPDATE CREATE GRANT
DELETE ALTER REVOKE
INSERT DROP COMMIT

DML DDL CONTROL

6.1 Notas
A linguagem SQL pode ser separado em três grupos :
 DML
Data Manipulation Language, utilizado para fazer pesquisas e atualizações
nas tabelas DB2;
 DDL
Data Definition Language, utilizado para definir, alterar e eliminar objetos DB2.
 CONTROL
Utilizado para administrar a segurança dos recursos DB2;

571774784.doc 25 de 175
DB2

7. SELECT

7.1 Instrução SELECT

 Não é procedural
 Conceito da teoria dos conjuntos
 Fácil

7.1.1 Notas

A instrução SELECT não é procedural. Em outras palavras não precisam fornecer todos os
procedimentos necessários para fazer uma pesquisa tais como:
1. Zere o contador
2. Abra o arquivo
3. Leia um registro
4. Verifique se satisfaz o critério de pesquisa
5. Incremente o contador
6. Etc.

Com a instrução SELECT basta dizer :

Quero os dados que satisfazem a condição X.

571774784.doc 26 de 175
DB2

O SELECT trabalha com conjuntos e permite a execução de operadores elementares que


nos são familiares.
Quem já não ouviu falar dos operadores união e intersecção?
Com uma instrução SQL podemos implementar os seguintes operadores :

 União A  B
A B

 Intersecção A  B

A B
 Diferença A – B

A B

 Produto cartesiano
A X B = { (x,y) : x  A e y  B }

571774784.doc 27 de 175
DB2

7.2 Tabelas usadas nos exemplos

X.STAFF
ID NOME DEPT CARGO ANOS SALÁRIO COMIS
10 SANTANA 20 GER 7 18357,50 -
20 ORSINI 20 VENDAS 8 18171,50 612,45
30 DANTAS 38 GER 5 17506,75 -
40 D’BRIEN 38 VENDAS 6 18006,00 846,55
50 SOUZA 15 GER 10 20659,80 -
60 SUZUKI 38 VENDAS - 16808,30 650,25
70 ALMEIDA 15 VENDAS 7 16502,83 1152,00
80 JAMES 20 ATEND - 13504,60 128,20
90 KOONITZ 42 VENDAS 6 18001,75 1386,70
100 PLOTZ 42 GER 7 18352,80 -
110 NGAN 15 ATEND 5 12508,20 206,60
120 NAUGHTON 38 ATEND - 12954,75 180,00
130 YAMAGUCHI 42 ATEND 6 10505,90 75,60
140 FRAYE 51 GER 6 21150,00 -
150 OLIVEIRA 51 VENDAS 6 19456,50 637,65
160 MOLINARI 10 GER 7 22959,20 -
170 KERMISCH 15 ATEND 4 12258,50 110,10
180 ABRAHAMS 38 ATEND 3 12009,75 236,50
190 SNEIDER 20 ATEND 8 14252,75 126,50
200 SCOUTTEN 42 ATEND - 11508,60 84,20
210 LU 10 GER 10 20010,00 -
220 SMITH 51 VENDAS 7 17656,50 992,80
230 LUNDQUIST 51 ATEND 3 13369,80 189,65
240 DANIELS 10 GER 5 19260,25 -
250 WHEELER 51 ATEND 6 14460,00 513,30
260 JONES 10 GER 12 21234,00 -
270 LEA 66 GER 9 18555,50 -
280 WILSON 66 VENDAS 9 18674,50 811,50
290 PINHO 84 GER 10 19818,00 -
300 DAVIS 84 VENDAS 5 15454,50 806,10
310 GRAHAM 66 VENDAS 13 21000,00 200,30
320 GONZALES 66 VENDAS 4 16858,20 844,00
330 BURKE 66 ATEND 1 10988,00 55,50
340 VIEIRA 84 VENDAS 7 17844,00 1285,00

571774784.doc 28 de 175
DB2

350 GAFNEY 84 ATEND 5 13030,50 188,00

X.ORG
DEPTCOD DEPTNOME GERENTE DIVISAO LOCAL
10 MATRIZ 160 CENTRO SÃO PAULO
15 CAMPINAS 50 SUDESTE CAMPINAS
20 RIO 10 SUDESTE RIO JANEIRO
38 MINAS 30 SUDESTE B. HORIZONTE
42 BAHIA 100 NORDESTE SALVADOR
51 RECIFE 140 NORDESTE RECIFE
66 RIO GRANDE 270 SUL PORTO ALEGRE
84 PARANÁ 290 SUL CURITIBA

571774784.doc 29 de 175
DB2

7.3 QUERY

Seqüência obrigatória :

SELECT NOME, ANOS, SALÁRIOS Diz quais colunas mostrar


FROM X.STAFF Diz quais tabelas
WHERE DEPTO = 38 Diz quais linhas selecionar
ORDER BY NOME Diz como ordenar o resultado

571774784.doc 30 de 175
DB2

7.4 Notas

As cláusulas de uma instrução SELECT devem ser especificadas obedecendo a


uma seqüência.
As cláusulas estão sendo grifadas na figura e não podem ser abreviadas.
No nosso exemplo estamos fazendo uma pesquisa na tabela chama X.STAFF para gerar um
relatório com o NOME, tempo de casa e o salário de todos que trabalham no departamento
de código “38”. O resultado deve ser classificado pelo NOME dos funcionários.

571774784.doc 31 de 175
DB2

7.5 Query em formato livre

SELECT NOME, ANOS, SALÁRIO FROM X.STAFF WHERE


DEPT=38 ORDER BY NOME

7.5.1 Notas

Uma instrução SELECT pode ser escrita em formato livre desde que as cláusulas estejam
obedecendo à seqüência obrigatória.

571774784.doc 32 de 175
DB2

7.6 SELECT .... FROM

 SELECT algumas das colunas da tabela resultado


 Lista as colunas desejadas na seqüência de esquerda para a direita
 Vírgulas separam as colunas
 FROM lista de tabelas
 Simples : EMP
 Qualificado : AUTHID.EMP
 EXEMPLO
SELECT DEPTONOME, DEPTOCOD
FROM X.ORG

Resultado :
DEPTONOME DEPTOCOD
MATRIZ 10
CAMPINAS 15
RIO 20
MINAS 38

571774784.doc 33 de 175
DB2

7.7 SELECT de todas as colunas

Para selecionar todas as colunas de uma tabela na mesma seqüência em que foram
definidas :

SELECT * FROM X.ORG

Resultado:

DEPTOCOD DEPTNOME GERENTE DIVISAO LOCAL


10 MATRIZ 160 CENTRO SÃO PAULO
15 CAMPINAS 50 SUDESTE CAMPINAS
20 RIO 10 SUDESTE RIO JANEIRO
38 MINAS 30 SUDESTE B. HORIZONTE
: : : : :
Obs.: Evitar o uso do *

571774784.doc 34 de 175
DB2

7.8 Controle de Linhas

 WHERE
 Traz certas linhas
 Estabelece condições

Exemplo :
Listar empregados do departamento 20

SELECT DEPT, NOME, COMIS FROM X.STAF WHERE DEPT = 20


Resultado:
DEPTO. NOME CARGO COMIS
20 SANTANA GER -
20 ORSINI VENDAS 612,45
20 JAMES ATEND 128,20
20 SNEIDER ATEND 126,50

571774784.doc 35 de 175
DB2

7.9 Exemplos de WHERE

 Selecionar linhas através de dado numérico


SELECT DEPT, NOME, CARGO FROM X.STAFF WHERE DEPT = 20
 Selecionar linhas através de dado alfanumérico
SELECT NOME, CARGO, COMIS FROM X.STAFF
WHERE NOME = ‘SANTANA’

7.10 Operadores de comparação

= Igual
<> or  = Diferente
> Maior
>= Maior ou igual
< Menor
<= Menor igual
> Não maior
< Não menor

Exemplos :

SELECT MATR, COMIS FROM X.STAFF WHERE COMIS >= 1000

SELECT NOME, DEPT, ANOS FROM X.STAFF WHERE CARGO <> ‘GER’

571774784.doc 36 de 175
DB2

7.11 Nulidade

Na inserção de linha, uma coluna que é :


 NOT NULL - o valor deve ser fornecido
 (ALLOW) NULL - o valor pode ser omitido

um valor NULO : não é zero, não é branco, é desconhecido


7.12 Not null with default

Uma coluna pode ser ‘not null with default’.


O sistema fornece um valor se omitido durante a inserção
 Zero se coluna numérica
 Branco se coluna definida como caracter
 Comprimento zero se coluna definida como caracter de tamanho variável

7.13 Seleção de nulos

 Valor nulo como critério de SELECT


SELECT NOME, CARGO, COMIS FROM X.STAFF
WHERE COMIS IS NULL
Resultado:
NOME CARGO COMIS
Santana Ger. -
Dantas Ger. -
Souza Ger. -
Plotz Ger. -

 Valor não nulo como critério de SELECT


SELECT NOME, CARGO, COMIS FROM X.STAFF
WHERE COMIS IS NOT NULL

571774784.doc 37 de 175
DB2

Resultado:
NOME CARGO COMIS
Orsini Vendas 612.45
O’brien Vendas 846.55
Suzuki Vendas 650.25
Almeida Vendas 1152.00
James Atend 128.20

7.14 Múltiplas Condições

 Operadores para múltiplas condições : AND - OR


 Dadas duas condições :
CARGO = ‘VENDAS’ SALÁRIO < 1700
Para ter ambas satisfeitas : AND
WHERE CARGO = ‘VENDAS’ AND SALÁRIO <1700

Resultado :
NOME CARGO SALÁRIO
Suzuki Vendas 16808.30
Almeida Vendas 16502.83

Para ter qualquer uma satisfeita : OR


WHERE CARGO = ‘VENDAS’ OR SALÁRIO < 17000

Re su lt ad o :
NOME CARGO SALÁRIO
Orsini Vendas 18171.25
O’brien Vendas 18006.00
Suzuki Vendas 16808.30
Almeida Vendas 16502.83
James Atend 13504.60

WHERE (CARGO = ‘VENDAS’ AND COMIS > 1200) OR ANOS > 10

571774784.doc 38 de 175
DB2

Re su lta do :
NOME CARGO ANOS SALÁRIO
Koonitz Vendas 6 1386.70
Jones Ger. 12 -
Graham Vendas 13 200.30
Vieira Vendas 7 1285.00

Não eqüivale a :

WHERE CARGO = ‘VENDAS’ AND (COMIS > 1200 OR ANOS > 10)
Resultado :

NOME CARGO ANOS SALÁRIO


Koonitz Vendas 6 1386.70
Graham Vendas 13 200.30
Vieira Vendas 7 1285.00

7.15 In

 Valor deve coincidir com algum elemento de uma lista


WHERE DEPT IN (38,20,42)
Eqüivale a:
Múltiplos OR’s para a mesma coluna
WHERE DEPT=38 OR DEPT=20 OR DEPT=42

7.16 Between

 Para selecionar um intervalo fechado de valores


SELECT NOME, CARGO, ANOS FROM X.STAFF
WHERE ANOS BETWEEN 9 AND 11

571774784.doc 39 de 175
DB2

Eqüivale a
SELECT NOME, CARGO, ANOS FROM X.STAFF
WHERE ANOS >= 9 AND ANOS <=1
Resultado :
NOME CARGO ANOS
Souza Ger. 10
Lu Ger. 10
Lea Ger. 9
Wilson Vendas 9
Pinho Ger. 10

7.17 Pesquisas parciais

 Para pesquisar um subconjunto de caracteres : LIKE


% Conjunto de caracteres quaisquer
- Um caracter qualquer
Exemplos :
WHERE NOME LIKE ‘G%’ inclui : Graham
Gonzales
Gafney
WHERE NOME LIKE ‘%SON’ inclui : Wilson
Jason
WHERE NOME LIKE ‘%M%N%’ inclui : Samanta
Molinari
WHERE NOME LIKE ‘_ _ ‘ inclui : Lu
WHERE NOME LIKE ‘_R%’ inclui : Fraye
Graham

 O operador ESCAPE permite que seja utilizado outro caracter no lugar do ‘%’
 Exemplo :
WHERE COLUNA LIKE ‘100+%%’ ESCAPE ‘+’

571774784.doc 40 de 175
DB2

7.17.1 Notas
No exemplo estamos procurando strings que começam por ‘100%’.
O primeiro ‘%’ é interpretado como um caracter comum pois é precedido pelo caracter ‘+’
que foi definido através do operador ESCAPE.
O segundo ‘%’ é interpretado como um conjunto de caracteres quaisquer pois não é
precedido por nenhum caracter escape.
Neste exemplo, quaisquer ocorrência do ‘+’ que não sejam ‘++’, ou ‘+%’ ou ‘+_’ provoca
erro.
7.18 Negação

 Para reverter o teste :


WHERE NOME NOT LIKE ‘G%’
Exclui : GRAHM
GONZALES
GAFNEY
WHERE ANOS NOT BETWEEN 9 AND 11
Exclui : ANOS de 9 a 11

7.19 User

Registro especial
 Authorization ID do tempo de execução
 Comprimento fixo de 8
 Útil para query dependente de executor

SELECT * FROM SYSIBM.SYSTABLES WHERE OWNER = USER

7.20 Manipulando tabela resultante


Para classificar as linhas : ORDER BY
Para eliminar linhas duplicatas : SELECT DISTINCT

571774784.doc 41 de 175
DB2

7.21 Order by

 Para classificar numa seqüência especificada :

Lista classificada do pessoal do DEPTO. 84

SELECT NOME, CARGO, ANOS FROM X.STAFF


WHERE DEPT = 84 ORDER BY NOME

Resultado :
NOME CARGO ANOS
Davis Vendas 5
Gafney Atend 5
Pinho Ger. 10
Vieira Vendas 7

 Para classificar pelas coluna(s) em ordem ascendente (default) ou descendente


SELECT NOME, CARGO, ANOS FROM X.STAFF WHERE DEPT = 84 ORDER BY CARGO, ANOS
DESC
Resultado :
NOME CARGO ANOS
Gafney Atend 5
Pinho Ger. 10
Vieira Vendas 7
Davis Vendas 5

Resultado :

NOME CARGO ANOS


Pinho Ger. 10
Vieira Vendas 7
Gafney Atend 5
Davis Vendas 5

571774784.doc 42 de 175
DB2

7.21.1 Notas

 Colunas classificadas devem ser referenciadas pelo SELECT


 Nulos são considerados como valor mais alto
 Podemos especificar colunas para o ORDER BY fornecendo um número que indica a
posição da mesma na cláusula SELECT. O ORDER BY é o único que permite isto.
 A cláusula ORDER BY classifica uma tabela resultante. Logo deve ser sempre a única e a
última a aparecer numa instrução SELECT.

571774784.doc 43 de 175
DB2

7.22 Select Distinct

SELECT DEPT FROM X.STAFF


DEPT
20
20
38
38
:

Para eliminar linhas duplicadas :


SELECT DISTINCT DEPT FROM X.STAFF
DEPT
10
15
20
38

 Múltiplas - colunas
SELECT DISTINCT DEPT, CARGO FROM X.STAFF
DEPT CARGO
10 Ger.
15 Atend
15 Ger.
15 Vendas
20 Atend
20 Ger.
20 Vendas
38 Atend

571774784.doc 44 de 175
DB2

7.22.1 notas

 A palavra chave DISTINCT deve aparecer logo depois de SELECT


 Classificação ocorre pelas colunas da esquerda para a direita
 ORDER BY pode ser usada para controlar a classificação

Exemplo :
SELECT DISTINCT DEPT, CARGO FROM X.STAFF ORDER BY CARGO

DEPT CARGO
15 Atend
20 Atend
38 Atend
: :
10 Ger.
15 Ger.
20 Ger.
: :
15 Vendas
20 Vendas

7.23 SELECT de valores calculados

+ SOMA * MULTIPLICAÇÃO
- SUBTRAÇÃO / DIVISÃO

Ganho total de cada pessoa do DEPTO 20

SELECT ID, SALÁRIO, COMIS, SALÁRIO + COMIS FROM X.STAFF


WHERE DEPT = 20

571774784.doc 45 de 175
DB2

Resultado :
ID SALÁRIO COMIS
10 18357.50 - -
20 18171.25 612.45 18783.70
80 13504.60 128.20 13632.80
190 14252.75 126.50 14379.25
Obs.: Quando qualquer operação envolver nulo o resultado é nulo

7.24 Condições com valor calculado

Pessoa cujo salário mais comissão excede R$ 20.000


SELECT NOME, SALÁRIO + COMIS FROM X.STAFF
WHERE SALÁRIO + COMIS > 20000

Resultado :
NOME
Oliveira 20094.15
Graham 21200.30

7.25 ORDER BY por valor calculado

Exemplo 1:
SELECT NOME, SALÁRIO + COMIS FROM X.STAFF
WHERE SALÁRIO + COMIS > 20000 ORDER BY 2 DESC

Exemplo 2 :
SELECT CARGO, SALÁRIO + COMIS FROM X.STAFF
ORDER BY CARGO, 2

571774784.doc 46 de 175
DB2

7.26 Operador de concatenação

String  string 2 string1string2


‘ABC’  ‘XYZ’ ‘ABCXYZ’

TABELA (colunas varchar : snom e nome)

SNOM NOME MID


JONES JOHN P
MARQUES FRANCO X

SELECT snom  ‘,’  NOME  ‘ ‘ MID  ‘.’ FROM TABELAX

Resultado :
Jones.john p.
Marques.franco x.
Obs.: O caracter ! ! também pode ser utilizado para concatenação

571774784.doc 47 de 175
DB2

8. SELECT AVANÇADO

8.1 Funções de coluna


Transforma dados de uma coluna em um único valor.

 Dados numéricos
SUM - Total dos valores de uma coluna
AVG - Média dos valores de uma coluna
 Quaisquer tipos de dados
MIN - Menor valor de uma coluna
MAX - Maior valor de uma coluna
COUNT – Número de ocorrências

8.2.1 Notas

 Informações detalhadas não podem ser mostradas. Por exemplo se for pedida a média
salarial por departamento, os valores da coluna NOME não podem ser mostrados.
 Nulos são ignorados nos cálculos

8.3 SUM - AVG - MAX - MIN

Exemplo :

SELECT SUM(SALÁRIO), AVG(SALÁRIO), MIN(COMIS), MAX(COMIS)


FROM X.STAFF WHERE DEPT = 66

Resultado :
---------------------- ----------------------- ----------------------- -----------------------
86076.20 17215.240000000 55.50 844.00

571774784.doc 48 de 175
DB2

8.3.1 Notas

 Geram um único valor a partir de um conjunto de valores de uma única coluna.


 O resultado não contém detalhes de linhas individuais.
 Podem ser pedidas mais de uma função para a mesma coluna, conforme o exemplo.
 Nulos são excluídos
 Precisão (parte inteira, casa decimal) deriva da coluna
 Para a função AVG de uma coluna DECIMAL(p,s) o resultado terá precisão (15,15-p+s)
 Expressões do seguinte tipo também podem ser argumento de uma column function.
Ex. AVG (SALÁRIO + COMIS)

8.4 Count

Count(*) – Número de linhas que satisfazem a condição WHERE


Count(DISTINCT nome-coluna) – Número de valores distintos na coluna.
Nulos não são contados.

Contar as pessoas cujo salário exceda R$18.000 e contar os seus respectivos


departamentos. Mostre a média salarial.

SELECT COUNT(DISTINCT DEPT), COUNT(*), AVG(SALÁRIO)


FROM X.STAFF WHERE SALÁRIO > 18000

Resultado :
------------------------ ------------------------------- ------------------------
8 16 19604.190625000

571774784.doc 49 de 175
DB2

8.5 Literais

SELECT AVG(COMIS), SUM(COMIS) FROM X.STAFF

Resultado :
------------------------------- --------------------------------
513.31 12319.45

SELECT ‘MED:’, AVG(COMIS), ‘SOMA:’, SUM(COMIS) FROM X.STAFF


------------------------------- --------------------------------
MED : 513.31 SOMA : 12319.45

8.5.1 Notas

 Literais podem ser mostradas no resultado de um SELECT


 São particularmente úteis quando usadas com funções de coluna que não exibem
cabeçalhos
 Podemos selecionar apenas uma cadeia de caracteres conforme exemplo a seguir:
SELECT ‘TESTE XYZ’ FROM TABELAZ

Obs.: É necessário que a tabela exista.

8.6 Group by

Com o GROUP BY, a column function calcula um valor para cada agrupamento.
SELECT SUM(SALÁRIO), SUM(COMIS) FROM X.STAFF
WHERE CARGO <> ‘GER’ GROUP BY DEPT

Resultado :
------------------------ ----------------------------
41269.53 1468.70

571774784.doc 50 de 175
DB2

45928.60 867.15
59778.80 1913.30

SELECT DEPT, SUM(SALÁRIO), SUM(COMIS) FROM X.STAFF


WHERE CARGO <> ‘GER’ GROUP BY DEPT

Resultado :
DEPT ------------------- ------------------
15 41269.53 1468.70
20 45928.60 867.15
38 59778.80 19123.30

8.6.1 Notas
A função desta cláusula é mostrar informações calculadas por grupo de dados. Note que o
resultado é classificado.
Isto porque o GROUP BY classifica a tabela numa fase intermediária para
facilitar o cálculo para os grupos.
A classificação se dá em ordem ascendente a menos que exista um índice definido para a
coluna. Neste caso a classificação não é feita.
A seqüência obedecerá a seqüência do índice que pode estar definida como sendo de
ordem descendente.

8.7 Group by ... order by


 Podemos alterar a ordem de classificação
SELECT DEPT, SUM(SALÁRIO), SUM(COMIS) FROM X.STAFF
WHERE CARGO <> ‘GER’ GROUP BY DEPT ORDER BY 3

Resultado :
DEPT
20 45928.60 867.15
: : :

571774784.doc 51 de 175
DB2

15 41269.53 1468.70
: : :
38 59778.80 1913.30

8.7.1 Notas
Podemos fazer GROUP BY sobre múltiplas colunas. Isto faz com que sejam
formados subgrupos dentro de grupos.
 GROUP BY DEPT, CARGO
Colunas ‘GROUP BY’ não precisam ser referenciadas pelo SELECT.
Mas colunas referenciadas pelo SELECT que não sejam função precisam ser agrupadas
pelo ‘GROUP BY’ . Isto é um erro muito freqüente.
O resultado contém uma linha sumário para cada grupo.
Todos os valores nulos são considerados como um grupo.

8.8 Group by ... having

Condições sobre grupos

SELECT ........ FROM ...


WHERE .....

Filtros
GROUP BY ....
HAVING ...

WHERE - Escolhe linhas


HAVING - Escolhe grupos

571774784.doc 52 de 175
DB2

8.8.1 Notas
A função desta cláusula é eliminar alguns grupos gerados pela cláusula GROUP BY. Os
próximos exemplos ilustram o efeito do HAVING.

8.8.2 Exemplos

SELECT DEPT, SUM(SALÁRIO) FROM X.STAFF GROUP BY DEPT

DEPT -----------------
10 83463.45
15 61929.33
20 64286.10
38 77285.55
42 58369.05

SELECT DEPT, SUM(SALÁRIO) FROM X.STAFF GROUP BY DEPT


HAVING SUM(SALÁRIO) > 65000

DEPT -----------------
10 83463.45
38 77285.55
: :

Média salarial por departamento . Considerar apenas os não-gerentes dos


departamentos com mais de 3 pessoas sem CARGO gerencial.

SELECT DEPT, AVG(SALÁRIO) FROM X.STAFF


WHERE CARGO <> ‘GER’ GROUP BY DEPT HAVING COUNT(*) > 3

Média salarial por departamento em ordem decrescente de média.


Considerar apenas os não-gerentes dos departamentos compostos por pessoas
com experiência mínima de 5 ANOS .

571774784.doc 53 de 175
DB2

SELECT DEPT, AVG(SALÁRIO) FROM X.STAFF WHERE CARGO <> ‘GER’ GROUP BY DEPT
HAVING MIN(ANOS) >= 5 ORDER BY 2 DESC

8.8.3 Notas

 O primeiro exemplo mostra que o SELECT e o HAVING podem usar funções diferentes
 O segundo exemplo ilustra que a tabela resultante pode ser classificada

8.9 Sumário funções de coluna

 Column functions só podem ser especificados em :


SELECT
HAVING
 SELECT pode especificar somente
Column functions
Colunas especificadas no ‘GROUP BY’
 HAVING pode especificar
Column function sobre qualquer coluna contida numa tabela especificada na FROM
 Column FUNCTIONS não podem ser embutidas uma dentro da outra.

8.10 Funções escalares

 Transforma um único valor em outro valor


 Funções STRING
 Funções de conversão
 Funções Date / Time

571774784.doc 54 de 175
DB2

8.10.1 Notas

 Ao contrário das column functions que transformam um conjunto de valores de uma


coluna num único valor, as scalar functions operam somente sobre um único valor.
 Scalar functions podem ser embutidas uma dentro da outra.
Exemplo : SUBSTR(SUBSTR(...)...)
 Column functions podem ser argumentos de uma scalar function
Exemplo : SUBSTR(MAX(...)...)
 Scalar functions podem ser argumento de uma column function
Exemplo : MAX(SUBSTR(...)...)

8.11 Substr(string, início, comprimento)

SELECT DEPTNOME, SUBSTR(DEPTNOME,1,4) FROM X.ORG

Resultado :
DEPTNOME ---------------------------------
Matriz Matri
Campinas Camp
Rio Rio
Minas Mina
Bahia Bahi

SELECT DEPTCOD, DIVISÃO FROM X.ORG WHERE SUBSTR(DIVISÃO,4)=’ESTE’


Resultado :
DEPTCOD DIVISAO
15 Sudeste
20 Sudeste
38 Sudeste

571774784.doc 55 de 175
DB2

8.11.1 Notas

 Se o comprimento não for especificado, a função será aplicada para todo o resto
 Se a posição do início ultrapassar o final do string teremos erro
 Se o inicio + comprimento ultrapassar o final do string teremos erro
 Substring de nulo é nulo.

8.12 Length (argumento)

SELECT NOME, LENGHT(NOME), -- tamanho variável


CARGO, LENGHT(CARGO) -- tamanho fixo
FROM X.STAFF

Resultado :
NOME ----- CARGO ----
Santana 7 Ger. 6
Orsini 6 Vendas 6
Gonzales 8 Vendas 6

8.12.1 Notas

 Fornece o tamanho de uma coluna do tipo caracter


 Se o argumento é nulo, o resultado também será nulo

8.13 Value (arg1, arg2,..., argn)

 Dada uma lista de argumentos, mostra o primeiro não nulo

SELECT ID, COMIS, VALUE(COMIS, 0) FROM X.STAFF

571774784.doc 56 de 175
DB2

Resultado :
ID COMIS -----------------
10 - 0.00
20 612.45 612.45
30 - 0.00
40 846.55 846.55

8.13.1 Notas

 Dada uma lista de argumentos, esta função faz a varredura da esquerda para a
direita até encontrar o primeiro valor não nulo.
 Todos os argumentos devem ter data types compatíveis (todos numéricos ou todos
caracteres).
 Se todos os argumentos forem nulos, o resultado será nulo.

8.15 Funções de conversão


 Converte um tipo de representação em outro
DECIMAL, FLOAT, INTEGER : número – número
DIGITS : número – alfa
HEX : hexa – alfa

SELECT DECIMAL(SAL,9,1), INTEGER(SAL) FROM EMP WHERE ID = 55

Se coluna SAL é (DEC(7,2)) :


17506.75

17506.7 17506

571774784.doc 57 de 175
DB2

8. 15 . 1 Not as

 DECIMAL, FLOAT, INTEGER : converte dados numéricos


 DIGITS : representação alfanumérica de uma valor numérico
 HEX : representação hexadecimal de um argumento. Cada dígito hexadecimal é
representada por 2 caracteres da string resultante.

8.16 Dados Date / Time


 DATE, TIME, TIMESTAMP armazenados como decimal compactado sem sinal
Data type Formato Interno
Date aaaammdd
Time hhmmss
Timestamp aaaammddhhmmssnnnnnn

 Programas lidam só com formato externo : string de caracteres

Formato Formato time Tamanho Formato Date Tamanho


ISSO hh.mm.ss 8 bytes aaaa-mm-dd 10 bytes
hh:mm AM
USA 8 bytes mm/dd/aaaa 10 bytes
hh:mm PM
EUR hh.mm.ss 8 bytes dd.mm.aaaa 10 bytes
JIS hh.mm.ss 8 bytes aaaa-mm-dd 10 bytes
Dado Timestamp : aaaa-mm-dd-hh.mm.ss.nnnnnn 26 bytes

8.17 Aritmética Date/Time

 Somente adição e subtração


 Pode usar min, max, count
 Não pode usar sum e avg

571774784.doc 58 de 175
DB2

8.18 Duração Date / Time

 Duração simples

Horário ou – horário duração em hhmmss


(packed decimal(6,0))
data ou – data duração em aaaammdd
(packed decimal(8,0))

 Duração rotulada
Número “n” seguido da palavra chave :
- YEARS, MONTHS, DAYS, HOURS, MINUTES, SECONDS, MICROSECONDS
 Somando / Subtraindo duração
Data + ou – duração(data) - Resulta em data
DATACOL1 + 3 MONTHS
Horário + ou – duração(tempo) - Resulta em horário
TEMPCOL1 – 30 MINUTES – 20 SECONDS
Timestamp + or – duração(data) - Resulta em
Timestamp + or – duração(tempo) – Timestamp
TSTCOL + 2 DAYS – 3 HOURS
TMSTCOL + 50000 MICROSECONDS
 Subtraindo datas e tempos
Data – data - Resulta em duração
DATACOL1 – DATACOL2
DATACOL1 – ‘1984-12-20’
Horário – horário - Resulta em duração
TEMPCOL1 – TEMPCOL2
’11:30 PM’ – TEMPCOL1

571774784.doc 59 de 175
DB2

8.19 Exemplos

Table DT

PRJCOD DATAINI DATAFIM HRINI HRFIM


AX001 19900131 20050331 000000 153000
AX001 19880229 19880831 000000 000000
AX003 19870201 19870201 160000 234159

SELECT PRJCOD, DATAINI + 1 YEAR, DATAFIM – 2 MONTHS ....

Resultado :
PRJCOD ----------------- ---------------------
AX001 31/01/1991 31/01/2005
AX002 28/02/1989 30/06/1988
AX003 01/02/1988 01/12/1986

SELECT PRJCOD, DATAFIM – DATAINI, HRFIM – HRINI ....


PRJCOD ----------------- ---------------------
AX001 00150200 153000
AX002 00000602 000000
AX003 00000000 074159

8.20 Funções escalares Date/Time

 CHAR : controla formato externo de dados date/time


SELECT CHAR(HRFIM,ISO), CHAR(HRFIM,USA) FROM DT
WHERE PRJCOD = ‘AX001’
Resultado :
-----------------
15.30.00 03.30 PM

571774784.doc 60 de 175
DB2

 Day, month, year, hour, minute, second, microsecond


Extrai parte de uma data, horário ou timestamp.
Resulta num inteiro binário.
SELECT DAY(DATAINI), MONTH(DATAINI), YEAR(DATAINI)
FROM DT WHERE YEAR(DATAINI) > 1988
Resultado:
---------------- --------------- ---------------
31 1 1990

 Days
Número de dias desde 31/12/0000
SELECT DATAFIM – DATAINI, DAYS(DATAFIM) – DAYS(DATAINI)
FROM DT WHERE PRJCOD = ‘AX001’
Resultado :
------------------------- -----------------------
00150200 5538
(aaaammdd) (n.º dias)

 Date, time

Extrai data ou horário de um timestamp

8.21 Valores concorrentes

 Current date
Data de corrente (do dia)
 Current time
Horário corrente
 Current timestamp
Data e horário corrente convertido para timestamp
SELECT * FROM DT WHERE DATAINI < CURRENTE DATE – 90 DAYS

571774784.doc 61 de 175
DB2

8.22 Join de tabelas

Mesmo domínio

ID NOME DEPT
10 Santana 20
20 Orsini 20
30 Dantas 38
40 O’Brien 38 Deptcod Deptnome Gerente
50 Souza 15 10 Matriz 160
60 Suzuki 38 15 Campinas 50
70 Almeida 15 20 Rio 10
80 James 20 38 Minas 30
90 Koonitz 42 42 Bahia 100
100 Plotz 42 51 Recife 140
: : : : : :

 Esta técnica serve para obtermos informações que estão espalhadas em uma ou mais
tabelas
 Tabelas são relacionadas via dados comuns
 Join implementado pela cláusula FROM
 Resultado é subconjunto do produto cartesiano das tabelas
 Para capturar linhas que não possuam correspondência, pode-se utilizar o chamado
“outer join”.

571774784.doc 62 de 175
DB2

Listar o NOME dos departamentos e seus respectivos gerentes

SELECT DEPTNOME, NOME FROM X.STAFF, X.ORG WHERE gerente = ID

X.ORG X.STAFF
DEPTNOME GERENTE DIVISÃO ID NOME
: : 30 DANTAS
MINAS 30 SUDESTE : :
BAHIA 100 : 100 PLOTZ
: : : : :
Resultado :
DEPTONOME NOME
Rio Santana
Minas Dantas
Campinas Souza
: :

Listar o NOME dos departamentos da divisão sudeste e seus respectivos


gerentes

SELECT DEPTNOME, NOME, FROM X.STAFF, X.ORG


WHERE DIVISÃO = ‘SUDESTE’ AND GERENTE = ID

Atenção: Procure não fazer JOIN de tabelas sem a cláusula WHERE

SELECT A1, B1 FROM TBLA, TBLB produto cartesiano

TBLA RESULT TBLB


A1 A2 A3 R1 R2 B1 B2 B3
A A X X
B A Y Y
C B X
B Y
C X
C Y

571774784.doc 63 de 175
DB2

8.23 Join com mais de duas tabelas

SELECT ID, NOME, DEPT, DEPTNOME, CODPEDIDO FROM X.STAFF, X.ORG, X.VENDAS
WHERE DEPT=DEPTCOD AND ID=COD_RVENDA
Resultado:
ID NOME DEPT DEPTNOME CODPEDIDO
20 Orsini 20 Rio 3456
20 Orsini 20 Rio 6667
20 Orsini 20 Rio 3580
20 Orsini 20 Rio 7010
40 O’Brien 38 Minas 4567

8.24 Qualificadores

CODIGO NOME DEPT CARGO CODIGO DEPTNOME GERENTE


10 Santana 20 Ger 10 MATRIZ 160
20 Orsini 20 Vendas : : :
: : : 10 Rio 10
: : : : : :

Listar o NOME dos gerentes, e respectivos NOME e código de


departamentos.

Solução :
 Qualificar com NOME de tabela
SELECT NOME, X.ORG.CODIGO, DEPTNOME FROM X.STAFF, X.ORG
WHERE CARGO = ‘GER’ AND DEPT = X.ORG.CODIGO
 Qualificador correlacionado

SELECT NOME, O.CODIGO, DEPTNOME FROM X.STAFF, X.ORG o


WHERE CARGO = ‘GER’ AND DEPT = O.CODIGO

571774784.doc 64 de 175
DB2

8.24.1 Notas

Aqui neste exemplo temos um caso onde duas colunas de tabelas distintas tem o mesmo
NOME.
A solução para distingui-las é qualificar o NOME da coluna com o NOME da tabela.
Outra técnica é a utilização do qualificador correlacionado onde atribuímos um rótulo à
tabela.
No nosso exemplo a tabela X.ORG foi rotulada como “O”. Assim a coluna O.CÓDIGO é uma
referência à coluna X.ORG.CÓDIGO
Esta rotulação não é permanente e vale somente durante a execução da instrução SELECT
que faz uso da mesma.

8.25 Join de uma tabela com ela mesma

Liste os empregados que ganham mais que os seus gerentes


Conceitualmente :
1. Obter um empregado da VEMPR
MATR NOME ... SALÁRIO ... GER
150 Oliveira 19456.50 140

2. Obter informações do gerente da VEMPR


MATR NOME ... SALÁRIO ... GER
150 Oliveira 19456.50 140

3. Comparar o salário dos dois


4. Se a condição é satisfeita, colocar a linha na tabela resultante e partir para o
próximo empregado.

Solução :
SELECT E.NOME, E.SALÁRIO, G.NOME, G.SALÁRIO FROM VEMPR E, VEMPR G WHERE
E.GER = G.MATR AND E.SALÁRIO > G.SALÁRIO

571774784.doc 65 de 175
DB2

Resultado :
NOME SALÁRIO NOME SALÁRIO
Oliveira 19456.50 Santana 18357.50
: : : :

8.25.1 Notas
Algumas pesquisas podem ser feitas mediante o artifício de tratar uma tabela como se
fossem duas tabelas distintas. No nosso exemplo a tabela VEMPR foi tratada como as
tabelas “E” de empregados e “G” de gerentes.
Este problema é clássico e poderia ser resolvido pela técnica de subquery que é o nosso
próximo tópico.

8.26 Union

Union junta as tabelas resultado


SELECT A1, A4 FROM TBLA WHERE A2 = ‘Z’
Resultado :

: :

UNION
SELECT B3, B4 + B2 FROM TBLB WHERE B1 >= ‘N’
Resultado :

: :

8.26.1 Notas

Esta técnica faz a união de uma ou mais tabelas resultado.


Queries complexas podem ser feitas usando o UNION.

571774784.doc 66 de 175
DB2

Queries são executadas serialmente.


A quantidade de colunas deve ser a mesma em todos os SELECT’s.
Os data types das colunas correspondentes devem ser iguais.
O tamanho das colunas correspondentes podem ser diferentes.
O operador UNION une as tabelas resultantes e elimina as linhas duplicadas, que implica
num SORT.
O operador UNION ALL também une as tabelas mas não elimina linhas duplicadas. Não
chama o SORT portanto.
Para os nomes das colunas no cabeçalho são adotadas as do primeiro bloco de SELECT da
query.

A faixa de salários dos atendentes atingiria a faixa de salários do pessoal de


vendas se fosse dado um aumento de 17% e 2% respectivamente ?

SELECT CARGO, SALÁRIO * 1.17 FROM X.STAFF WHERE CARGO = ‘ATEND’


UNION
SELECT CARGO, SALÁRIO * 1.02 FROM X.STAFF WHERE CARGO = ‘VENDAS’ ORDER BY 2 DESC

Resultado :
CARGO
Vendas 21420.0000
- -
- -
- -
Vendas 17144.4660
Atend 16918.2000
Vendas 16832.8866
- -

571774784.doc 67 de 175
DB2

8.27 Union all vs. Union

SELECT NOME FROM X.CANDIDATOS WHERE ENDEREÇO LIKE ‘%SP’

UNION ALL UNION

SELECT SOBRENOME FROM X.ENTREVISTADOS WHERE SIT = ‘REP’

Do primeiro SELECT
NOME NOME
Jacobs Arantes
Marques Jacobs
Arantes Marques
Silva Silva
Marques
Jacobs

8.27.1 Notas

O UNION elimina as linhas redundantes ao contrário do UNION ALL. O NOME da coluna da


tabela resultante é obtida da primeira tabela referenciada na instrução SELECT.

9. SUBQUERY

 É um SELECT embutido dentro de um SELECT


 O resultado de uma subquery é usado pelo SELECT “externo”

Li sta r e mp r e gad o s cu j o de p ar ta me n to e ste ja su b o rd i na d o ao d ep ar ta men to ‘ A00’

SNOME DEPARTAMENTO

DCOD DSUPER

571774784.doc 68 de 175
DB2

SELECT SNOME, DEPARTAMENTO FROM EMP WHERE DEPARTAMENTO IN


(SELECT DCOD FROM DEPT WHERE DSUPER = ‘A00’)

Resultado somente Resultado da subquery


do SELECT de nível retornado para o
mais alto nível superior

9.1 Considerações subquery

 Pode ser usado no WHERE ou no HAVING


 Pode ser encadeado
 A escolha do operador do SELECT externo depende da quantidade de linhas do subquery

9.1.1 Notas

Deve estar à direita do operador na condição de seleção.


Deve ser colocado entre parênteses.
O subquery deve selecionar apenas uma coluna.
O subquery pode retornar uma ou mais linhas e isto acaba determinando o operador a ser
usado na search condition.
Não pode conter UNION, UNION ALL ou ORDER BY.
Muitas vezes o SUBQUERY é citado como SUBSELECT. Prefira o termo SUBQUERY.

571774784.doc 69 de 175
DB2

9.2 Subquery de uma linha

Listar os funcionários com salário superior à média da companhia


X.STAFF
NOME SALÁRIO

 Encontrar a média salarial da companhia (subquery)


SELECT AVG(SALÁRIO) FORM X.STAFF 16675.64
 Comparar o salário de cada funcionário com o resultado
SELECT NOME, SALÁRIO FROM X.STAFF
WHERE SALÁRIO > (SELECT AVG(SALÁRIO) FROM X.STAFF)

Resultado :
NOME SALÁRIO
Santana 18357.50
Orsini 18171.25
: :

9.3 Subquery com uma linha

Mostrar o funcionário com o maior salário

SELECT NOME, SALÁRIO FROM X.STAFF


WHERE SALÁRIO = (SELECT MAX(SALÁRIO) FROM X.STAFF)

Resultado:

NOME SALÁRIO
Molinari 22959.20

9.4 Subquery com várias linhas : ALL

571774784.doc 70 de 175
DB2

Lista classificada dos funcionários com salário superior a toda e qualquer


média salarial departamental.

 Encontrar média salarial para cada departamento.


(SELECT AVG(SALÁRIO) FROM X.STAFF GROUP BY DEPT)
Resultado :
20865.862500000
15482.332500000

 Compare o salário de cada funcionário com a lista devolvida pela SUBQUERY


SELECT NOME, SALÁRIO FROM X.STAFF WHERE SALÁRIO > ALL
(SELECT AVG(SALÁRIO) FROM X.STAFF GROUP BY DEPT) ORDER BY NOME
Resultado :
NOME SALÁRIO
Fraye 21150.00
Graham 21000.00
Jones 21234.00
Molinare 22959.20

9.4.1 Notas
Quando o SELECT interno retorna mais que uma linha, passa a ser necessário o emprego de
um dos seguintes operadores : ALL, ANY, SOME ou IN.

571774784.doc 71 de 175
DB2

9.5 Subquery com várias linhas : ANY ou SOME

Lista classificada dos funcionários com salário maior que a média salarial de
algum departamento
.
 Encontrar a média salarial para cada departamento
(SELECT AVG(SALÁRIO) FROM X.STAFF GROUP BY DEPT)
Resultado :
20865.862500000
15482.332500000

 Compare o salário de cada funcionário com a lista devolvida pela SUBQUERY


SELECT NOME, SALÁRIO FROM X.STAFF WHERE SALÁRIO > ANY
(SELECT AVG(SALÁRIO) FROM X.STAFF GROUP BY DEPT) ORDER BY NOME
Resultado :
NOME SALÁRIO
Daniels 19260.25
Davis 15454.50
Edwards 17844.00

9.6 In

Lista de gerentes da divisão sul

SELECT DEPT, NOME FROM X.STAFF WHERE ID = ANY


(SELECT GERENTE FROM X.ORG WHERE DIVISÃO = ‘SUL’)

 Subquery resulta numa lista de GERENTES da divisão Sul (66 e 84)


 ‘IN’ eqüivale a uma série de ‘OR...=’ sobre uma coluna
 “=ANY” pode substituir “IN”

571774784.doc 72 de 175
DB2

SELECT DEPT, NOME FROM X.STAFF WHERE ID IN (SELECT GERENTE FROM X.ORG WHERE
DIVISÃO=’SUL’)

9.7 Having com subquery

Liste os departamentos cuja média salarial seja inferior à média da


companhia. Ignore os gerentes. Mostre as médias e ordene pelas mesmas.

SELECT DEPT, AVG(SALÁRIO) FROM X.STAFF WHERE CARGO <> ‘GER’ GROUP BY DEPT
HAVING AVG(SALÁRIO) < (SELECT AVG(SALÁRIO) FROM X.STAFF WHERE CARGO <> ‘GER’)
ORDER BY 2 DESC

Resultado :
DEPT
66 16880.175000000
51 16235.200000000
84 15443.000000000
20 15309.530000000

9.8 Subquery correlacionado

Listar os empregados com salário superior à média de seus respectivos


departamentos

SELECT NOME, SALÁRIO FROM X.STAFF CV WHERE


SALÁRIO > (SELECT AVG(SALÁRIO) FROM X.STAFF WHERE DEPT = CV.DEPT

 Um subquery correlacionado é executado a cada linha devolvida ao SELECT externo.

Obs.: Evite o uso da subquery correlacionado por questões de performance.

571774784.doc 73 de 175
DB2

9.9 Subquery testando V ou F

Liste os gerentes ganhando menos que R$ 18.000,00 se existir pelo menos um


gerente com salário superior a R$ 22.000,00

SELECT ID, NOME, SALÁRIO, DEPT FROM X.STAFF WHERE CARGO =’GER’ AND SALÁRIO <
18000 AND EXISTS (SELECT * FROM X.STAFF WHERE CARGO = ‘GER’ AND SALÁRIO > 22000)

ID NOME SALÁRIO DEPT


30 Marengui 17506.75 38

 Verdadeiro / Falso no SELECT interno


Determina se o SELECT externo será executado

9.9.1 Notas

 Este é um operador que tem como argumento um SELECT


 Esta subquery não devolve nenhuma tabela resultante
 EXISTS devolve V ou F e como faz parte de uma search condition, determina uma
eventual execução ou não do SELECT externo.
 EXISTS pode ser negado por um NOT.

571774784.doc 74 de 175
DB2

10. DIAGRAMA DE SINTAXE DE SQL

10.1 Funções escalares

VALUE [expression ]
, ISO
, USA
, EUR
, JIS
, LOCAL

11. MANUTENÇÃO DE DADOS

11.1 Insert de uma linha

INSERT INTO PROJ


VALUES (‘MA2114’, ‘ ’, ‘B01’, ‘ ‘, NULL, CURRENT DATE, NULL)
INSERT INTO PROJ (DEPT, PCODIGO, PNOME, RESP, DATAINI)
VALUES (‘B01’, ‘MA2114’, ‘ ‘, ‘ ‘, CURRENT DATE)

Resultado :
PCODIGO PNOME DEPT RESP EQUIPE DATAINI DATAFIM
------------ ---------- ------ --------- ---------- --------- -----------
------------ ---------- ------ --------- ---------- ---------- -----------
OP2011 Suporte sistema E21 000320 001.00 19820101 19880201
OP2012 Suporte aplicação E21 000330 001.00 19820101 19880201
OP2013 Suporte DB/DC E21 000340 001.00 19820101 198800201
---------- ---------- ----- --------- --------- ---------- -----------
MA2114 B01 -------- ? 19880920 ?

571774784.doc 75 de 175
DB2

11.2 Insert de múltiplas linhas

TESTPROJ
PCOD PROJNOME DEPT RESP EQUIPE DATAINI DATAFIM

INSERT INTO TESTPROJ SELECT * FROM PROJ WHERE DEPT


LIKE ‘B%’ OR DEPT IN (‘E11’, ‘E21’, ‘E31’)

Resultado :
PCOD PROJNOME DEPT RESP EQUIPE DATAINI DATAFIM
PL2100 -------- B01 000020 001.00 19870101 19870915
OP1010 Operação E11 000090 005.00 19860101 19880501
OP2010 Suporte sistema E21 000100 004.00 19820101 19880201
OP2011 -------- E21 000320 001.00 19820101 19880201
OP2013 -------- E21 000340 001.00 19820101 19880201

11.3 Update de colunas

Antes :
PCOD PROJNOME DEPT RESP EQUIPE DATAINI DATAFIM
----------- ----------------- -------- -------- ----------- ------------ -------------
MA2113 W L Controle D11 000090 005.00 19840215 19870201
PL2100 ---------------- B01 000020 002.00 19870601 ?
--------- ---------------- ---- --------- ---------- ------------ -------------
OP2012 Suporte aplicação E21 000330 001.00 19820101 19880201
OP2013 Suporte DB/DC E21 000340 001.00 19820101 19880201
MA2114 B01 ? 19870601 ?

 Um subconjunto de linhas
UPDATE PESSOAL SET SALÁRIO = SALÁRIO + 300 WHERE CARGO = ‘ATEND’
 Todas as linhas
UPDATE PESSOAL SET ANOS = ANOS + 1

571774784.doc 76 de 175
DB2

11.4 Delete de linhas

 Ant es :

PCOD PROJNOME DEPT RESP EQUIPE DATAINI DATAFIM


--------- -------------- -------- ----------- ---------- ---------- -----------
MA2113 -------------- D11 000090 005.00 19840215 19870201
PL2100 ------------- B01 000020 001.00 19870101 ?
---------- ------------- ------- ----------- ---------- ----------- ------------
OP2012 ------------- E21 000330 001.00 19820101 19880201
OP2013 ------------- E21 000340 001.00 19820101 19880201
MA2114 B01 ? 19870601 ?

DELETE FROM TESTPROJ WHERE DEPT = ‘B01’

 Depoi s :

PCOD PROJNOME DEPT RESP EQUIPE DATAINI DATAFIM


--------- -------------- -------- ----------- ---------- ---------- -----------
MA2113 -------------- D11 000090 005.00 19840215 19870201
---------- ------------- ------- ----------- ---------- ----------- ------------
OP2012 ------------- E21 000330 001.00 19820101 19880201
OP2013 ------------- E21 000340 001.00 19820101 19880201

11.4.1 Delete de todas as linhas

 Ant es

PCOD PROJNOME DEPT RESP EQUIPE DATAINI DATAFIM


--------- -------------- -------- ----------- ---------- ---------- -----------
MA2113 -------------- D11 000090 005.00 19840215 19870201
---------- ------------- ------- ----------- ---------- ----------- ------------
OP2012 ------------- E21 000330 001.00 19820101 19880201
OP2013 ------------- E21 000340 001.00 19820101 19880201

DELETE FROM TESTPROJ

571774784.doc 77 de 175
DB2

 Depoi s

PCOD PROJNOME DEPT RESP EQUIPE DATAINI DATAFIM


12. DDL

 Create
Definição de objetos
 Alter
Alteração da definição dos objetos
 Drop
Eliminação de objetos

12.1 Notas
A Data Definition Language (DDL) faz parte das instruções SQL e divide-se em três
grupos.
 Instruções CREATE
Definição de um objeto com fornecimento de vários parâmetros
 Instrução ALTER
Alteração da definição de um objeto já existente. Nem todas as características são
alternáveis
 Instruções DROP
Eliminação da definição de um objeto existente
A execução de DDL é permitido somente à auth-id’s devidamente autorizados.
O criador (auth-id) do objeto é normalmente o proprietário (owner) do mesmo. Mas o DB2
permite que sejam criados objetos para outros auth-id, isto é, posso criar objetos das quais
não serei o proprietário.
O proprietário de um objeto tem todos os privilégios sobre o mesmo.
A equipe de suporte (SYSADM, SYSCTRL, DBADM) ou proprietário do objeto é o responsável
pela concessão de autorização para acesso e/ou uso dos objetos.
A execução das instruções ALTER ou DROP estão reservadas à equipe de suporte ou ao
proprietário dos objetos.

571774784.doc 78 de 175
DB2

12.2 Storage group

CREATE STOGROUP CEVOLS VOLUMES (CEDB2X, CEDB2Y) VCAT DB2CATLOG

ALTER STOGROUP CEVOLS ADD VOLUMES (CEIMSX) REMOVE VOLUMES (CEDB2Y)

12.2.1 Notas
O nome de um storage group não deve ultrapassar 8 caracteres.
Podem ser especificados até 133 volumes do mesmo device type (3375, 3380, 3390) no
parâmetro VOLUMES.
VCAT aponta para o catálogo ICF que qualificará os datasets dos tablespaces e dos
indexspaces.

13. DATABASE

CREATE DATABASE DB01DB01

13.1 Notas

Exemplo de definição de um database de NOME DB01DB01.


Parâmetros como storage group e bufferpool podem ser fornecidos. Os valores
especificados serão utilizados em caso de omissão durante a definição de objetos que
pertençam a este database.
À partir da V2.3 os parâmetros storage group e bufferpool podem ser alterados.

571774784.doc 79 de 175
DB2

13.2 Tablespace

CREATE TABLESPACE DB01TS01


IN DB01DB01
USING STOGROUP CEVOLS
PRIQTY 100 SECQTY 10
ERASE NO
LOCKSIZE ANY
BUFFERPOOL BP0
CLOSE YES
FREEPAGE 4
PCTFREE 25
SEGSIZE 8

ALTER TABLESPACE DB01TS01


PRIQTY 200

13.2.1 Notas

O exemplo mostra a definição de um tablespace segmentado.


 IN
Especifica o database que vai conter o tablespace. Default é o DSNDB04
 USING STOGROUP
Especifica o storage group que conterá fisicamente o dataset do tablespace. O valor
default é obtido do database ou do sistema.
 PRIQTY
Alocação primária em Kbytes para o dataset do tablespace. O número deve ser inteiro.
A alocação real será o valor dividido por 4 (32 se páginas de 32 K) e arredondado para
cima. O valor default é 3.

571774784.doc 80 de 175
DB2

 SECQTY
Alocação secundária em Kbytes para o dataset do tablespace. O número deve ser
inteiro.
 ERASE
Especifica se o espaço ocupado pelos datasets devem ser preenchidos com zero quando
forem eliminados (DROP). Default é No.
 LOCKSIZE
Especifica a glanularidade do locking. Portanto é um importante parâmetro de
performance. Pode ser :
 ROW / PAGE
Locking em nível de linha ou página
 ANY
É o valor default para o parâmetro LOCKSIZE. Com este valor a decisão pela
glanularidade fica por conta do DB2.
 TABLE
Locking em nível de tabela
 TABLESPACE
Locking em nível de tablespace
 BUFFERPOLL
Importante parâmetro que determina o tamanho das páginas do tablespace. Este valor
aponta para o conjunto de buffers que será associado com o tablespace. As opções são
BP0 (pág. De 4K), BP1 (pág. De 4K) ou BP32K (pág. De 32K).
 CLOSE
Especifica se o dataset do tablespace deve ser fechado quando não está sendo
utilizado. O default é YES.

 FREEPAGE
Especifica o intervalo de páginas que devem existir entre as páginas livres quando um
tablespace é carregado ou reorganizado. O intervalo pode variar de 0 (sem página livre)

571774784.doc 81 de 175
DB2

à 255. Se o tablespace é segmentado, o número deve ser menor que o tamanho do


segmentado. Se for especificado um intervalo maior que o tamanho do segmento, o DB2
adotará o tamanho do segmento menos 1. O valor default é zero.
 PCTFREE
Especifica qual é a fração percentual das páginas que devem ser mantidas livres quando
o tablespace é carregado ou reorganizado. O valor pode variar de 0 à 99. O default é 5.
 SEGSIZE
Se especificado, determina que o tablespace será segmentado com um certo tamanho.
O tamanho de um segmento é dado em quantidade de páginas, deve ser inteiro múltiplo
de 4, variando de 4 à 64.
 NUMPARTS
Se especificado no lugar de SEGSIZE, determina que o tablespace será particionado.
É acompanhado de um número que indica a quantidade de partições que deve ter um
tablespace. O número pode variar de 1 à 64.
Se nem segsize e nem numparts forem especificados, o tablespace será simples.
Muitos dos parâmetros do tablespace podem ser alterados.
Não podem ser alterados:
 O database que o contém
 O seu tipo (simples, segmentado ou particionado)

13.3 Tabela

CREATE TABLE DB01.DEPT

571774784.doc 82 de 175
DB2

(CÓDIGO CHAR(5) NOT NULL.


DNOME VARCHAR(36) NOT NULL.
GERENTE CHAR(6).
DSUPER CHAR(3) NOT NULL
WITH DEFAULT)
IN DB01DB01.DB01TS01

ALTER TABLE.DB01.DETP
ADD COLX DECIMAL(8.2)

13.3.1 Notas

Opcionalmente pode-se utilizar :


CHECK = para permitir a validação dos valores da coluna
DEFAULT = para permitir a colocação de valores especificados pelo usuário, como default
para a coluna.

Especificação de Chaves

CREATE TABLE EMPR


(MATR CHAR(6) NOT NULL.
:
PRIMARY KEY (MATR)
:
FOREIGN KEY (DEPT)
REFERENCES DEPT
ON DELETE CASCADE)

 PRIMARY KEY
Especifica a chave primária da tabela
A chave pode ser composta de até 64 colunas.

571774784.doc 83 de 175
DB2

O comprimento de uma chave primária não pode exceder 254 bytes


Apenas uma chave primária é permitida por tabela
Uma tabela criada com chave primária é incompleta enquanto não for criado um índice
único para as colunas que compões a chave.
 FOREIGN KEY
Especifica a chave estrangeira da tabela. A definição de uma chave estrangeira deve ser
igual em tamanho e tipo de dados com a definição da chave primária.
A palavra chave references identifica a tabela mãe (parent table) que contém a chave
primária correspondente.
A palavra chave on delete especifica a regra de eliminação que se aplica no caso de
solicitação de eliminação de linhas da tabela mãe. Temos as seguintes opções:
- Restrict que é a opção default
- Cascade
- Set Null

Copiando a definição de uma tabela

CREATE TABLE EMPTEST LIKE DB01.EMPR IN DB01DB01.DB01TS01

A palavra chave LIKE especifica que a tabela a ser criada deverá ter as mesmas colunas
com todos os seus atributos de nome, tipo de dado e nulidade. Demais atributos da tabela
como chave primária, chave estrangeira e rotinas de exit não são reproduzidos.

Definição para colunas numéricas

DATA TYPE DESCRIÇÃO FAIXA


Smallint Inteiros + or – 32K*

571774784.doc 84 de 175
DB2

Integer
Inteiros + or – 2 G
Int
Decimal(x,y) x dígitos Até 31
Dec(x,y) com y decimais Dígitos
Float(m) Precisão simples 5.4E-79 to
Real Ponto flutuante** 7.2E + 75
Float
Dupla precisão 5.4E – 79 to
Float(n)
Ponto flutuante** 7.2E + 75
Double precision
* Aproximadamente
** 1 <= m <= 21
22 <= n <= 53
Para decimal, defina X como número ímpar, para melhor utilização de espaço.

Smallint é uma halfword (2 bytes)


Integer é uma fullword (4 bytes)
Decimal armazena números em decimal compactado. A faixa de valores depende da
quantidade de casas decimais.
O critério de escolha do tipo de dado depende :
 Da faixa de valores que a coluna precisa abranger
 Do tipo de comparação necessária para os processamentos. Este tipo de preocupação
deve existir porque a comparação entre colunas de tipos de dados diferentes implica
em processamento adicional para conversão além dos riscos de erro devido à erros
induzidos por arredondamento.

Definição para colunas alfanuméricas

DATA TYPE DESCRIÇÃO FAIXA


Char(x) String de tamanho X caracteres
Character(x) Fixo (máximo de 254)

571774784.doc 85 de 175
DB2

Varchar(x) String de tamanho 0 a X caracteres


variável (máximo 4K*)
Long String de tamanho 0 a n caracteres
Char variável (máximo 4K*)
* Aproximadamente, assumindo páginas de 4K
Tamanho máximo real depende do tamanho das demais colunas, bem como do tamanho da
página.
Uma página de DB2 não é integralmente utilizada para os dados pois existe um espaço
ocupado para informações de controle.
O tamanho máximo real das colunas varchar ou long varchar é restringindo pelo tamanho
da página e pelo tamanho das demais colunas da linha.
O critério de escolha dos tipos de colunas caracter depende:
 Do tamanho de dados
 Dos tipos de conversão requeridos (mesma observação feita para as colunas numéricas)

Definição para colunas DBCS

DATA TYPE DESCRIÇÃO FAIXA


String de X caracteres
Graphic(x)
Tamanho fixo (máximo 127)
String de tamanho 0 a x caracteres
Vargraphic(x)
variável (máximo 2K*)
Long String de tamanho 0 a n caracteres
Vargraphic Variável (máximo 2k*)
* Aproximadamente, assumindo páginas de 4K.
Tamanho máximo real depende do tamanho das demais colunas, bem como do tamanho da
página.
Double byte character são caracteres especiais como ideogramas asiáticos que requerem 2
bytes para serem identificados.

Definição para colunas date/time

DATA TYPE FORMATO INTERNO

571774784.doc 86 de 175
DB2

Date aaaammdd
Time hhmmss
Timestamp aaaammddhhmmssnnnnnn
(nnnnnn = microsegundos)

ALTER TABLE DB01.DEPT ADD COLX DECIMAL(9,2)


 Alterações que podem ser feitas numa tabela
 Adição de colunas que não sejam NOT NULL
 Adição de chave primária e/ou estrangeira
 Eliminação de chave primária e/ou chave estrangeira
 Adição/eliminação de validproc
 Troca de nível de audit
 Alterações que não podem ser feitas numa tabela
 Alterar o tipo de dado
 Alterar o tamanho da coluna
 Alterar o atributo de nulidade
 Rearranjar a ordem das colunas
 Eliminar colunas
 Trocar de tablespace
 Trocar o editproc

13.4 Índice

CREATE UNIQUE INDEX MATRIX


ON EMPR (MATR)
USING STOGROUP CEVOLS

571774784.doc 87 de 175
DB2

PRIQTY 40 SECQTY 4
ERASE NO
BUFFERPOOL BPO
CLOSE NO
FREEPAGE 4
PCTFREE 15

ALTER INDEX MATRIX


USING STOGROUP STDB2G

13.4.1 Notas

Os parâmetros de criação de um índice são semelhantes aos dos tablespaces.


Isto porque quando definimos um índice é criado implicitamente um
indexspace. Um indexspace corresponde ao tablespace dos índices.
Com a palavra chave UNIQUE o índice passa a aceitar somente valores únicos, não
permitindo entradas duplicadas.
O índice é comum se a palavra chave UNIQUE é omitida.
A palavra chave CLUSTER causa a criação de um índice clustering.
A palavra chave ON especifica a tabela à qual estará associada o índice.
As colunas que compõe o índice são listadas entre parênteses.
Um índice pode ser composto por até 64 colunas.
O parâmetro SUBPAGE especifica que as leaf pages do índice serão subdivididas para
diminuir a granularidade do locking. A subdivisão pode ser feita em 2, 4, 8 ou 16 sub-
páginas.
Os demais parâmetros tem significado idêntico ao do tablespace.
O índice é criado sempre no mesmo database da tabela à qual está associada.
Um índice pode ser criado antes ou depois da carga de uma tabela. Se um índice único for
criado para uma tabela já carregada, haverá uma checagem prévia para verificar se não
existem valores duplicados.

571774784.doc 88 de 175
DB2

13.5 Sinônimo e Alias

CREATE SYNONYM EMPREGADO


FOR DB01.EMPR

CREATE ALIAS ORGRJ


FOR RIO.DB01.DEPT

13.6 View

CREATE VIEW SALDEPT


(DEPCOD, SALÁRIO)
AS
SELECT DEPT, AVG(SALÁRIO)
FROM EMPR
GROUP BY DEPT

13.6.1 Notas

A VIEW de uma tabela é um subconjunto de uma ou mais tabelas


Uma instrução SELECT extrai um subconjunto de uma ou mais tabelas e portanto faz parte
da definição de uma VIEW.
Uma VIEW é um objeto lógico e assim, seus “dados” não ocupam espaço físico.

571774784.doc 89 de 175
DB2

Uma VIEW pose ser atualizada.


A utilização do parâmetro WITH CHECK OPTION no CREATE VIEW faz com que a VIEW criada
permita somente atualizações que se conformem à cláusula WHERE do SELECT.
Por exemplo :

CREATE VIEW SALDEPT


(DEPCOD, SALÁRIO)
AS
SELECT DEPT, SALÁRIO
FROM EMPR
WHERE SALÁRIO < 1000

A VIEW acima não permite que o usuário atualize a coluna SALÁRIO de qualquer linha
para um valor maior ou igual a 1000.

13.7 Comentários e Rótulos


COMMENT ON TABLE PROJETO
IS ‘PROJETO DE PROGRAMAÇÃO’

COMMENT ON EMPR
(MATR IS ‘ MATRÍCULA ÚNICA DO FUNCIONÁRIO’
COMIS IS ‘COMISSÃO DO FUNCIONÁRIO’)

LABEL ON EMPR
(MATR IS ‘MATRÍCULA’
DEPT IS ‘DEPARTAMENTO’
DATADIM IS ‘DATA_ADMISSÃO’)

571774784.doc 90 de 175
DB2

13.8 Drop

DROP DATABASE nome do database


DROP TABLESPACE Db.name.tsname
DROP TABLE nome da tabela
DROP VIEW nome da View
DROP SYNONYM nome do sinônimo
DROP INDEX nome do índice
DROP STOGROUP nome do stogroup

13.9 DB2 Dependência entre objetos

CRIE
Objetos DATA BASE STORAGE GROUP

571774784.doc 91 de 175
DB2

Nesta
Ordem
TABLE SPACE

TABLE

INDEX S
Y
VIEW N
O
N
SYNONYM Y
M

13.9.1 Notas

Os objetos DB2 são quase todos dependentes entre si. A figura ilustra a hierarquia entre
eles.
Assim, quando definimos um índice é preciso associá-lo à uma tabela. Se esta tabela for
eliminada, o índice perde a razão de sua existência e também será eliminado.
Um storage group pode ser eliminado sem problemas. À partir de sua eliminação os data
sets não serão mais criados nos seus volumes. Os eventuais dados que estiverem residindo
em um storage group permanecerão lá até que seja aplicado um utilitário de recuperação
ou de reorganização. A eliminação de uma tabela não implica em eliminação do ALIAS que
o aponta. Este passa a ser inválido.

14. APLICAÇÕES DB2

571774784.doc 92 de 175
DB2

14.1 SQL Estático vs. SQL Dinâmico

A diferença entre o SQL estático e o dinâmico está no instante em que o plano é montado.
No estático o plano é montado antes da primeira execução do programa. É recomendado
para aqueles casos onde a instrução SQL é completa e estável.
No dinâmico o plano é montado dinamicamente, pouco antes da execução da instrução. No
SQL dinâmico a instrução é parcial ou totalmente desconhecida e o DB2 não tem como
determinar previamente a estratégia de acesso, validar autorização, etc.
Uma instrução onde o desconhecido é apenas o valor que está sendo comparado com uma
coluna na cláusula WHERE é candidata a estático.
Ex.: WHERE SALÁRIO = : SAL AND NOME LIKE : STR
Como exemplos de programas que usam o SQL dinâmico podemos citar o QMF e o SPUFI.

15. PROGRAMAÇÃO EM LINGUAGENS TRADICIONAIS

15.1 Programação em SQL

571774784.doc 93 de 175
DB2

N ÃO RE LACI ON AL RE LACI ON AL

COBOL
ASSEMBLER
C SQL SQL
PLI EMBUTIDO
FORTRAN

ARQUIVOS CURSOR TABELAS


REGISTROS VAR. HOST LINHAS

15.1.1 Notas

Para podermos trabalhar com o SQL dentro de programas em linguagens tradicionais,


devemos codificá-lo usando delimitadores especiais. Esta técnica é conhecida como SQL
embutido e assemelha-se ao COMMAND LEVEL do CICS.
O SQL trabalha com tabelas e linhas. É uma linguagem desenvolvida para manipular
conjuntos.
Já as linguagens tradicionais trabalham com arquivos e registros e não conseguem
reconhecer tabelas e linhas.
Para simularmos um arquivo com seus registros existe o CURSOR do DB2. Assim o programa
pode acessar e manipular linhas de uma tabela como se estivesse trabalhando com um
arquivo comum.

571774784.doc 94 de 175
DB2

As colunas não são manipuladas diretamente pelas linguagens tradicionais. Para contornar
isto são utilizadas as chamadas variáveis HOST que “hospedam” o conteúdo das colunas.

15.2 SQL Embutido

 Instrução SQL entre delimitadores


EXEC SQL delete FROM DEPT END-EXEC.
 Delimitadores
COBOL EXEC SQL instrução SQL END-EXEC
PL/1 C EXEC SQL instrução SQL ;
FORTRAN EXEC SQL X instrução SQL ;
ASSEMBLER EXEC SQL X instrução SQL

15.2.1 Notas

O compilador das linguagens tradicionais não entende instruções SQL.


As instruções SQL devem ser embutidas dentro de um programa separados por
delimitadores para que possam ser tratadas antes de serem submetidos ao compilador.
Cada linguagem tem o seu delimitador próprio para isolar as instruções SQL conforme
mostra a figura.
O delimitador que indica o início de uma instrução SQL é comum à todas as linguagens. No
COBOL, o fim de um SQL é indicado pelo “END-EXEC”.
No PL1, o fim de um SQL é indicado por um “;”.
No FORTRAN o precompilador identifica o fim do SQL quando não mais encontrar o
caracter de continuação “X” na coluna 6 das linhas subsequentes à linha que começa com
“EXEC SQL”.
No ASSEMBLER, qualquer caracter diferente de branco na coluna 72 indica que a instrução
SQL continuará na linha seguinte.

571774784.doc 95 de 175
DB2

15.3 Variáveis Host

PARA FORNECER UM VALOR

COBOL
MOVE ‘C01’ TO DEPT.

DEPT

SQL
EXEC SQL ... WHERE DEPT =: DEPT END-EXEC.

15.3.1 Notas

Variáveis HOST são utilizadas para permuta de valores entre a linguagem SQL e a
linguagem de programação.
Uma das possíveis utilizações de variável HOST é a de fornecer um valor a uma instrução
SQL, tornando- assim uma instrução genérica.
O exemplo mostra um SQL com valor à variável HOST.
1. O programa atribui um valor à variável HOST.
2. O programa executa a instrução SQL onde a referência à variável HOST é substituída
pelo valor previamente atribuído.
A referência à variável HOST deve ser precedida pelo caracter “:”. Seu uso é facultativo
mas recomenda-se sua utilização para evitar possibilidades de confusão.
O uso da variável HOST é opcional. Seu uso é obrigatório somente para as instruções
SELECT.

571774784.doc 96 de 175
DB2

A variável HOST deve ser compatível com a coluna quanto ao seu data type e ao seu
tamanho.
Variáveis adicionais chamadas de variáveis indicadoras são necessárias quando a coluna
pode ter valor nulo. Serão apresentadas mais tarde.
As variáveis HOST não devem ser utilizadas para referenciar NOME de tabelas ou de
colunas.

PARA FORNECER UM VALOR


EXEC SQL INSERT INTO EMPR
( MATR, SOBRENOME )
VALUES ( :MATR, : SNOME)
END-EXEC.

MATR SNOME

EXEC SQL UPDATE EMPR


SET SALÁRIO = SALÁRIO * : PERCENT
WHERE CARGO =: CARGO
END-EXEC.

CARGO PERCENT

Variáveis HOST podem ser utilizadas para que o programa passe um valor para a
instrução SQL.

Para receber um valor

EXEC SQL

571774784.doc 97 de 175
DB2

SELECT MATR, SOBRENOME


INTO :MATR, : SNOME
FROM EMPR
WHERE CARGO := CARGO
END-EXEC.

Necessário em uma instrução SQL.


Uma VARIÁVEL HOST para cada COLUNA selecionada.
Precedidas por dois pontos em uma instrução SQL.
Declaração da variável host e data type da coluna devem ser compatíveis.
Variáveis adicionais necessárias para indicar valor NULO.

15.4 Estrutura

EXEC SQL
SELECT SOBRENOME, DEPT SNOME
INTO :SNOME, : DEPT
FROM EMPR DEPT
WHERE MATR = : MATR
END-EXEC. MATR

Alternativa em COBOL, PL/1 ou C


EXEC SQL Estrutura
SELECT SOBRENOME, DEPT
INTO : ESTRUTURA
FROM EMPR
WHERE MATR = : MATR MATR
END-EXEC.

571774784.doc 98 de 175
DB2

15.4.1 Notas

Uma série contígua de variáveis HOST podem ser agrupadas em um conjunto chamado de
estrutura. Esta estrutura pode ser referenciada e tratada como uma unidade conforme
mostra o exemplo.
Está técnica só é válida para o COBOL e PL/1.

15.5 Definição de variáveis HOST

Da do s Nu mé rico s:
DB2 PL/1 COBOL ASSEMBLER FORTRAN
DCL N1 BIN N1 DS H
Smallint 01 N1 PIC S9(4) COMP. INTEGER*2 N1
FIXED(15);
Integer or DCL N2 BIN N2 DS F
01 N2 PIC S9(9) COMP. INTEGER*4 N2
Int FIXED(31);
Decimal (5,2) DCL N3 DEC 01 N3 PIC S9(3)V9(2) N3 DC PL5
REAL*8 N3
Dec(5,2) FIXED(5,2); COMP-3. ‘000.00’
Float(21) or DCL N4 BIN REAL*4 or
01 N4 COMP-1. N4 DS E
Real FLOAT (21); REAL N4
Float or DCL N5 BIN REAL*8 N5 or
Float(53) or FLOAT(53); 01 N5 COMP-2. N5 DS D DOUBLE PRECISION
Double precision N5

15.5.1 Notas

Estas tabelas mostram as correspondências em data type que devem ser observadas na
declaração das variáveis HOST.
O programador pode usar o programa DCLGEN, para gerar variáveis HOST. Ver item
DCLGEN.

571774784.doc 99 de 175
DB2

Dad o s alf an u mé rico s:


DB2 CHAR( 1 0) VARCHAR( 8 0 )
01 STR2
COB OL 01 STR1 PI C X ( 10) . 49 STR2L PI C S9( 4) C OMP .
49 STR2C P IC X( 80) .
P L/I DC L STR1 C HAR( 10) . DC L STR2 C HAR( 80) V AR;
ASSE MB LE R STR1 DS C L 10 STR2 DS H, CL 80
FORTRAN C HARAC TE R* 10 STR1 C HARAC TE R* 80 STR2

Dou b le b yte cha ra cte r st rin g :


DB2 CHAR( 1 0) VARCHAR( 8 0 )
01 DB C 2
01 DB C 1 P I C G( 5) .
COB OL 49 DB C 2L P I C S9( 4) C OMP .
DI SPL AY- 1.
49 DB C 2L P I C G( 40) DI SP L AY- 1
DC L DB C 1
P L/I DC L DB C 2 GRAP HI C ( 40) V AR;
G RAP HI C ( 5) ;

Dad o s da te / t ime :
DB2 DATE TIME TIMESTAMP
COBOL 01 DT PIC X(10). 01 TM PIC X(8) 01 TS PIC X(26);
PL/I DCL DT CHAR(10). DCL TM CHAR(8); DCL TS CHAR(26);
ASSEMBLER DCL DT CHAR(10); TM DS CL8 TS DS CL26
FORTRAN CHARACTER*10 DT CHARACTER*8 TM CHARACTER*26 TS

Observação:
Dados DATE/TIME são sempre convertidos para o formato caracter no assinalamento às
variáveis host. Definições mostradas são para o padrão USA.
 Dat e
ISO : yyy-mm-dd
JIS : yyy-mm-dd
USA : mm/dd/yyyy
EUR : dd.mm.yyyy
 Ti me
ISO : hh.mm.ss
EUR : hh.mm.ss
JIS : hh.mm.ss
USA : hh:mm AM ou PM

571774784.doc 100 de 175


DB2

 Ti mest amp :
yyyy-mm-dd-hh.mm.ss.nnnnnn (26 caracteres)
15.6 Processamento de múltiplas linhas
OPEN
(SELECT)

MATR SOBRENOME
000030 KWAN
000290 PARKER
000300 SMITH MATR SNOME

FETCH
MATR SOBRENOME
000030 KWAN
000290 PARKER 000030 KWAN
000300 SMITH MATR SNOME

FETCH
MATR SOBRENOME
000030 KWAN
000290 PARKER 000290 PARKER
000300 SMITH MATR SNOME

15.6.1 Notas

Se o resultado de um SELECT pode ter múltiplas linhas, o programa deve trabalhar com um
CURSOR, pois não tem como prever o tamanho da tabela resultante.
Quando o programa executa um OPEN de um cursor, o DB2 executa o SELECT e a tabela
resultante fica presa, esperando pelo processamento.
O programa deve prover variáveis HOST para cada coluna do cursor.

571774784.doc 101 de 175


DB2

O programa executa a instrução SQL “FETCH”, para movimentar o cursor para o “próximo
registro”. As variáveis HOST conterão os valores do registro (linha) apontado.

15.7 SELECT com FETCH

 Defi ni r um cursor
EXEC SQL
DECLARE K9, CURSOR FOR
SELECT MATR, SOBRENOME
FROM EMPR
WHERE DEPT = : DEPT
END-EXEC.

 Abrir o cursor
EXEC SQL OPEN K9 END-EXEC,
 FETCH das linhas resultantes

EXEC SQL
FETCH K9 INTO :MATR, :SNOM END-EXEC.

 Close cursor quando terminar


EXEC SQL CLOSE K9 END-EXEC.

15.7.1 Notas

A instrução DECLARE CURSOR define a seleção dos dados que deverão compor a tabela
resultante. Um NOME deve ser atribuído à esta tabela, para futuras referências dentro do
programa.
A instrução DECLARE CURSOR não retorna nenhum valor ao programa. Isto é feito pela
instrução FETCH.
No nosso exemplo foi declarado um cursor definido como K9.

571774784.doc 102 de 175


DB2

A instrução OPEN executa a seleção, que está limitada pelos valores da variável HOST
DEPT. O cursor não está apontando para nenhuma linha.
O FETCH aponta para a primeira linha da tabela resultante. O programa lê o valor das
colunas através das variáveis MATR e SNOM.
Um programa típico emite FETCHs sucessivamente até receber o SQLCODE + 100 na SQLCA,
indicando fim da tabela resultante.
Um programa pode ter vários cursores abertos simultaneamente.
O cursor deve ser fechado com CLOSE quando não é mais necessário. Quando o programa
chega ao fim, o DB2 fecha todos os cursores que não foram fechados.

15.8 Delete via cursor

EXEC SQL DECLARE CE CURSOR FOR


SELECT ... FROM EMPR .... ;
:
:
EXEC SQL OPEN CE ;
:
:

EXEC SQL FETCH CE INTO ... ;


:
:
EXEC SQL DELETE FROM EMPR
WHERE CURRENT OF CE ;

:
:
EXEC SQL CLOSE CE ;

571774784.doc 103 de 175


DB2

15.8.1 Notas

Um programa tem a opção de eliminar algumas das linhas apontada pelo cursor.
A instrução DELETE, com a cláusula “WHERE CURRENT OF nome_do_cursor”, faz com que a
linha apontada pela última instrução FETCH seja eliminada.
A estrutura do programa exemplo foi preparada para eliminar linhas apontadas por um
cursor. Isto permite uma decisão pela eliminação ou não da linha pelo exame prévio do
conteúdo das mesmas.

 “DELETE WHERE CURRENT OF” não deve ser usado para o cursor cuja instrução
SELECT contém:
 ORDER BY
 GROUP BY
 DISTINCT
 UNION
 FUNÇÃO
 JOIN

15.9 Update via Cursor

EXEC SQL
DECLARE CX CURSOR FOR
SELECT MATR, SOBRENOME
FROM EMPR
WHERE DEPT = : DPT
FOR UPDATE OF SOBRNOME

571774784.doc 104 de 175


DB2

END-EXEC.
:
:
EXEC SQL OPEN CX END-EXEC.
FETCH CX INTO : MATR, :SNOME END-EXEC.
:
:
EXEC SQL UPDATE EMPR
SET SOBRENOME=:NOVOSN
WHERE CURRENT OF CX END-EXEC.
:
:
EXEC SQL CLOSE CX END-EXEC.

15.9.1 Notas
Um programa pode fazer a atualização de algumas linhas apontadas pelo cursor.
A atualização deve ser feita na linha que está sendo apontada pelo cursor especificado na
cláusula “WHERE CURRENT OF nome_do_cursor”.
Somente as colunas especificadas na cláusula “FOR UPDATE OF lista_de_colunas” da
instrução DECLARE podem ser atualizadas.
A atualização via cursor não é obrigatória.
A instrução DECLARE não pode ter a cláusula “FOR UPDATE OF”, se a instrução SELECT
contiver :
 ORDER BY
 GROUP BY
 DISTINCT
 UNION
 FUNÇÃO
 JOIN

571774784.doc 105 de 175


DB2

15.10 Manipulação de cursor

EXEC SQL DECLARE C72 CURSOR FOR


SELECT MATR, SOBRENOME FROM EMPR
WHERE DEPT = : DPT END-EXEC.

 Posicionamento
OPEN
....... ............
....... .............
....... .............

FETCH . . . FETCH .. .. . . FETCH .. ..


....... .............
....... .............
....... .............

CLOSE

 Para reutilizar um CURSOR


OPEN
....... ............. ........... .........
....... ............. ........... .........
....... ............. ........... ........
CURSOR NOMAL CURSOR HOLD

571774784.doc 106 de 175


DB2

15.10.1 Notas

OPEN posiciona o cursor “antes” da primeira linha da tabela resultante.


FETCH avança o cursor uma linha para frente.
Não é possível fazer o FETCH voltar o cursor .
CLOSE NÃO implica em COMMIT.
Um cursor normal pode ser reaberto mas a posição é restaurada para o topo. Se o cursor
for do tipo WITH HOLD o posicionamento não é perdido.
COMMIT fecha todos os cursores abertos e valida todas as atualizações feitas até então.

15.11 Cursor Hold

DECLARE nome do cursor


CURSOR FOR
WITH HOLD
Instrução SELECT
COMMIT não provoca perda de posição do cursor .

15.11.1 Notas

Muitas vezes é necessária a emissão freqüente de COMMITs em programas de longa


duração. As razões são o aumento da concorrência e a diminuição do tempo necessário em
eventuais recuperações.
A posição do cursor não é perdida se ela for definida como WITH HOLD. Este tipo de cursor
surgiu à partir do DB2 V2.3.
O CURSOR HOLD não pode ser utilizado numa aplicação projetada para a modalidade
pseudo conversacional do CICS.

571774784.doc 107 de 175


DB2

15.12 Commit / RollBack

 Commit
 Indica término bem sucedido e uma unidade de trabalho
 Alterações dos dados serão gravadas
 Todos os LOCKs serão liberados
 CURSOR fechado.

 Rollback
 Unidade de trabalho
 Atualização dos dados desde o último COMMIT são desfeitas
 Todos os PAGE LOCKS são liberados
 CURSOR fechado

15.13 Unidade de trabalho

COMMIT

500 500 400 500 400 600 400 600

CONTA CONTA A B
A B 100 100

t
PONTO DE Novo ponto de
CONSISTÊNCIA UPDATE A UPDATE B consistência

LUW
0 ROLLBACK

LUW
Abortada t

571774784.doc 108 de 175


DB2

15.13.1 Notas

Uma Logical Unit of Work (LUW) também é conhecida como Unit of Work ou Unit of
Recovery.
Alguns processamentos devem ser logicamente divididos em unidades de processamento ao
término da qual os dados estão consistentes. Estas duas unidades de processamento são
conhecidos como LUW.
No nosso exemplo os dados estão consistentes quando a transferência de fundos está
terminada. Se o processamento fosse interrompido antes do fundo ser adicionado na
segunda conta, teríamos uma situação de inconsistência de dados. Portanto este
processamento não pode ser dividido em mais que uma LUW.
Uma LUW não deve ser interrompida. No caso de interrupção do processamento, as
eventuais atualizações devem ser desfeitas.
Para o DB2 o final de uma LUW é chamada de COMMIT point. Esta situação é
estabelecida :
 Ao término normal do programa
 Com a execução de um comando dentro do programa
Uma LUW incompleta deve ser desfeita até o último COMMIT point. Este processamento é
conhecido como ROLLBACK.
O ROLLBACK é disparado :
 Ao término anormal do programa
 Com a execução de um comando dentro de um programa

571774784.doc 109 de 175


DB2

15.14 Commit / Rollback

COMMIT

TSO / BATCH IMS CICS


COMMIT Call CHKP Comando SYNCPOINT
Call SYNC Comando DLI TERM
GU IOPCB
(single mode)
Automaticamente ao término normal do programa

ROLLBACK

TSO / BATCH IMS CICS


ROLLBACK Call ROLL Comando SYNCPOINT
Call ROLB Com opção ROLLBACK
Automaticamente ao término anormal do programa

15.14.1 Notas

As tabelas mostram como são disparados o processamento de COMMIT ou de ROLLBACK.


A instrução SQL COMMIT ou ROLLBACK são válidos para programas que rodam sob TSO ou
em batch.
Sob IMS ou CICS, comandos ou call’s apropriados devem ser executados à partir das
aplicações. Para eles os checkpoints ou syncpoints indicam uma LUW completa.
O CICS ou IMS, como monitor de transações é que emitem a ordem para o DB2 executar um
COMMIT ou um ROLLBACK através de um protocolo chamado TWO PHASE COMMIT.

571774784.doc 110 de 175


DB2

15.15 Exemplo de reposicionamento (pré V2.3)

EXEC SQL DECLARE C1 CURSOR FOR


SELECT X, Y, Z FROM T1
WHERE X> : POSX Índice único sobre X
ORDER BY X ;
:
POSX = ‘ ‘ ; Inicialização
:
:
CONT = 0;
EXEC SQL OPEN C1 ; Posicionamento baseado em POSX
:
:
EXEC SQL FETCH C1 INTO :POSX, :Y, :Z;
:
atualiza ?

:s
EXEC SQL UPDATE T
SET Y=:YNOVO, Z=:ZNOVO Atualização
WHERE X= :POSX; de linha corrente
CONT = CONT + 1 ;
:
s CONT < LIM ?
:N
EXEC SQL COMMIT :

571774784.doc 111 de 175


DB2

15.15.1 Notas

O cursor C1 é declarado com a cláusula WHERE apontado uma ou mais colunas que não
podem ter valores duplicados. No nosso exemplo a coluna em questão é a X. Esta coluna
deve estar na lista do SELECT para que o seu valor seja armazenado na variável HOST.
A instrução SELECT contém a cláusula ORDER BY, pois a lógica de reposicionamento exige
que os dados estejam em uma ordem previsível.
Devido ao ORDER BY, a declaração do cursor não pode conter a cláusula FOR UPDATE OF e
a instrução UPDATE não pode conter a cláusula WHERE CURRENT OF.
Antes do cursor ser aberto, a variável host POSX deve ser inicializado. O contador CONT
também é inicializado.
O OPEN do cursor traz linhas com X maior que o valor POSX e classificadas pela coluna X.
O FETCH traz as linhas seqüencialmente para que o programa decida pela atualização ou
não.
Se uma atualização é requerida, um UPDATE é feito sobre aquela linha apontada pela
POSX. A POSX é sempre atualizada pelo último FETCH. Note que se a coluna X contiver
dados duplicados, o controle passa a ser falho.
Após o UPDATE, o programa deve incrementar o contador CONT.
No exemplo, a cada conjunto de linhas (variável LIM) atualizadas, um COMMIT é executado
e o contador é zerado.
Após a inicialização do contador, o programa reabre o cursor. A tabela resultante é
limitada para aquelas linhas que ainda não foram atualizadas graças à clausula WHERE
filtrando as linhas POSX.
Esta técnica aumenta o acesso à tabela e a classificação é repetida a cada OPEN. A
contrapartida é o aumento da concorrência e diminuição do tempo gasto com um eventual
ROLLBACK.

571774784.doc 112 de 175


DB2

15.16 SQL Communication Area (SQLCA)

 Fornece informação descrevendo o estado da última instrução SQL executada


 Checado pelo programa após cada chamada
 Obrigatório e deve ser rotulado como “SQLCA”
 Deve ser incorporada no programa com a instrução INCLUDE do precompilador.

EXEC SQL INCLUDE SQLCA END-EXEC.

1 5. 16 . 1 Not as

O DB2 passa as informações referentes à execução de uma instrução SQL em um bloco de


controle chamado SQLCA (SQL COMMUNICATION AREA).
O SQLCA é obrigatório e é rotulado como “SQLCA” dentro do programa.
O SQLCA deve ser verificado pelo programa para determinação do sucesso ou não da
última execução de uma instrução SQL.
A sua codificação pode ser incorporada ao programa pelo precompilador através da
codificação da instrução INCLUDE SQLCA.

571774784.doc 113 de 175


DB2

15.17 Formato SQLCA

SQLCA CHAR (8)


SQLCABC INTEGER
SQLCODE INTERGER
SQLLERRM VARCHAR (70)

SQLERRP CHAR (8)


SQLERRD(1) INTEGER
SQLERRD(2) INTEGER
SQLERRD(3) INTEGER
SQLERRD(4) INTEGER
SQLERRD(5) INTEGER
SQLERRD(6) INTEGER
SQLWARNO SQLWARN1 SQLWARN2 SQLWARN3
SQLWARN4 SQLWARN5 SQLWARN6 SQLWARN7
SQLWARN8 SQLWARN9 SQLWARNA SQLSTATE

15.17.1 Notas
SQLWARNx são todos CHAR(1)
Os nomes dos campos são para COBOL, PL/I e ASSEMBLER. São diferentes para o
FORTRAN. Veja Application Programming Guide.

15.18 Códigos SQLCA

CONDIÇÃO SQLCODE SQLWARN0 STATUS EXECUÇÃO


ERRO <0 FALHA
SATISFEITO, COM CONDIÇÃO
ADVERTÊNCIA > 0 mas não + 100 ‘W’
ESPECIAL
NÃO ACHADO + 100 DADOS (ADICIONAIS) NÃO
ENCONTRADOS
SUCESSO 0 ‘ ‘ SUCEDIDO

SQLERD(3)

571774784.doc 114 de 175


DB2

Indica quantidade de linhas atualizadas via INSERT, UPDATE ou DELET.

15.18.1 Notas

É no SQLCA que o programa deve verificar o valor do SQLCODE, que descreve o sucesso
ou insucesso da última execução da instrução SQL.
 Um valor negativo indica que uma condição de erro foi encontrada e a instrução não foi
executada.
 Um valor positivo e diferente de +100 indica que a instrução foi executada mas algumas
condições exigem atenção maior do programa.
 O valor + 100 significa que os dados não foram encontrados. Pode ser resultado de um
FETCH que atingiu o fim de uma tabela resultante ou de uma atualização que não
encontrou nenhuma linha em condições de ser atualizada.
 O valor zero significa execução bem sucedida.
O campo SQLWARN0 é usado em alguns casos de advertência. Devem ser examinados em
casos de SQLCODE positivos.
O terceiro campo do vetor de inteiros SQLERRD informa a quantidade de linhas afetadas
por uma requisição de alteração de dados (UPDATE, INSERT, DELETE).
 Exceção : deleção em massa de uma tabela contida em um tablespace segmentado.
Esta situação é detectada com SQLERRD(3) = -1.

571774784.doc 115 de 175


DB2

15.19 SQLSTATE

 Padroniza códigos de erro de diferentes produtos


 Baseado nas especificações da ANSI
 Tem 5 dígitos
 Agrupado por classes

15.19.1 Notas
Um SQLCODE pode corresponder a vários SQLSTATE.
Um SQLSTATE pode corresponder a vários SQLCODE.
O SQLCA contém um novo campo, SQLSTATE, que contém return codes padronizados para
um ambiente de processamento distribuído.
A informação neste campo pode ser útil para determinar o que aconteceu no
APPLICATION SERVER. Informações mais detalhadas podem ser obtidas se o SQLSTATE for
analisado em conjunto com o SQLCODE.

15.20 SQL Warning


Se SQLWARN0 contém :
‘ ‘ -- SQLWARN1-6 estão com branco
‘W’ – Um ou mais de SQLWARN1-6 está com ‘W’

SQLWARN1 – Valor da string truncado no assinalamento à variável host


SQLWARN2 – Valores nulos ignorados no cálculo de uma função de coluna
SQLWARN3 – Número de colunas maior que número de variáveis host
SQLWARN4 – Update ou delete sem a cláusula “WHERE”
SQLWARN5 – Instrução SQL/DS inválida no DB2

571774784.doc 116 de 175


DB2

SQLWARN6 – Correção de um valor date ou timestamp com valor inválido resultante de


uma operação aritmética.

15.20.1 Notas

SQLWARN é um valor de caracteres de 1 byte. Se o byte 0 contém um “W”, os bytes


seguintes também podem conter um “W”.
Se o byte 3 contém um “W”, não houve variáveis HOST suficientes para receber todos as
colunas que foram selecionadas. Por exemplo, um SELECT * pode ter sido executado em
uma tabela que teve uma coluna adicionada.
O byte 4 aplica-se ao SQL dinâmico. Adverte o usuário sobre a possibilidade de ser afetar
todas as linhas de uma tabela devido a um UPDATE ou DELETE sem a cláusula WHERE.
O byte 6 indica correção de situações em que o valor de uma data ou TIMESTAMP resulta
em um valor inválido após uma operação. Por exemplo, a adição de 1 MONTH a 30 de
janeiro resultará em 28 de fevereiro ao invés de 30 de fevereiro que é uma data inválida.

15.21 Variáveis indicadoras

EXEC SQL
SELECT CARGO, DEPT, FONE, NOME
INTO : CG : CGI, : DPT, : FON:FONI, : NOME
FROM EMPR
WHERE MATR = : ID
END-EXEC.

COLUNA CARGO VAR.HOST :CG VAR.IND. :CGI


“ANALISTA” “ANALISTA” 0
SELECT/FETCH
nulo inalterado -1
“GERENTE” nulo “GERENTE” 0
UPDATE/INSERT
inalterado -1

571774784.doc 117 de 175


DB2

15.21.1 Notas

SELECT ..... INTO :A:B

Se uma coluna selecionada permitir valor nulo, o DB2 irá requerer uma variável indicadora
para registrar uma eventual nulidade.
Uma variável indicadora é uma halfword(SMALLINT).
Uma variável indicadora deve ser especificada contiguamente à variável HOST
correspondente dentro de uma instrução SQL embutida.
Uma coluna que não aceita valor nulo não requer uma variável indicadora.
Se a coluna apresentar valor nulo em um SELECT ou FETCH, o DB2 atribuirá –1 à variável
indicadora e manterá inalterada a variável HOST.
Se um programa envolvendo UPDATE ou INSERT atribuir –1 à variável indicadora, o DB2
assumirá valor nulo para a coluna correspondente.

15.22 Vetor de variáveis indicadoras

Somente COBOL ou PL/I

EXEC SQL
SELECT CARGO, DEPT, FONE
INTO : ESTRUTURA:VETOR
FROM : EMPR
WHERE MATR = : ID
END-EXEC.

571774784.doc 118 de 175


DB2

ID ESTRUTURA VETOR

01 ESTRUTURA. 01IND-VETOR.
10 CG PIC... 10 VETOR
10 DPT PIC... PIC S9(4) COMP
10 FON PIC... OCCURS 3 TIMES.

15.22.1 Notas

Se as variáveis HOST estão arranjadas em uma estrutura e pelo menos um de seus


componentes trabalha com valor nulo, o programa deve trabalhar com um vetor de
variáveis indicadoras.
O vetor deve conter uma variável indicadora para cada componente da estrutura, inclusive
para aqueles que não trabalham com nulo. A partir do último componente que trabalha
com nulo não é mais necessário definir elementos para o vetor.
No nosso exemplo a 4ª coluna não trabalha com nulo e o nosso vetor não precisa de 4
indicadores.
A correspondência entre a estrutura e o vetor é posicional.
O vetor é uma múltipla ocorrência de variáveis halfword(SMALLINT).
A utilização do vetor de variáveis indicadoras vale somente para o COBOL e PL/1 que
aceitam trabalhar com estruturas.

571774784.doc 119 de 175


DB2

15.23 Uso de variáveis indicadoras

Var. IND INTERPRETAÇÃO


0 Var.HOST contém valor não nulo
-1 Coluna com valor nulo var.HOST inalterada
-2 Resultado nulo devido ao erro aritmético ou de conversão
N( > 0) String de “n” caracteres truncado no assinalamento à variável HOST

15.23.1 Notas

As variáveis indicadoras podem ser utilizadas em outras situações.


O valor zero indica variável HOST com valor não nulo.
-1 indica que a coluna tem ou deve assumir valor nulo variável HOST permanece
inalterado.
-2 aplica-se ao SELECT externo (subquery) ou ao FETCH. Indica que a coluna tem resultado
nulo e a variável HOST permanece inalterada. O teste de SQLCODE dá informações
adicionais:
 +304 indica erro de conversão. Por exemplo uma variável HOST não conseguiu
comportar um valor grande.
 +802 indica erro aritmético resultante de divisão por zero ou overflow.

Erros de conversão ou de aritmética resultam em SQLCODE –304 ou –802 na ausência da


variável indicadora.
“n” indica que uma variável HOST é pequena demais para conter um string de “n”
caracteres. Neste caso o string é truncado e o SQLWARN1 é setado para “W”.

571774784.doc 120 de 175


DB2

15.24 Auxílio na codificação

 Instrução WHENEVER
Manipulação de exceção
 DCLGEN
Definição de estrutura de tabela
 Instrução INCLUDE
Para embutir estrutura de tabela/SQLCA no programa
 DSNTIAR / DSNTIR
Rotina de formatação de mensagem de erro.

15.25 Instrução ‘WHENEVER’

EXEC SQL WHENEVER condição ação END-EXEC.

 Condições
SQLERROR
SQLWARNING
NOT FOUND
 Ações
GO TO X
Continue

571774784.doc 121 de 175


DB2

15.25.1 Notas

 Condições
SQLERROR
- SQLCODE negativo
SQLWARNING
- SQLCODE positivo (não + 100)
- Ou SQLWARN0 = “W”
NOT FOUND
- SQLCODE = +100
 Ações
GO TO X
- Controle transferido para a instrução rotulada com X
Continue
- Programa continua na próxima instrução
- Cancela afeito do WHENEVER anterior
Esta instrução testa o SQLCODE na SQLCA após cada execução de uma instrução
SQL e executa uma ação dependente do resultado.
Precompilador insere lógica de IF e GOTO após cada instrução SQL subsequente.
A instrução WHENEVER não é uma rotina de inicialização como o ON CONDITION
do PL/1. O precompilador insere a codificação equivalente após cada instrução
SQL do programa fonte.
Exemplo :
EXEC SQL WHENEVER SQLERROR GOTO ROTULOZ
A instrução acima faz o programa desviar para a rota rotulada por ROTULOZ em
caso de SQLCODE negativo.
O teste permanece ativo até redefinição ou cancelamento pela instrução
WHENEVER seguinte.
Os três testes podem estar ativados simultaneamente.

571774784.doc 122 de 175


DB2

15.26 Exemplo de WHENEVER

:
:
instrução SQL
:
:
EXEC SQL
WHENEVER SQLERROR GO TO A END-EXEC.
:
instrução SQL
IF SQLCODE < 0 A
:
instrução SQL
IF SQLCODE < 0 A
:
EXEC SQL
WHENEVER SQLWARNING GO TO W END-EXEC.
EXEC SQL
WHENEVER SQLERROR GO TO B END-EXEC.
:
instrução SQL
IF SQLCODE < 0 B
IF warning W
:
EXEC SQL
WHENEVER SQLERROR CONTINUE END-EXEC.
Instrução SQL
IF warning W

571774784.doc 123 de 175


DB2

15.27 DCLGEN

CATÁLOGO
DB2

DEFINIÇÃO
TABLE

DCLGEN

BIBLIOTECA

MEMBRO3
EXEC SQL
DECLARE TBL TABLE
(A ..., B ..) END-EXEC.
01 TBL,
10......
10......

15.27.1 Notas

O DCLGEN é um programa que para uma dada tabela, usa o catálogo do DB2 para
montar na biblioteca do usuário:
 Instrução SQL ‘DECLARE TABLE’
 Código de declarações das variáveis HOST (data structure)
Válido para COBOL, COBOL II, C OU PL/1

571774784.doc 124 de 175


DB2

A saída do DCLGEN é inteiramente gravada em um único membro de uma biblioteca.


Normalmente existe alguém responsável pela manutenção destas bibliotecas com as saídas
dos DCLGEN para as tabelas de DB2.

15.28 DCLGEN para COBOL

DB2 – DEFAULTS

1 DB2 NAME  (Subsystem identifier)


2 DB2 CONNECTION RETRIES  (How many retries dor DB2 connection)
3 APPLICATION LANGUAGE  (COBOL, COB2, C, FORT, ASM, ASMH, PL1)
4 LINES/PAGE OF LISTING  (A number from 0 to 999)

DCLGEN

Enter table name for which declarations are required :


1 SOURCE TABLE NAME  EMPR
2 AT LOCATION 
Enter destination data set : (Can be sequential or partitioned)
2 DATA SET NAME ...  ‘CEDB2xx.DB01.LIB(DCLEMPRE)’
3 DATA SET PASSWORD  (If password protected)
Enter options as desired :
4 ACTION.............. REPLACE (ADD new or REPLACE old declaration)
5 COLUMN LABEL.... NO (Enter YES for column label)
6 STRUCTURE NAME ... (Optional)
7 FIELD NAME PREFIX... (Optional)

571774784.doc 125 de 175


DB2

15.28.1 Notas

O DCLGEN pode ser chamado pela opção 2 do DB2I.


No painel do DCLGEN devemos fornecer os seguintes parâmetros :
1. NOME da tabela a partir da qual queremos gerar variáveis HOST.
2. NOME de um arquivo particionado e ser membro que deverá conter a saída do DCLGEN.
3. Password. Normalmente não utilizado
4. Determina se o conteúdo do membro será uma nova adição ou uma substituição e uma
declaração antiga.
5. Se YES, a saída conterá o label das colunas como comentário das declarações.
6. NOME da estrutura. O NOME default é “DCL_nome_da_tabela”.
7. Se omitido, as variáveis HOST terão o mesmo NOME das colunas. Se for fornecido, o
NOME da variável será o prefixo seguido de um número seqüencial.
Ex.: prefixo “X” gera variáveis X1,X2,X3, etc..
A linguagem na qual serão codificadas as variáveis HOST é fornecida no campo 3 da tela
do DB2I defaults (opção “D” do DB2I).

571774784.doc 126 de 175


DB2

15.29 Saída DCLGEN – Cobol

* DCLGEN TABLE(EMPR) *
* LIBRARY(CEDB2xx.DB01.LIB(DCLEMPR)) *
* ACTION(REPLACE) *
* APOST
*
* .......IS THE DCLGEN COMMAND THAT MADE THE FOLLOWING STATEMENTES *

SQL DECLARE (usado no precompile)

EXEC SQL DECLARE EMPR TABLE


( MATR CHAR(6) NOT NULL,
NOME VARCHAR(12) NOT NULL,
SOBRENOME VARCHAR(15) NOT NULL,
DEPT CHAR(3) NOT NULL,
FONE CHAR(4),
DATADIM DATE,
CARGO DECIMAL(3, 0),
NIVELED SMALLINT,
SEXO CHAR(1),
DATANAS DATE,
SALÁRIO DECIMAL(8, 2)
) END-EXEC.

* COBOL DECLARATION FOR TABLE EMPR *

571774784.doc 127 de 175


DB2

Estrutura COBOL para I/O de linhas de tabelas

1 DCLEMPR.
10 MATR PIC X(6).
10 NOME.
49 NOME-LEN PIC S9(4) USAGE COMP.
49 NOME-TEXT PIC X(12).
10 SOBRENOME.
49 SOBRENOME-LEN PIC S9(4) USAGE COMP.
49 SOBRENOME-TEXT PIC X(12).
10 DEPT PIC X(3).
10 FONE PIC X(4).
10 DATADIM PIC X(10).
10 CARGO PIC S999V USAGE COMP-3.
10 NIVELED PIC S9(4) USAGE COMP.
10 SEXO PIC X(1).
10 DATANAS PIC X(10).
10 SALÁRIO PIC S999999V99 USAGE COMP-3.

* THE NUMBER OF COLUMNS DESCRIBED BY THIS DECLARATION IS 12 *

15.29.1 Notas
Este é o resultado da execução do DCLGEN com as telas preenchidas conforme a página
anterior.
Na parte superior temos a instrução DECLARE com o nome das tabelas, colunas e seus data
types.
Notar que o nome da estrutura deriva do nome da tabela.
O NOME das variáveis são os nomes das colunas correspondentes.
As variáveis para colunas VARCHAR são subdivididas em dois componentes: comprimento e
texto.
Variáveis indicadoras não são geradas pelo DCLGEN.

571774784.doc 128 de 175


DB2

15.30 Descrição de tabela em SQL

EXEC SQL
DECLARE TBL TABLE
(A CHAR(3) NOT NULL,
B SMALLINT )
END-EXEC.

 Opcional
 Documentação
 Permite validação adicional pelo precompilador
- Nome de tabelas e colunas
- Data types

15.30.1 Notas

O precompilador examina a sintaxe de uma instrução SQL mas não verifica a existência ou
não dos objetos referenciados. O precompilador não consulta o catálogo.
Assim, uma instrução DECLARE TABLE, apesar de opcional, fornece subsídios ao
precompilador para que verifique a existência da tabela e a correspondência entre as
VARIÁVEIS HOST e respectivas colunas.
Mesmo que seja feita a opção pela utilização da instrução DECLARE TABLE, o BIND
trabalhará com o catálogo para verificação final.

571774784.doc 129 de 175


DB2

15.31 Instrução SQL include

MEMBRO3
EXEC SQL
DECLARE TBL TABLE
(A ..., B ..) END-EXEC.
01 TBL,
10......
10......

: :
EXEC SQL EXEC SQL
INCLUDE MEMBRO 3 DECLARE TBL TABLE
: (A . . , B ..) END-EXEC
01 TBL,
10 . . .
10 . . .
: :

EXEC SQL 01 SQLCA,


INCLUDE SQLCA 05 ... .
05 ....
:

571774784.doc 130 de 175


DB2

15.31.1 Notas
Quando o precompilador encontra uma instrução INCLUDE, faz a sua substituição pela saída
do DCLGEN.
O INCLUDE aponta para o membro que contém a saída do DCLGEN. O arquivo particionado
que contém o membro é fornecido pelo usuário na tela do PROGRAM PREPARATION ou pelo
cartão SYSLIB do JCL do precompilador.
A estrutura de uma SQLCA também pode ser incluída via INCLUDE. Como este bloco está
internamente embutido no DB2, não há necessidade de cópia a partir de uma biblioteca.

15.32 Formatação de mensagens de erro

DSNTIAR
 Duas rotinas na biblioteca de samples o DB2
COBOL
CALL DSNTIAR USING SALCA MESSAGE LRECL.
PL/1
CALL DSNTIAR (SQLCA, MESSAGE, LRECL);
ASSEMBLER
CALL DSNTIAR (SQLCA, MESSGE, LRECL)
DSNTIR
FORTRAN
CALL DSNTIR (MSGLEN, MESSAG, ICODE)

571774784.doc 131 de 175


DB2

15.32.1 Notas

Estas são rotinas que geram mensagens de acordo com o SQLCODE na SQLCA. As mensagens
geradas são como as do SPUFI.
O call do DSNTIAR em COBOL, PL/1 ou ASSEMBLER deve ter três parâmetros:
 SQLCA que contém o SQLCODE e os caracteres que devem ser inseridos no esqueleto da
mensagem correspondente.
Por exemplo deve ser fornecido o NOME da coluna e o NOME da tabela para ser inserida
no esqueleto da mensagem “there is no column named____in table_____.”
 Um número inteiro fornecendo o comprimento desejado para a linha da mensagem.
 A variável onde será colocada a mensagem formatada.
O call em FORTRAN é feito para a rotina DSNTIR.

571774784.doc 132 de 175


DB2

16.PREPARAÇÃO E EXECUÇÃO DE PROGRAMA

Código
Fonte com
SQL

Biblioteca
De include

PRECOMPILAÇÃO

Código DBRM
fonte (biblioteca
modificado de usuário) Catálogo DB2

Descrição da tabelas

COMPILAÇÃO BIND Autorização


DBRM

Módulo
Objeto Diretório DB2

Plano / Package

LINKEDIÇÃO

Módulo de
carga

Execução

Language
Interface

571774784.doc 133 de 175


DB2

16.1 Notas

A preparação de programa é o NOME que damos ao processo que torna um programa fonte
em um módulo de carga executável.
A preparação pode ser feita de várias maneiras :
 Com um job editado à partir da PROC do Program Preparation do DB2.
 Com um job montado pelo programa DSNH (opção 3 do DB2I)
 Interativamente com o programa DSNH
Em linhas gerais a preparação de um programa é constituído das seguintes fases :
 Precompilação
 Compilação e Linkedição
 BIND
O precompilador pode ser executado com o DB2 fora do ar. A sua função é gerar à partir do
fonte dois data sets selados com um timestamp. Os data sets gerados são :
 DBRM (Database Request Module)
Contém todas as instruções SQL embutidas no fonte.
 Fonte modificado
O fonte é copiado para este data set com modificações. As instruções SQL são
transformadas em comentários e os CALLs para o DB2 são inseridos logo a seguir.
Eventualmente códigos de definição de variáveis HOST são copiadas à partir de uma
biblioteca de INCLUDE (que foi gerada pelo DCLGEN por exemplo)
O precompilador faz a checagem da sintaxe das instruções SQL e da validade das variáveis
HOST utilizadas. Um relatório de execução com eventuais mensagens de erro também é
gerada.
O compilador gera o módulo objeto à partir do fonte modificado pelo precompilador. O
timestamp é copiado do fonte.

O linkage editor gera o módulo de carga à partir do módulo da linguagem de interface do


DB2. O timestamp original é copiado do módulo objeto.

571774784.doc 134 de 175


DB2

O processador de BIND gera o plano ou package à partir do DBRM. O timestamp é copiado


do DBRM.
Um plano ou package contém a estratégia de acesso aos dados DB2 com informações do
tipo:
 Índices utilizados
 Estratégia de locking
 Estratégia de execução de um JOIN
 Etc..
A fase de compilação/linkedição e a fase de BIND são executadas separadamente e podem
ser executadas em qualquer ordem.
Se outros preprocessadores forem necessários:
 PL/1 macro phase
 CICS preprocessor
Executar antes ou depois do precompilador. Se executado antes, serão geradas mensagens
de advertência que poderão ser ignoradas.

16.2 Precompilador

 Verifica a sintaxe das instruções SQL


 Inclui declaração de tabelas e declaração de variáveis HOST.
 Inclui SQLCA
 Cria fonte modificado com SQL traduzido. Cria um DBRM com os SQL copiados
 O catálogo não é acessado.

571774784.doc 135 de 175


DB2

16.2.1 Notas

O precompilador é executado independentemente do DB2. O DB2 não precisa estar no ar e


portanto não é feito a checagem com os dados do catálogo. Isto faz com que a carga do
desenvolvimento sobre o DB2 seja diminuída.
A instrução DECLARE TABLE é utilizada para verificação do NOME dos objetos, NOME das
colunas e a correspondência entre colunas e variáveis HOST.
Cria um arquivo com o fonte modificado.
 Instruções EXEC SQL transformadas em comentários
 Os comentários das instruções EXEC SQL são seguidos de CALL para o DB2
 Se existir uma instrução WHENEVER, será inserida uma lógica “IF...GOTO” logo após o
Call para o DB2.
 Com cópia da declaração das tabelas e das variáveis HOST conforme especificada na
instrução INCLUDE.
 Com cópia da estrutura da SQLCA, se assim especificado no INCLUDE
Cria um DBRM com as instruções SQL copiadas.

571774784.doc 136 de 175


DB2

16.3 Bind

BIND ADD REBIND BIND REPLACE

Adiciona Refaz plano Refaz plano


Plano novo (ambiente alterado) (SQL alterado)

OTIMIZADOR

DBRM
DBRM
PLANO
PACK.

Catálogo
Diretório

16.3.1 Notas

O propósito do BIND é a geração do PLANO ou de um PACKAGE. À partir do DBRM e do


catálogo são executados os seguintes procedimentos :
 Checagem da consistência das instruções SQL com os objetos manipulados. São
checados nomes, data type das colunas, etc..
 Checagem da autorização necessária para a execução das instruções SQL
 Determinação da estratégia de acesso aos objetos de manipulação, pelo otimizador do
DB2.
 O plano ou o package é armazenado no diretório e uma cópia do DBRM é carregado no
catálogo.
 BIND ADD
Utilizado para criar um novo plano / package.

571774784.doc 137 de 175


DB2

 BIND REPLACE
Utilizado quando a própria instrução SQL foi alterada e queremos refazer o plano ou o
package existente.
 REBIND
Utilizado quando o SQL permanece inalterado mas queremos refletir uma modificação
ocorrida no ambiente tais como criação / eliminação de índice ou atualização das
estatísticas do catálogo.
O otimizador do DB2 pesa fatores como CPU e I/O para elaborar uma estratégia de acesso.7

16.4 Estratégia de acesso

SELECT * FROM EMPR WHERE SEXO = ‘F’ AND


(CARGO = ‘ANALISTA’ OR SALÁRIO > 1000) AND DEPT IN (‘E11’, ‘D14’)

 Índices disponíveis ?
 Número de páginas lidas se tablespace varrido ?
 Número de páginas lidas se utilizado índice ?
 Melhor ordem de execução dos testes ?

16.4.1 Notas

A estratégia de acesso de uma instrução SQL é determinada pela otimizador do DB2.


O otimizador procura a melhor opção de acesso para minimizar o consumo de recursos e
I/O é de CPU.
O otimizador se baseia nas informações estatísticas contidas no catálogo. Tais informações
são atualizadas pelo utilitário RUNSTATS.

571774784.doc 138 de 175


DB2

16.5 Painel de BIND

BIND
Enter DBRM data set name(s) :
1 LIBRARY(S)  DB01.DBRM
2 MEMBER(S)  DB01PGxx
3 PASSWORD(S) 

4 MORE DBRMS ?  NO

Enter options as desired :


5 PLAN NAME .................................... DB01PGxx (Required to create plan)
6 ACTION ON PLAN............................ REPLACE (REPLACE or ADD)
7 Retain execution authority ................ YES (YES to retain user list)
8 ISOLATION LEVEL........................... CS (RR or CS)
9 PLAN VALIDATION TIME .................. BIND (RUN or BIND)
10 RESOURCE ACQUISITION TIME.....  USE (USE or ALLOCATE)
11 RESOURCE RELEASE TIME............ USE (USE or DEALLOCATE)
12 EXPLAIN PATH SELECTION............ NO (NO or YES)
13 OWNER OF PLAN (AUTHID)............ (blank for your primary ID)
14 DEFER PREPARE......................... NO (NO or YES)

PRESS : ENTER to process END to exit HELP for more information

Especifique opções de BIND e tecle


Enter

571774784.doc 139 de 175


DB2

16.5.1 Notas

 Campos 1,2,3 e 4:
Cada execução do precompilador resulta em um módulo de programa e um DBRM. Se
na linkedição é feita a combinação de múltiplos módulos em único módulo, haverá
necessidades do BIND combinas os múltiplos DBRMs em um único plano. Assim, os
DBRMs de entrada do BIND podem ser simples ou múltiplos.
 Campo 5:
Não obrigatório, mas é recomendado que o NOME do plano tenha o mesmo NOME do
programa a qual está associado.
 Campo 6:
ADD ou REPLACE especifica se o plano já existe no diretório. E o parâmetro que
determina ser será executado um BIND ADD ou um BIND REPLACE.
 Campo 7:
Determina para o plano que sofrerá um bind replace se a lista de auth-ids autorizados a
executar ou fazer bind deve ser mantida ou não.
Esta preocupação só existe no caso de BIND REPLACE onde o plano antigo é totalmente
descartado.
 Campo 8:
Determina qual deve ser a duração de um lock em nível de página em caso de leitura. A
opção CS dá mais concorrência.

571774784.doc 140 de 175


DB2

 Campo 9:
Toda instrução SQL deve ser validada em algum instante no processo de BIND. Este
parâmetro determina se a validação total de todas as instruções SQL deve ser feita no
instante do BIND ou no instante da execução (RUN).
Um exemplo de programa que requer VALIDATE (RUN) seria aquele em que durante a
sua execução cria uma tabela temporária.
Este programa não poderia ser validado em tempo de BIND pois a tabela temporária que
está sendo referenciada não existe no catálogo e passará a existir somente durante a
execução.
Um plano gerado com VALIDATE (RUN) é parcial, e é completado durante a execução do
programa.
 Campo 10:
Especifica se o lock em nível de tablespace deve ser adquirido no instante da alocação
do plano ou se no instante na primeira referência.
 Campo 11:
Especifica se o lock no tablespace deve ser liberado ao término do programa
(DEALLOCATE) ou quando o programa emitir um COMMIT.
Combinações possíveis para os campos 10 e 11:
- ALLOCATE/DEALLOCATE
- USE/DEALLOCATE
- USE/COMMIT
 Campo 12:
Especifica se a estratégia de acesso deve ser explicada via instrução EXPLAIN.
 Campo 13:
Especifica o proprietário do plano. A contabilização é feita para o auth-id especificado
neste campo. O auth-id deve estar devidamente autorizado a executar todas as
instruções SQL do programa.

571774784.doc 141 de 175


DB2

Considerações :
Dê preferência ao ISOLATION(CS) para permitir maior concorrência.
Utilize o RR somente quando a lógica do programa assim o exigir. Isto pode aumentar muito
a carga do DB2 com a atividade de locking. Uma alternativa seria a utilização da instrução
LOCK TABLE que força locking em nível de tabela ou de tablespace durante a execução do
programa.
A combinação USE/COMMIT eleva o nível de concorrência mas por outro lado aumenta o
risco do programa sofrer problemas de deadlocks ou de timeouts (-911 ou –904). Um
programa com plano gerado com estes parâmetros deve estar preparado para lidar com
estas situações.
VALIDATE(RUN) faz com que a validação seja repetida a cada execução do programa.
Portanto deve ser utilizado somente quando necessário.
Faça o BIND e REBIND num horário de baixa atividade pois além do plano ficar disponível
para os usuários, o catálogo e o diretório são exigidos intensamente.

16.6 Execução de programa

CICS, IMS, DB2


TSO, BATCH

PROGRAMA CALL PLANO /


package

RELATÓRIO VSAM TABELAS DB2

571774784.doc 142 de 175


DB2

16.6.1Notas

O programa é executado no address space do usuário enquanto o plano é executado no


address space do DB2.
O acesso as tabelas são feitos através de CALL’s para o DB2.
Para impedir que eventualmente um programa venha a utilizar um plano que não lhe
pertence, o DB2 checa se os timestamps do módulo de carga e do plano são iguais. O
programa não é executado se não forem coincidentes.
O DB2 V2.3 suporta também versões diferentes de packages. Podemos Ter vários packages
com NOME iguais mas de versões diferentes. Basta para isto que as diferentes versões
estejam na lista do plano. Assim de acordo com a versão do programa que esta em
execução, e carregado o package correspondente.

17. LOCKING

17.1 Propósito
Indica dado em uso

LOCK

Ap.B

571774784.doc 143 de 175


DB2

Ap.A

17.1.1 Notas
O propósito do mecanismo de LOCKING é administrar os múltiplos acessos aos dados do DB2
para que os dados sejam acessados e atualizados de forma organizada evitando
inconsistência.
Qualquer tipo de acesso aos dados DB2 passam pelo mecanismo de locking, garantindo
proteção contra:
 Acesso a um dado com alteração não validada
 Atualização de um dado em uso.
Um lock tem três características
 Modo
 Granularidade
 Duração

571774784.doc 144 de 175


DB2

17.2 Modo

S FILA

S: Compartilhado para leitura


U: Update
X: Exclusivo

571774784.doc 145 de 175


DB2

17.2.1 Notas

Entenda-se modo de LOCKING como modalidade quanto a exclusividade sobre um recurso


que pode ser :
 S (shared)
Compartilhado. O dado está em uso para leitura por um ou mais usuários.
 X (exclusivo)
Exclusivo. O dado está em uso dedicado para um único usuário e os demais interessados
ficam enfileirados.
 U (update)
O dado está sendo usado por um usuário com intenção de atualizar. O DB2 aceita
compartilhado de leitura (lock S) enquanto o usuário não resolver atualizar. Se o usuário
decidir pela atualização, ocorrerá espera pelo término do serviço dos demais usuários, e
enfileiramento de novos usuários querendo acessar os dados para que o lock “U” seja
elevado para lock “X” .

571774784.doc 146 de 175


DB2

17.3 Granularidade

Linha / página

LOCK

LOCK

Tabela / tablespace

LOCK

17.3.1 Granularidade

A granularidade do locking indica o tamanho dos recursos que estão sendo presos.
O LOCK pode ser dado :
 Individualmente à linhas ou páginas
 Á todos os segmentos de uma tabela de um tablespace segmentado.

571774784.doc 147 de 175


DB2

 Individualmente a um tablespace.
Lock em nível de páginas exige mais atividade da parte do DB2 mas oferece maior
concorrência e throughput.
A granularidade é um dos parâmetros de um tablespace durante a sua definição.
O parâmetro de granularidade pode ser alterado em algumas situações :
 Emissão do comando LOCK TABLE pelo usuário
 O DB2 pode elevar o nível de lock se o overhead de processamento devido ao locking em
nível de página ultrapassar o limite da instalação (parâmetro de geração do DB2)
LOCK em nível de tabela/tablespace é menos trabalhoso para o DB2 mas pode ocorrer um
maior enfileiramento pela espera de recursos.

17.4 Duração

LOCK EM TABELA OU TABLESPACE

ALLOCATE
DEALLOCATE

USE
DEALLOCATE

USE
COMMIT
t
INÍCIO UPDATE COMMIT FIM

571774784.doc 148 de 175


DB2

17.4.1 Notas

A informação sobre a duração do LOCK fica armazenada no plano ou package da aplicação.


Para lock em nível de tabela/tablespace temos três estratégias:
 ALLOCATE / DEALLOCATE
O lock é adquirido quando o plano é alocado e só é liberado quando o programa
termina.
 USE / DEALLOCATE
O lock é adquirido somente quando a tabela é referenciada e a liberação se dá quando
o programa termina.
 USE / COMMIT
O lock é adquirido somente quando a tabela é referenciada pelo programa e a liberação
se dá quando um COMMIT é executado.
O COMMIT é uma instrução SQL. Quando executada, valida as atualizações feitas até então.

LOCK EM PÁGINA

CS

RR

t
SELECT UPDATE SELECT COMMIT
PG1 PG4 PG2
Para LOCK em nível de página, temos duas estratégias possíveis :

571774784.doc 149 de 175


DB2

 RR
Repeatable Read. Os LOCKs são adquiridos conforme as páginas vão sendo acessadas e
são liberadas só com um COMMIT.
O RR só deve ser escolhido em situações especiais, já que as páginas ficam presas por
muito tempo. O NOME vem do fato de que nos casos de repetição de leitura temos a
garantia de que ninguém atualizou o dado.
 CS
Cursos Stability. Os locks do tipo “S” são adquiridos conforme a necessidade e liberados
quando o programa lê outra página.
Quanto aos locks do tipo “X”, não há diferença com o RR, onde a liberação ocorre
somente com o COMMIT.
O nome justifica-se pelo fato das páginas estarem com os dados íntegros enquanto
estão sendo acessados.

571774784.doc 150 de 175


DB2

18 SEGURANÇA

18.1 Segurança externa do DB2

Usuário

R
R IMS
A
A CICS
C TSO
C DB2
F
F BATCH

RACF

VSAM

Database

571774784.doc 151 de 175


DB2

18.1.1 Segurança externa do DB2

O acesso ao DB2 pode ser controlado pelo RACF ou por um outro software de segurança.
Esse controle é opcional e controla somente a possibilidade de um usuário poder ou não se
comunicar como o DB2. O controle do acesso aos dados é feito internamente pelo próprio
DB2 e não depende de nenhum software externo a si mesmo.
O RACF pode também controlar o acesso a data sets, podendo por exemplo permitir que
somente o DB2 tenha acesso aos data sets que representam os table spaces do DB2. Com
isso impede-se que alguém danifique ou altere dados nas tabelas quando o DB2 não estiver
ativo.
Para as instalações que não possuem o RACF é possível utilizar o mecanismo de passwords,
já que os tablespaces sempre utilizam data sets VSAM.

18.2 Segurança interna do DB2

AUTORIZAÇÃO

AUTH-ID X PRIVILÉGIO X RECURSO

18.2.1 Notas

A segurança interna do DB2 pode ser ativada ou não durante a geração.


Qualquer atividade DB2 deve estar autorizada se a segurança interna estive ativa.
(Exceção : CREATE SYNONYM)
Quando existe uma solicitação de atividade, o DB2 verifica três fatores.
 AUTH-ID : quem fez a solicitação ?
 Privilégio : O que se deseja fazer com o recurso ?

571774784.doc 152 de 175


DB2

 Recurso : Qual é o objeto de manipulação ?

Estas informações ficam armazenadas no catálogo.


Auth-id representa um usuário ou um grupo de usuários e é informado ao DB2 através do
monitor de transações.

18.3 Recursos e privilégios

TABELA SELECT
VIEW UPDATE (lista de colunas)
INSERT
:

BIND
PLANO
EXECUTE
PACKAGES

STOGROUP
BUFFERPOOL
TABLESPACE USE

SYSADM
DB2 RECOVER
TRACE
:

DATABASE DBADM
CREATETS
LOAD
:

571774784.doc 153 de 175


DB2

18.3.1 Recursos DB2


Podemos proteger :
 OBJETOS
Tabela, view
 PLANOS / PACKAGES
Programa, QMF, SPUFI
 COMANDOS DB2
-BIND, -DISPLAY
 UTILITÁRIOS DB2
LOAD, RECOVER
 RECURSOS DO SISTEMA
BUFFER, STORAGE GROUP

571774784.doc 154 de 175


DB2

18.3.1.1 Funções Administrativas

Install SYSADM
SYSADM
SYSCTRL

DBADM

DBCTL
Install SYSOPR
DBMAINT
SYSOPR

 Funções administrativas são conjuntos de privilégios

18.3.1.1 Notas

Para facilitar a administração de segurança em um ambiente DB2, existem algumas funções


administrativas.
Estas funções são conjuntos de privilégios que podem ser atribuídos, a um usuário ou a um
grupo de usuários.
A figura representa estas funções administrativas e mostra que elas são conjuntos contidos
em outros conjuntos.
Por exemplo, o conjunto de privilégios do SYSCTRL é subconjunto dos privilégios de
SYSADM.

571774784.doc 155 de 175


DB2

Funções administrativas
 SYSADM
Autoridade máxima dentro de um ambiente DB2.
 SYSCTRL
Pode ser definido como um SYSADM sem o privilégio de SELECT.
 DBADM
Autoridade máxima sobre um determinado Database

18.4 Atribuição de autoridade


Instrução SQL

GRANT Privilégio
+ + TO + AUTH-ID
Sobre
recursos

Privilégio
REVOKE + + FROM + AUTH-ID
sobre
recurso

Ex: GRANT SELECT ON EMPR TO PUBLIC

18.4.1 Notas

A instrução GRANT é utilizada par conceder privilégios sobre recursos DB2 para usuários ou
grupo de usuários.
Os privilégios são permanentes até que sejam revogados com uma instrução REVOKE.

571774784.doc 156 de 175


DB2

18.5 Atribuição de autoridade

Primary
Auth.id
DB2
CICS
IMS Auth.id
BATCH
TSO Lista
RACF Second.
Auth.id

18.5.1 Notas

 Authorizations id representa um usuário ou um grupo de usuários e é fornecido pelos


attachments (CICS, IMS, BATCH, TSO).
 Um usuário (PRIMARY AUTH-ID) pode pertencer à vários grupos de usuários. A lista de
grupos às quais ele pertence é obtido por uma rotina de exit que acessa o software de
segurança (RACF por exemplo).

571774784.doc 157 de 175


DB2

18.6 Secondary auth-id

Sec. Auth id
Desenvolvimento
Desenvolvimento Sistema NF
Sistema FP

Priv. grupo
Priv. grupo

Prim. Auth id

ZE C B
F A ZE B

Remove connect

18.6.1 Notas

Um privilégio pode ser atribuído a um indivíduo ou a um grupo.


Uma primary auth-id herda todos os privilégios do grupo à qual pertence.
Secondary authorization id é a identificação do grupo na qual pertence uma primary
authorization id.
Esta facilidade diminui muito o serviço de manutenção de privilégios concedidos.
A remoção de um indivíduo de um grupo faz com que perca também todos os privilégios do
grupo. Analogamente a inclusão de um indivíduo em um grupo faz com que se herde
automaticamente todos os privilégios do grupo.
A remoção/inclusão de um indivíduo em um grupo é feito através de simples emissão de
comandos REMOVE / CONNECT do RACF.

571774784.doc 158 de 175


DB2

18.7 Auditoria

Eventos auditáveis

 Acesso / modificação de dados


 Acesso recusado pela segurança
 CREATE / DROP de tabelas
 GRANT / REVOKE de privilégios
 Mudança de auth-id
 Acesso aos dados via utilitários

18.7.1 Notas

Alguns eventos podem ser auditados em um ambiente DB2.


Tais eventos são gravados quando o trace correspondente é ativado. Os registros são
colocados em datasets do SMF, GTF ou IFI.

571774784.doc 159 de 175


DB2

19 BANCO DE DADOS DE CONTROLE

19.1 Tabelas do DB2

Suporte DB2
Usuário autorizado
SQL

`DB2

Diretório Catálogo CDB

DADOS DE
PLANOS ACESSO AO DB
PACKAGES DEFINIÇÃO DE REMOTO
UTILITÁRIOS OBJETOS
ESTRUTURA AUTORIZAÇÃO
DE DB’s ESTATÍSTICA
RECUPERAÇÃO

571774784.doc 160 de 175


DB2

19.1.1 Notas

O DB2 possui banco de dados para controle do seu ambiente.


Faz parte da tarefa do analista de suporte do DB2 analisar as tabelas destes bancos de
dados.
São três os bancos de dados :
 CATÁLOGO
Pode ser pesquisado por usuários autorizados
O acesso ao catálogo pode ser feito através do CV (Catalog Visibility) ou através de
instruções SQL.
 DIRETÓRIO
Não pode ser pesquisado através de instrução SQL.
 CDB (Communication Data Base)
A manutenção é feita através de instruções SQL.

20 UTILITÁRIOS DB2

 Execução em BATCH

 Divididos em 3 grandes grupos:

 Online (requerem autorização)

LOAD COPY REPAIR


CHECK INDEX MERGECOPY DIAGNOSE
CHECK DATA RECOVER
QUIESCE
REPORT
REORG MODIFY
RUNSTATS
STOSPACE

571774784.doc 161 de 175


DB2

 Offline
 Service aids

20.1 Notas

Os utilitários são sempre executados via submissão de jobs batch. Como esses jobs nunca
precisam especificar os data sets onde as tabelas ficam armazenadas, o mesmo job pode
servir para muitos usos, desde que altere a especificação da função a ser executada pelo
utilitário.
Os utilitários online são aqueles que exigem a presença do DB2.
Os utilitários offline são aqueles que somente executam quando o DB2 está fora do ar.
Os service aids executam funções especiais e não se comunicam com o DB2.
Além dos utilitários, na biblioteca de samples existem programas que executam algumas
funções de outros possíveis utilitários. Esses programas são fornecidos em módulo fonte
como exemplo de codificação.

571774784.doc 162 de 175


DB2

20.2 Utilitário Load


SQL/DS
DXT
PROGRAMA

ARQUIVO SEQUENCIAL

DB2 LOAD

TAB LE S PA CE

TAB EL A A

TAB EL A B

571774784.doc 163 de 175


DB2

20.2.1 Notas

Uma das alternativas para a carga maciça de dados em DB2 é o utilitário LOAD que carrega
tabelas DB2 a partir de uma arquivo seqüencial.
O arquivo seqüencial poderá ser produzido pelo SQL/DB2, DXT ou um programa do usuário.
O LOAD, como todos os utilitários DB2, trabalha com tablespaces. Assim, ele pode carregar
simultaneamente várias tabelas DB2 desde que pertençam à um mesmo tablespace.
Enquanto uma tabela é carregada, os dados das tabelas residentes no mesmo tablespace
ficam indisponíveis.

20.3 Exemplo de Load

LOAD DATA

INTO TABLE EMPREGADO nome da tabela

WHEN ( 1 : 1) = ‘*’ condição de carga

( MATRÍCULA POSITION (2:6) ,


NOME POSITION (8 : 6 ) CHAR,
: :

: : ) tipo de dado

nome das colunas posição final

posição inicial

571774784.doc 164 de 175


DB2

20.3.1 Notas

O exemplo mostra a instrução LOAD para a carga da tabela EMPREGADO a partir de um


arquivo seqüencial.
A instrução deve estar contida no dataset apontado pelo cartão SYSIN.
A cláusula WHEN especifica que a carga de um registro só deve ser feita se da posição 1 até
a posição 1 for encontrado um asterisco.
A coluna MATRÍCULA será preenchida com o conteúdo das posições 2 a 6 do registro. Como
o formato do dado de entrada não foi especificado, ele será considerado idêntico ao da
coluna da tabela onde vai ser armazenado.
A coluna NOME é do tipo VARCHAR. Os dois primeiros bytes de uma coluna VARCHAR
contém o tamanho. O campo de entrada está sendo especificado como CHAR e portanto
não contém o tamanho. Neste caso embora a coluna NOME da tabela tenha tamanho
variável, ela terá sempre o tamanho fixo de nove bytes.

20.4 Preparando JCL para utilitário

DB2 Utilities

Select from the following:

1 Function EditJCL (Submit job, EDITJCL, Display, Terminate)

2 Job Id LOADxx (A unique job indentifier string)

3 Utility LOAD (Check, Check Data, Copy, Diagnose, Load, Merge, Modify, Quiesce,
Recover Index, Recover Tablespace, Reorg Index, Reorg Tablespace,
Report, Repair, Runstats, Stospace)

4 Control Cards Data Set ‘CEDB2xx.DB01.LIB(LOADCMD)’


5 RECDSN (LOAD,
Reorg Tablespace ‘CEDB2xx.Seq’

6 DISCDSN (LOAD)

7 COPYDSN (COPY, MERGECOPY)

To RESTART a utility, spececify starting point, otherwise enter NO.

571774784.doc 165 de 175


DB2

8 RESTART NO (NO, AT CURRENT position, or beginning of PHASE

PRESS: ENTER to process END TO EXIT HELP for more information

20.4.1 Notas

Os jobs de utilitários do DB2 podem ser preparados pelo programa DSNU, que pode ser
chamado à partir do DB2 (opção 8).
No painel do DB2 Utilities podemos entrar com os seguintes valores:
1. EDITJCL especifica que queremos um JCL editado.
2. Identificador do utilitário. Se por algum problema a execução apresentar problemas,
podemos examinar ou abortar o utilitário através deste identificador.
3. Especifica o utilitário (LOAD, REORG, RUNSTATS, etc.)
4. Data set contendo a instrução do utilitário.
5. Data set seqüencial de entrada para o LOAD, ou de saída para o REORG.
6. Data set para receber os registros rejeitados pelo LOAD.
7. Data set de saída do COPY ou do MERGECOPY.
8. Ignore se a opção no campo 1 for EDITJCL.
Preenchido o painel, o DSNU edita um JCL, para o utilitário em questão, com todos os
cartões necessários e o armazena num data set.
A equipe de suporte pode montar uma biblioteca de utilitários com esta ferramenta.

21. CONSIDERAÇÕES SOBRE A PROGRAMAÇÃO

 Ev i t ar co nv er sõ es de dado s
 Definir campos com os mesmos formato de colunas.
 Definir campos com mesmo tamanho de colunas.
 Usar definições produzidas por DCLGEN.
 Seleci o nar so ment e as co lunas necessár i as
 Cada coluna transferida consome CPU adicional.
 Use Select * somente quando necessário.

571774784.doc 166 de 175


DB2

 RE COM E N DAÇÕE S CODI FI CAÇÃ O DM L

21.1 Notas

Uma das fontes de desperdício de CPU localiza-se na conversão desnecessária de dados. Se


o programador define uma área interna no programa como um campo compactado e a
coluna a ser recebida nesse campo tem o formato binário por exemplo, então o DB2 com o
tamanho diferente da coluna também geram processamento adicional por parte do DB2. Se
a definição dos dados dentro do programa for produzida utilizando-se o DCLGEN, tem-se o
duplo benefício de economia na codificação e evita-se a conversão de dados, já que a
definições produzidas pelo DCLGEN utilizarão sempre os formatos definidos na tabela.
O SELECT * não deve ser utilizado indiscriminadamente, pois transfere todas as colunas da
tabela mesmo quando nem todas são necessárias, provocando processamento adicional
desnecessário. Além disso colunas novas podem ser adicionadas na tabela e no caso do
SELECT* pode ser necessária a alteração da definição da Ioarea do programa para receber
as novas colunas.

 Evitar subquery correlacionado

SELECT MATR, SOBRENOME FROM EMPR E, PROJETO P


WHERE E.DEPT=P.DEPT AND MATR=RESP

É mais eficiente que

SELECT MATR, SOBRENOME FROM EMPR E


WHERE DEPT=(SELECT DEPT FROM PROJETO WHERE RESP=E.MATR)

571774784.doc 167 de 175


DB2

Em muitos casos o join é mais eficiente que o subquery. O subquery correlacionado


geralmente perde em eficiência.

 Usar o ORDER BY somente quando necessário


 CPU adicional
 I/O adicional no DB de trabalho.
 Considere o sort externo no lugar de ORDER BY
Para resultados com mais de 1.000.000 linhas.

21.2 Explain

 Informa a estratégia de execução de uma instrução SQL, indicando:


 Caminho escolhido
 Índices utilizados
 Sorts requeridos
 Estratégia de locking

571774784.doc 168 de 175


DB2

SELECT MATR, SOBRENOME FROM EMPR

WHERE........AND.....................AND...............

EX PL A I N

........ . ............. . . .. ..
... .... .
........ . ............. . . .. ..
... .... .
........ . ............. . . .. ..
... .... .

Instrução SQL ou opção de BIND PLAN_TABLE

21.2.1 Notas
O EXPLAIN pode ser executado como uma simples instrução SQL ou pode ser executado de
forma indireta quando um plano é gerado.
Pode ser uma ferramenta do DBA para determinar
 Necessidades de índices
 Problema de estratégia inadequada de locking.
Pode ser ferramenta do programador para:
 Testar alternativas de estratégias.
 Verificar a eficiência de uma instrução SQL.

571774784.doc 169 de 175


DB2

21.3 Tabela PLAN_TABLE

Cada usuário deve ter a sua

CREAT TABLE PLAN_TABLE


( QUERYNO INTEGER NOT NULL,
QBLOCKNO SMALLINT NOT NULL,
APPLNAME CHAR (8) NOT NULL,
PROGNAME CHAR (8) NOT NULL,
PLANNO SMALLINT NOT NULL,
METHOD SMALLINT NOT NULL,
CREATOR CHAR (8) NOT NULL,
TNAME CHAR (8) NOT NULL,
TABNO SMALLINT NOT NULL,
ACCESSTYPE CHAR (2) NOT NULL,
MATCHCOLS SMALLINT NOT NULL,
ACCESSCREATOR CHAR (8) NOT NULL,
INDEXONLY CHAR (1) NOT NULL,
SORTN_UNIQ CHAR (1) NOT NULL,
SORTN_JOIN CHAR (1) NOT NULL,
SORTN_ORDERBY CHAR (1) NOT NULL,
SORTN_GROUPBY CHAR (1) NOT NULL,
SORTC_UNIQ CHAR (1) NOT NULL,
SORTC_JOIN CHAR (1) NOT NULL,
SORTC_ORDERBY CHAR (1) NOT NULL,
SORTC_GROUP CHAR (1) NOT NULL,
TSLOCMODE CHAR (3) NOT NULL,
TIMESTAMP CHAR (16) NOT NULL,
REMARKS VARCHAR (254) NOT NULL,
PREFETCH CHAR (1) NOT NULL WITH DEFAULT
COLUMN_FN_EVAL CHAR (1) NOT NULL WITH DEFAULT
MIXOPSEQ SMALLINT NOT NULL WITH DEFAULT
In dbname.tsname;

571774784.doc 170 de 175


DB2

21.3.1 Notas

 Q UE RYN O
É um número que identifica uma instrução EXPLAIN. O número pode ser escolhido
através da cláusula SET QUERYNO ou em caso de omissão, escolhido pelo DB2.
 Q BL OC K N O
Número que identifica dentro da instrução SQL a query em particular que está sendo
explicada. Reflete a ordem em que aparece a query.
 AP PL AN AME
Nome do plano, ou branco se SQL dinâmico.
 P ROG N AME
Nome do programa, ou branco se SQL dinâmico.
 P L ANN O
Número identificando a seqüência em que a porção sendo explicada será executada
dentro de um QBLOCKNO.
 ME THOD
Identifica o método de join.
 0 Primeira tabela acessada. (Planno=1)
 1 NESTED LOOP JOIN. Para cada linha da tabela composta corrente, as linhas que
satisfazem a condição na tabela nova são concatenadas.
 2 MERGE SCAN JOIN. Ambas as tabelas são varridas na seqüência da coluna de join e
as linhas que satisfazem a condição são concatenadas.
 3 SORT adicional necessário para ORDER BY, GROUP BY, SELECT DISTINCT ou um
predicado quantificado.
 4 HYBRID JOIN. Método híbrido ente o nested loop e o merge scan.
 C RE ATOR
Proprietário da tabela sendo acessada.
 TN AME
Nome da tabela sendo acessada.

571774784.doc 171 de 175


DB2

 TAB N O
Identifica a cláusula FROM dentro da instrução sendo explicada.
 ACC E SSTYP E
Método de acesso a tabela.

I Através do índice identificado pela coluna ACCESSNAME


I1 One-fetch Index scan
N Varredura de índice em predicado com IN
R Varredura seqüencial das páginas
M Varredura múltipla de índice. Seguida por MX,MI ou UM
MX Varredura em múltiplos índices identificados pelo ACCESSNAME
MI Intersecção de múltiplos índices.
UM União de múltiplos índices.

 MATC HC OL S
Quantidade de colunas de um índice sendo utilizado para acesso pelo topo da estrutura
(root page da árvore).
 ACC E SSC RE ATOR
Proprietário do índice utilizado.
 ACC E SSN AME
Nome do índice utilizado.
 IN DE X ON L Y
“Y” se a pesquisa pode ser satisfeita apenas pelo índice ou “N” em caso contrário.
 SORTN _U N I Q
“Y” se a tabela resultante será classificada com a finalidade de eliminar linhas
duplicadas (SELECT DISTINCT) ou “N” em caso contrário.
 SORTN _J OI N
“Y” se a tabela resultante será classificada com a finalidade de resolver o join pelo
método “2” ou “N” em caso contrário.
 SORTN _ORDE RB Y
“Y” se a tabela resultante será classificada para satisfazer a cláusula ORDER BY ou “N”
em caso contrário.

571774784.doc 172 de 175


DB2

 SORTN _G ROU P B Y
“Y” se a tabela resultante será classificada para satisfazer a cláusula GROUP BY ou “N”
em caso contrário.

 SORTC _U N I Q
“Y” se a tabela composta será classificada com a finalidade de eliminar linhas
duplicadas (SELECT DISTINCT) ou “N” em caso contrário.
 SORTC _J OI N
“Y” se a tabela composta será classificada com a finalidade de resolver o join pelo
método “2” ou “N” em caso contrário.
 SORTC _OR DE RB Y
“Y” se a tabela composta será classificada para satisfazer a cláusula ORDER BY ou “N”
em caso contrário.
 SORTC _G ROU P B Y
“Y” se a tabela composta será classificada para satisfazer uma cláusula GROUP BY ou
um predicado quantificados ou “N” em caso contrário.
 TSL OC K MODE
Estratégia de locking no tablespace que conterá a tabela.
 TI ME STAMP
Timestamp do horário em que está instrução foi executada.
 RE MARK S
Coluna reservada para colocar um comentário.
 P RE FE TC H
“S” se sequential prefetch puro ou “L” se prefetch em uma lista de páginas ou branco
se nenhuma das anteriores.
 C OL U MN _FN _E V AL
Indica quando é resolvido a função de coluna. “R” se durante a leitura dos dados. “S”
se durante a classificação e branco se desconhecido ou durante a manipulação de
dados.
 MI X OP SEQ
Número que indica a ordem de participação do índice indicado numa operação de
múltiplos índices. (ACCESSTYPE tipo “MX”, “MI” ou “MU” ) . 0 nas demais linhas.

571774784.doc 173 de 175


DB2

21.4 Considerações para Batch

 Comando LOCK TABLE.


Quando não houver concorrência.
 Commits com freqüência
 Evita problemas de concorrência
 Diminui o processamento em caso de ROLLBACK.
 Pode ser emitido a cada 100 avaliações.
 Abrir cursor com WITH HOLD.
 Problema: reposicionamento em caso de abend.

21.4.1 Notas

O JOBS BATCH que não compartilham uma determinada tabela com outros usuários podem
emitir o comando LOCK TABLE. Com isso diminuem drasticamente o processamento de
locks e aumentam a sua eficiência.
O commit deve ser emitido em jobs batch que atualizam grande volume de dados
compartilhados por outros usuários. Como regra básica pode-se emitir o commit a
cada 100 atualizações sem impacto na performance do programa.
Um programa que trabalha com cursor e emite commit deve abrir o cursor com a cláusula
WITH HOLD para não perder o seu posicionamento.
Se um programa que emite commit sofrer um abend surge um problema a ser resolvido
pelo próprio programa. Acontece que o DB2 desfaz as atualizações até o último commit e
ao recomeçar o programa deve continuar a partir desse ponto, reposicionando inclusive
outro arquivos como por exemplo data set em fita magnética.

571774784.doc 174 de 175


DB2

22. MONITORAÇÃO E CONTROLE

22.1 Ferramentas para monitoração

 TRACES DO DB2
 RLF
 EXPLAIN
 RUNSTATS
 STOSPACE

22.2 DB2 trace

DB2
TRACE FACILITY DB2PM ou
PROGRAMA

SMF/GTF Estatística
Contabilização
Performance
Auditoria

571774784.doc 175 de 175

Você também pode gostar