Você está na página 1de 126

DB2 - CONCEITOS E UTILIZAÇÃO 19/11/98

DBMS RELACIONAL..............................................................................................................................3
DB2 é um DBMS Relacional....................................................................................................................5
OBJETOS DO DB2...................................................................................................................................7
ENTIDADE RELACIONAMENTO.......................................................................................................10
RELACIONAMENTO............................................................................................................................11
LINGUAGEM SQL.................................................................................................................................17
INSTRUÇÃO SELECT.......................................................................................................................18
QUERY............................................................................................................................................21
SELECT DE TODAS AS COLUNAS............................................................................................23
CONTROLE DE LINHAS..............................................................................................................24
NULIDADE.....................................................................................................................................26
MÚTIPLAS CONDIÇÕES..............................................................................................................28
IN.....................................................................................................................................................30
PESQUISAS PARCIAIS.................................................................................................................31
MANIPULANDO TABELA RESULTANTE................................................................................33
ORDER BY.....................................................................................................................................33
SELECT DISTINCT.......................................................................................................................35
SELECT DE VALORES CALCULADOS.....................................................................................37
ORDER BY POR VALOR CALCULADO....................................................................................38
SELECT AVANÇADO...................................................................................................................40
JOIN DE TABELAS.......................................................................................................................57
INNER JOIN....................................................................................................................................62
OUTER JOIN...................................................................................................................................63
EXPRESSÕES CASE......................................................................................................................64
UNION.............................................................................................................................................65
SUBQUERY....................................................................................................................................67
MANUTENÇÃO DE DADOS - INSERT.........................................................................................72
MANUTENÇÃO DE DADOS - UPDATE........................................................................................73
MANUTENÇÃO DE DADOS - DELETE........................................................................................74
DATA DEFINITION LANGUAGE.......................................................................................................75
DDL.....................................................................................................................................................76
STORAGE GROUP.............................................................................................................................77
DATABASE........................................................................................................................................78
TABLESPACE....................................................................................................................................79
TABLE.................................................................................................................................................81
ÍNDICE................................................................................................................................................83
VIEW...................................................................................................................................................84
DROP.......................................................................................................................................................85
SQL ESTÁTICO vs. SQL DINÂMICO..................................................................................................86
COMMIT / ROLLBACK........................................................................................................................91
BIND........................................................................................................................................................92
SEGURANÇA INTERNA DO DB2.......................................................................................................97
UTLITÁRIOS DO DB2...........................................................................................................................99
SYSIBM.SYSUTILX........................................................................................................................100
LOAD.................................................................................................................................................101
LOAD – JCL..................................................................................................................................102
FASES DO LOAD.........................................................................................................................105
CHECK DATA..................................................................................................................................109
FASES DO CHECK DATA..........................................................................................................110
CHECK INDEX.................................................................................................................................112
FASES DO CHECK INDEX.........................................................................................................112
REORG..............................................................................................................................................113
FASES DO REORG......................................................................................................................113
COPY.................................................................................................................................................116
MERGECOPY...................................................................................................................................117
RECOVERY......................................................................................................................................118
QUIESCE...........................................................................................................................................120
REPORT............................................................................................................................................120
INDEX RECOVERY........................................................................................................................121
RECOVERY PENDING...................................................................................................................122
MODIFY............................................................................................................................................123

1 #59585
DB2 - CONCEITOS E UTILIZAÇÃO 19/11/98

DIAGNOSE.......................................................................................................................................123
STOSPACE........................................................................................................................................123
RUNSTATS.......................................................................................................................................124
REPAIR.............................................................................................................................................124
DSNTIAUL........................................................................................................................................125
COMANDOS DB2............................................................................................................................126

2 #59585
DBMS RELACIONAL

• QUANDO UM DBMS PODE SER CONSIDERADO RELACIONAL ??

1. Independência dos Dados


2. Estrutura Tabular
3. Operadores de Tabelas
4. Uniformidade e Integridade dos Dados.

Notas:

DBMS - Significa DATA BASE MANAGEMENT SYSTEM, OU SISTEMA


GERENCIADOR DE BANCO DE DADOS (SGBD).

Um DBMS Relacional exige:

• Estrutura de Dados Tabular


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
mecanismo capazes de forçar uma uniformização dos dados que
são nela armazenados. Por exemplo, podemos forçar o
armazenamento dos dados sempre o formato numérico.

• Independência dos Dados.


Lógica das aplicações não devem se preocupar com a estrutura de
armazenamento e a teoria de acesso aos dados.
Tabela Empregados

Matricula Nome Cargo Depto Salário

000010 Christiane D01 001 260000


000020 Karina R01 002 270010
000030 Júlio S01 003 300010
Linhas 000040 Ingrid P01 004 250500
000050 Juan P02 004 138005

Colunas

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 da 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 referenciadas pelo seu nome.


DB2 é um DBMS Relacional

SISTEMA DE GERENCIA 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 Linguagem SQL


Relacional

- Os dados vistos - Definição


como Tabelas Manipulação e
- Projeto mais fácil Controle de dados
AMBIENTE DB2

IMS TM CICS Qmf/Spffi BATCH

DPROP
IMS DM DB2
DXT

Notas:

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 Propagador) ou o DXT
(Data Extract).
OBJETOS DO DB2

DATA BASE

Tablespace1

Indice1 Tabela1

Tablespace2

Indice2 Tabela2

View X

Storage Group A Storage Group B


OBJETOS DO B2

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 contem de
uma ou mais tabelas. Suas paginas 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ído de 4 a 64 páginas e
sempre múltiplos de 4. Cada segmento só pode conter dados de
uma tabela.

• PARTICIONADO
Recomendado para tabelas gigantes. Pode ser dividido em até 64
partições. Cada partição pode ter no máximo 4Gbytes. 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 primaria.
OBJETOS DO B2 (Continuação)

• 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 m nada difere com a de uma tabela. Conforme o caso uma
View pode ser somente para leitura

• STORAGE GROUP
É um conjunto de volumes(discos) onde estarão os tablespaces e
índices. Os discos devem ser do mesmo device type.
A utilização do Storage Group nos poupa ca 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.

• SYNONYM (Sinônimo)
É 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 a nível
de um subsistema DB2.

• ALIAS
É um nome alternativo(Apelido) para uma tabela ou VIEW. Um alias é
de uso compartilhado ao contrario do SYNONYM. É utilizado mais
como apelido para uma tabela remota e é válido a nível de um
subsistema DB2.
ENTIDADE RELACIONAMENTO

Modelo
E R DB2

Notas:

Uma vez construído o modelo entidade relacionamento, passamos à fase de


implementação em DB2.

Basicamente temos uma tabela para cada entidade do modelo. Existem


casos (relacionamento m:m) em que precisaremos trabalhar com tabelas
adicionais.

Para cada atributo de uma entidade temos uma coluna na tabela


correspondente. Uma coluna tem algumas características tais como tipo
de dado, para definir se o conteúdo é numérico ou alfanumérico.

A distribuição de tabelas entre os tablespace também deve seguir alguns


critérios tais como tamanho das tabelas, afinidade entre as tabelas, etc.
RELACIONAMENTO

Chave Chave
Primária Estrangeira

Matr Nome Depto EMPR

419 Maria A00


003 Carlos Z13 Carlos
Trabalha
na Reserva

Operador
Relacional

DeptoCod DeptoNome DEPT

Z13 Reserva
A00 Vendas

Notas:

Para mapearmos um relacionamento entre duas entidades de um modelo


relacional precisamos conhecer o conceito de chaves.
• Chave primária: Identifica uma ocorrência de uma entidade (Tabela)
• Chave estrangeira: Identifica uma associação entre as ocorrências
de duas tabelas. Como o valor representado é chave primária na outra
entidade, a chamamos de chave “Estrangeira”.

Conceito de chave primária e chave estrangeira estão implementados no


DB2, mas a suas utilização não é obrigatória.

A chave estrangeira deve pertencer ao mesmo domínio da chave primária a


qual esta associada. Ex.: Não poderíamos associar a coluna NOME de
EMPR com a coluna DeptoCod da DEPT.

A associação lógica entre as ocorrências das entidades é feita através das


chaves primárias e estrangeiras que serão argumento de um operador
relacional.
TIPOS DE RELACIONAMETO

1 PARA MUITOS

Colocar a chave estrangeira aqui

EMPREGADO M:1 DEPARTAMENTO


Carlos Reserva
Paulo
Maria Vendas

DEPTO

DeptoCod DeptoNome
Chave
Primária Z13Reserva
A00 Vendas
: :

EMPREGADO

Matr Nome Dept

Chave
419 Maria A00
Estrangeira
003 Carlos Z13
087 Paulo Z13
: : :
TIPOS DE RELACIONAMENTO

Notas:

Em um relacionamento do tipo um para muitos, qualquer ocorrência de uma


entidade pode estar associada à várias ocorrências da outra entidade,
enquanto qualquer ocorrência desta outra deve estar associada à apenas
uma ocorrência da outra.

Neste caso devemos colocar a chave estrangeira na tabela em que cada


ocorrência só enxerga uma ocorrência da tabela oposta.

Caso contrário deveríamos colocar várias chaves estrangeiras na tabela


oposta. No nosso exemplo, se um determinado departamento tiver 30
empregados, a tabela DEPT deveria ter no mínimo 30 chaves estrangeiras!
Podemos também imaginar uma situação onde um departamento da
companhia resolve triplicar o número de empregados.
TIPOS DE RELACIONAMENTO

MUITOS PARA MUITOS

EMPREGADO M:M PROJETO


Carlos Ano 2.000
Paulo
Maria Qualidade

• Onde colocar a chave estrangeira ?


Chave
Chave
Chave Primária Estrangeira
Estrangeira

EMPREGADO EMP-PROJ
Matr Nome Mat Cod Chave Primária
419 Maria 003 A2 PROJETO
003 Carlos 087 A2
087 Paulo : : Pcod PNome
419 A2 A2 Projeto 2.000
: : QD Qualidade
419 QD

TABELA DE ASSOCIAÇÃO

Notas:

Em um relacionamento do tipo muitos para muitos, qualquer ocorrência de


ambas as entidades pode estar associada à várias ocorrências da entidade
oposta.

Neste caso, ao invés de se criar várias chaves estrangeiras, criamos uma


tabela de associação que contém pelo menos duas chaves estrangeiras
apontando para as chaves primárias das tabelas associadas.

Nada impede que uma tabela de associação tenha colunas que não sejam
chaves estrangeiras.
INTEGRIDADE DE REFERENCIA

EMPR DEPT
(Dependet) (Parent)

Matr Nome Depto Dcod Dnome


419 Maria A00 A00 Vendas
003 Carlos Z13 V75 Contabilidade
: : : Z13 Reserva
: :

Integridade
Referencial

Notas:

A Integridade de referência garante que qualquer valor apontado pela


chave estrangeira tenha um 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.
INTEGRIDADE DE REFERENCIA (Continuação).

Todas as tabelas associadas entre si via regra de Integridade de


Referência formam um conjunto chamado de ESTRUTURA
REFERENCIAL ou REFERENTIAL STRUCTURE.

Uma tabela com chave primária definida é chamada de Parent Table ou


tabela Mãe.

Uma table com chave estrangeira definida é chamada de Dependent


Table ou tabela Dependente.

Uma linha de uma Parent Table é chamada 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 à 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, pode 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 todas as chaves estrangeiras das
linhas dependentes são atualizadas com valor nulo após a 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.
LINGUAGEM SQL

SQL

STRUCTURED
QUERY
LANGUAGE

SELECT CREATE GRANT


UPDATE ALTER REVOKE
DELETE DROP COMMIT
INSERT ROLLBACK

DML DDL CONTROL

Notas:

A Linguagem SQL pode ser separada 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.
INSTRUÇÃO SELECT

• Não é procedural
• Conceito da teoria os conjuntos
• Fácil

Notas:

A instrução SELECT não é procedural. Em outras palavras não precisamos


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:

1. QUERO OS DADOS QUE SATISFAZEM A CONDIÇÃO X.


• 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:
A B
◊ UNIÃO AUB

A B
◊ INTERSECÇÃO A∩B

A B
◊ DIFERENÇA A-B

◊ PRODUTO A X B = { (x, y) : x ∈ A e y ∈ B}
CARTESIANO
TABELAS USADAS NOS EXEMPLOS

x.staff

ID NOME DEPT CARGO ANOS SALARIO COMIS


10 SANTANA 20 GER 7 18357.50 -
20 ORSINI 20 VENDAS 8 18171.25 612.45
30 DANTAS 38 GER 5 17506.75 -
40 O’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.50
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 17654.50 922.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
350 GAFNEY 84 ATEND 5 13030.50 188.00
TABELAS USADAS NOS EXEMPLOS (Continuação)
x.org

DEPTCOD DEPTNOME GERENTE DIVISÃO LOCAL


10 MATRIZ 160 CENTRO SÃO PAULO
15 CAMPINAS 50 SUDESTE CAMPINAS
20 RIO 10 SUDESTE RIO DE 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
QUERY

Sequência obrigatória:

SELECT NOME, ANOS, SALARIO - Diz quais as colunas mostrar

FROM x.staff - Diz de quais tabelas

WHERE DEPT = 38 - Diz quais linhas selecionar

ORDER BY NOME - Diz como ordenar o resultado

Notas:

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


obedecendo à uma sequência.

As cláusulas estão grifadas na figura e não podem ser abreviadas.

No nosso exemplo estamos fazendo uma pesquisa na tabela chamada


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 os funcionários.

Uma instrução SELECT pode ser escrita em formato livre desde que as
cláusulas estejam obedecendo à sequência obrigatória, como descrito
abaixo:

SELECT NOME, ANOS, SALARIO FROM x.staff WHERE DEPT = 38


ORDER BY NOME
SELECT ... FROM

♦ SELECT algumas das colunas da tabela


• Lista as colunas desejadas na sequência de esquerda para a
direita
• Vírgulas separam as colunas

♦ FROM lista de tabelas


• Simples: EMP
• Qualificado: AUTHID.EMP

♦ EXEMPLO

SELECT DEPTNOME, DEPTCOD


FROM x.org

Resultado:
DEPTNOME DEPTCOD
MATRIZ 10
CAMPINAS 15
RIO 20
MINAS 38
: :
SELECT DE TODAS AS COLUNAS

Para selecionar todas as colunas de uma tabela na mesma sequência em que


foram definidas:

SELECT * FROM x.org

Resultado:

DEPTCOD DEPTNOME GERENTE DIVISÃO LOCAL


10 MATRIZ 160 CENTRO SÃO PAULO
15 CAMPINAS 50 SUDESTE CAMPINAS
20 RIO 10 SUDESTE RIO DE JANEIRO
38 MINAS 30 SUDESTE B. HORIZONTE
: : : : :
CONTROLE DE LINHAS

WHERE

⇒ Traz certas linhas


⇒ Estabelece condições

Listar empregados do departamento 20

SELECT DEPT, NOME, CARGO, COMIS


FROM x.staff
WHERE DEPT = 20

Resultado:

ID NOME DEPT CARGO ANOS SALARIO COMIS


10 SANTANA 20 GER 7 18357.50 -
20 ORSINI 20 VENDAS 8 18171.25 612.45
80 JAMES 20 ATEND - 13504.60 128.20
190 SNEIDER 20 ATEND 8 14252.75 126.50

◊ 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’
OPERADORES DE COMPARAÇÃO

= Igual
<> or ¬= Diferente
> Maior
>= Maior ou Igual
< Menor
<= Menor ou Igual
¬= Não Igual
¬> Não Maior
¬< Não Menor

SELECT MATR, COMIS


FROM x.staff
WHERE COMIS >= 1000

SELECT NOME, DEPT, ANOS


FROM x.staff
WHERE CARGO <> ‘GER’
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

NOT NULL WITH DEFAULT

Uma coluna pode ser ‘Not Null With Default’.

Após a Versão 4 podemos atribuir um valor Default para a coluna quando


à mesma é omitida na inclusão e se não atribuirmos este valor o sistema
atribui como:
♦ Zero se coluna numérica
♦ Branco se coluna definida como caracter
♦ Comprimento zero se coluna definida como caracter de
tamanho variável.
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 -
FRAYE GER -
: : :

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

SELECT NOME, CARGO, COMIS


FROM x.staff
WHERE COMIS IS NOT NULL

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
KOONITZ VENDAS 1386.70
NGAN ATEND 206.60
NAUGHTON ATEND 180.00
YAMAGUCHI ATEND 75.60
OLIVEIRA VENDAS 637.50
KERMISCH ATEND 110.10
: : :
MÚTIPLAS CONDIÇÕES

♦ Operadores múltiplos de condições: AND e OR


♦ Dadas duas condições:
CARGO = ‘VENDAS’ SALARIO < 17000

Para ter ambas satisfeitas: AND

WHERE CARGO ‘VENDAS’ AND SALARIO < 17000

Resultado:

NOME CARGO SALARIO


SUZUKI VENDAS 16808.30
ALMEIDA VENDAS 16502.83
: : :

Para ter qualquer uma satisfeitas: OR

WHERE CARGO ‘VENDAS’ OR SALARIO < 17000

Resultado:

NOME CARGO SALARIO


ORSINI VENDAS 18171.25
O’BRIEN VENDAS 18006.00
SUZUKI VENDAS 16808.30
ALMEIDA VENDAS 16502.83
JAMES ATEND 13504.60
: : :
MÚLTIPLAS CONDIÇÕES (Continuação)

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


OR ANOS > 10

Resultados:

NOME CARGO ANOS COMIS


KOONITZ VENDAS 6 1386.70
JONES GER 12 -
GRAHAM VENDAS 13 200.30
VIEIRA VENDAS 7 1285.00
: : : :
: : : :

Não equivale a:

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

Resultados:

NOME CARGO ANOS COMIS


KOONITZ VENDAS 6 1386.70
GRAHAM VENDAS 13 200.30
VIEIRA VENDAS 7 1285.00
IN

♦ Valor deve coincidir com algum elemento de uma lista

WHERE DEPT IN ( 38, 20, 42)

Equivale a múltiplos Ors para a mesma coluna:

WHERE DEPT = 38 OR DEPT = 20 OR DEPT = 42

♦ Valor deve ser diferente de algum elemento da lista

WHERE DEPT NOT IN ( 38, 20, 42)

BETWEEN

♦ Para selecionar um intervalo fechado de valores

SELECT NOME, CARGO, ANOS


FROM x.staff
WHERE ANOS BETWEEN 9 AND 11

Equivale a

SELECT NOME, CARGO, ANOS


FROM x.staff
WHERE ANOS >= 9 AND ANOS <=11

Resultado:
NOME CARGO ANOS
SOUZA GER 10
LU GER 10
LEA GER 9
WILSON VENDAS 9
PINHO GER 10

♦ Para selecionar um intervalo diferente de valores


SELECT NOME, CARGO. ANOS
FROM x.staff
WHERE ANOS NOT BETWEEN 9 AND 11
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 operadores ESCAPE permite que seja utilizado outro caracter no


lugar do ‘%’.

Exemplo:
... WHERE coluna LIKE ‘100+%%’ ESCAPE ‘+’

Notas:

No exemplo estamos procurando strings que começam por ‘100%’.

Primeiro ‘%’ é interpretado como um caracter comum pois é precedido pelo


caracter ‘+’ que foi definido através do operador ESCAPE.

Segundo ‘%’ é interpretado como um conjunto de caracteres quaisquer


pois não é precedido por nenhum caracter de ESCAPE.

Neste exemplo, quaisquer ocorrência do ‘+’ que não sejam ‘++’, ‘+%’ ou ‘+_’
provoca erro.
NEGAÇÃO

♦ Para reverter o teste:

WHERE NOME NOT LIKE ‘G%’

Exclui: GRAHAM, GONZALES, GAFNEY.

WHERE ANOS NOT BETWEEN 9 AND 11

Exclui: ANOS de 9 a 11

USER

Registro Especial

♦ Authorization ID do tempo de execução


♦ Comprimento fixo de 8 bytes
♦ Útil para query dependente de executor

SELECT *
FROM SYSIBM.SYSTABLES
WHERE OWNER = USER
MANIPULANDO TABELA RESULTANTE

Para classificar as linhas: ORDER BY

Para eliminar linhas duplicadas: SELECT DISTINCT

ORDER BY

♦ Para classificar numa sequência especifica:

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

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 coluna na cláusula SELECT. O ORDER BY é o
único que permite isto.

A cláusulas ORDER BY classifica uma tabela resultante. Logo deve ser


SEMPRE a única e a Última a aparecer numa instrução SELECT.
ORDER BY (Continuação)

♦ 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

ORDER BY ANOS DESC, CARGO

Resultado:

NOME CARGO ANOS


PINHO GER 10
VIEIRA VENDAS 7
GAFNEY ATEND 5
DAVIS VENDAS 5
SELECT DISTINCT

SELECT DEPT FROM x.staff


DEPT
20
20
38
38
15
38
10
.
.

Para eliminar linhas duplicadas:

SELECT DISTINCT DEPT FROM x.staff


DEPT
20
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
: :
SELECT DISTINCT (Continuação)
Notas:

♦ A Palavra chave DISTINCT deve aparecer logo depois do 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
. .
. .
. .
SELECT DE VALORES CALCULADOS

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

Ganho total de cada pessoa do DEPT 20

SELECT ID, SALARIO, COMIS, SALARIO + COMIS AS TOTAL


FROM x.staff
WHERE DEPT = 20

Resultado:
ID SALARIO COMIS TOTAL
10 18357.50 - -
20 18171.25 612.45 18783.70
80 13504.60 128.20 13632.80
190 14252.75 126.50 14379.25

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

SELECT NOME, SALARIO + COMIS AS TOTAL


FROM x.staff
WHERE SALARIO + COMIS > 20000

Resultado:
NOME TOTAL
OLIVEIRA 20094.15
GRAHAM 21200.30
ORDER BY POR VALOR CALCULADO

Exemplo 1:

SELECT NOME, SALARIO + COMIS


FROM x.staff
WHERE SALARIO + COMIS > 20000
ORDER BY 2 DESC

Resultado:
NOME TOTAL
GRAHAM 21200.30
OLIVEIRA 20094.15

Exemplo 2:

SELECT CARGO, SALARIO + COMIS


FROM x.staff
ORDER BY CARGO, 2
OPERADORES DE CONCATENAÇÃO

string1 || string2 string1string2

‘ABC’ || ‘XYZ’ ‘ABCXYZ’

TABELAX ( 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.
. . .
SELECT AVANÇADO

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

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.


SUM AVG MAX MIN

Exemplo:

SELECT SUM(SALARIO), AVG(SALARIO),


MIN(COMIS), MAX(COMIS)
FROM x.staff
WHERE DEPT = 66

Resultado:

86076.20 17215.24 55.50 844.00

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 um 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.
♦ Expressões do seguinte tipo também podem ser argumento de uma
função de coluna.

Exemplo: AVG(SALARIO + COMIS)


COUNT

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

COUNT(DISTINCT coluna) Número de valores diferentes na coluna


Nulos não são contados.

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


respectivos departamentos. Mostre a média salarial.

SELECT COUNT(DISTINCT DEPT), COUNT(*), AVG(SALARIO)


FROM x.staff
WHERE SALARIO > 18000

Resultado:

8 16 19604.190625

SELECT AVG(COMIS), SUM(COMIS) FROM x.staff

Resultado:

513.31 12319.45

LITERAIS

SELECT ‘MED:’ AVG(COMIS), ‘SOMA:’ SUM(COMIS)


FROM x.staff

Resultado:

MED: 513.31 SOMA: 12319.45

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.
GROUP BY
Com o GROUP BY, a função de coluna calcula um valor para cada
AGRUPAMENTO.

SELECT DEPT, SUM(SALARIO) as TOTSAL,


SUM(COMIS) as TOTCOM
FROM x.staff
WHERE CARGO <> ‘GER’
GROUP BY DEPT

Resultado:
DEPT TOTSAL TOTCOM
15 41269.53 1468,70
20 45928.60 867.15
38 59778.80 1913.30
: : :

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 sequência obedecerá a sequência do índice que pode estar
definida como sendo de ordem descendente.
GROUP BY ... ORDER BY

♦ Podemos alterar a ordem de classificação

SELECT DEPT, SUM(SALARIO) AS TOTSAL,


SUM(COMIS) AS TOTCOM
FROM x.staff
WHERE CARGO <> ‘GER’
GROUP BY DEPT
ORDER BY 3

Resultado:
DEPT TOTSAL TOTCOM
20 45928.60 867.15
. . .
15 41269.53 1468.70
. . .
38 59778.80 1913.30

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
frequente.

Resultado contém uma linha sumário para cada grupo.

Todos os valores nulos são considerados como um grupo.


GROUP BY ... HAVING

Condições sobre grupos

SELECT . . . FROM . . .
WHERE . . .

GROUP BY . . . FILTROS
HAVING . . .

WHERE - Escolhe linhas


HAVING - Escolhe grupos

SELECT DEPT, SUM(SALARIO) AS TOTSAL


FROM x.staff
GROUP BY DEPT

DEPT TOTSAL
10 83463.45
15 61929.33
20 64286.10
38 77285.55
42 58369.05
: :

SELECT DEPT, SUM(SALARIO) AS TOTSAL


FROM x.staff
GROUP BY DEPT
HAVING SUM(SALARIO) > 65000

DEPT TOTSAL
10 83463.45
38 77285.55
: :
EXEMPLOS DE HAVING(Continuação)

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


departamentos com mais de 3 pessoas sem cargo gerencial.

SELECT DEPT, AVG(SALARIO) AS MEDIASAL


FROM x.staff
WHERE CARGO <> ‘GER’
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.

SELECT DEPT, AVG(SALARIO) AS MEDIASAL


FROM x.staff
WHERE CARGO <> ‘GER’
GROUP BY DEPT
HAVING MIN(ANOS) >= 5
ORDER BY 2 DESC

Notas:

• 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.
SUMÁRIO FUNÇÕES DE COLUNA

♦ Funções de colunas só podem ser especificados em:


♦ SELECT
♦ HAVING

♦ SELECT pode especificar somente:


♦ Função de Colunas
♦ Colunas especificadas no GROUP BY

♦ HAVING pode especificar:


♦ Função de colunas sobre qualquer coluna contida numa tabela
especificada na FROM.

• Funções de Colunas não podem ser embutidas uma dentro da outra

FUNÇÕES ESCALARES

• Transforma um único valor em outro valor.

• Funções STRING
• Funções de conversão
• Funções DATE/TIME

Notas:

♦ Ao contrário das Funções de colunas que transformam um conjunto


de valores de uma coluna num único valor, as funções Escalares operam
somente sobre um único valor.
♦ Funções escalares podem ser embutidas uma dentro da outra.
♦ Exemplo: SUBSTR(SUBSTR(...)...)
♦ Funções de colunas podem ser argumento de uma função escalar.
♦ Exemplo: MAX(SUBSTR(...))
SUBSTR(string, início, comprimento)

SELECT DEPTNOME, SUBSTR(DEPTNOME,1,4) as NOMEPARC


FROM x.org

Resultado:
DEPTNOME NOMEPARC
MATRIZ MATR
CAMPINAS CAMP
RIO RIO
MINAS MINA
BAHIA BAHI
. .

SELECT DEPTCOD, DIVISÃO


FROM x.org
WHERE SUBSTR(DIVISÃO,4) = ‘ESTE’

Resultado:
DEPTCOD DIVISÃO
15 SUDESTE
20 SUDESTE
38 SUDESTE

Notas:

♦ Se o Comprimento não for especificado, a função pega todo o resto.


♦ Se a posição do início ultrapassar o final do string teremos erro.
♦ Se o início + comprimento ultrapassar o final do string teremos
erro.
♦ Substring de nulo é nulo.
LENGTH

SELECT NOME, LENGTH(NOME) AS TAMNOME,


CARGO, LENGTH(CARGO) AS TAMCAR
FROM x.staff

Resultado:
NOME TAMNOME CARGO TAMCAR
SANTANA 7 GER 6
ORSINI 6 VENDAS 6
GONZALES 8 VENDAS 6
. . . .

Notas:

♦ Fornece o tamanho de uma coluna do tipo caracter.


♦ Se o argumento é nulo, o resultado também será nulo.
VALUE

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

SELECT ID, COMIS, VALUE(COMIS, 0)


FROM x.staff

Resultado:
ID COMIS
10 - 0.00
20 612.45 612.45
30 - 0.00
. . .

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 comparáveis (todos
numéricos ou todos caracteres).
♦ Se todos argumentos forem nulos, o resultado será nulo.
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 Hexadecimal - Alfa

SELECT DECIMAL(SAL,9,1), INTEGER(SAL)


FROM EMP
WHERE ID = 55

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

17506.75

17506.7 17506

Notas:

♦ DECIMAL, FLOAT, INTEGER: Converte dados numéricos


♦ DIGITS: Representação alfanumérica de um valor numérico
♦ HEX: Representação hexadecimal de um argumento. Cada digito
hexadecimal é representada por 2 caracteres do string resultante.
DADOS DATE/TIME

♦ DATE, TIME, TIMESTAMP armazenados como decimal compactado


sem sinal

Data Types Formato Interno


DATE aaaammdd
TIME hhmmss
TIMESTAMP aaaammddhhmmssnnnnnn

♦ Programas lidam só com FORMATO EXTERNO: string de


caracteres

Formato Formato TIME Tamanho Formato Date Tamanho


ISO hh.mm.ss 8 bytes aaaa-mm-dd 10 bytes
USA hh.mm AM/PM 8 bytes mm/dd/aaaa 10 bytes
EUR hh.mm.ss 8 bytes dd.mm.aaaa 10 bytes
JIS hh:mm:ss 8 bytes aaaa.mm.dd 10 bytes
ARITMÉTICA DATE/TIME

♦ Somente adição e subtração


♦ Pode usar MIN, MAX, COUNT
♦ Não pode usar SUM e AVG

DURACAO DATE/TIME

♦ DURAÇÃO SIMPLES

Horário + ou - Horário  Duração em hhmmss


(packed decimal(8,0))
data + ou - data  Duração em aaaammdd
(packed decimal(8,0))

♦ Duração Rotulada

Número ‘n’ seguida da palavra chave:


♦ YEARS, MONTHS, DAYS, HOURS, MINUTES, SECONDS,
MICROSECONDS

♦ Somando/Subtraindo duração
DATACOL1 + 3 MONTHS Resulta em Data
TEMPCOL1 - 30 MINUTES - 20 SECONDS Resulta em tempo
TSTCOL + 2 DAYS - 3 HOURS
TMSTCOL + 50000 MICROSECONDS

♦ Subtraindo datas e tempos


DATACOL1 - DATACOL2
DATACOL1 - ’25.12.1998’
TEMPCOL1 - TEMPCOL2
TEMPCOL1 - ’11.30.00’
EXEMPLOS ARITMÉTICA DATE/TIME

Tabela DT

PROJCOD DATAINI DATAFIM HRINI HRFIM


AX001 31.01.1990 31.03.2005 00:00:00 15:30:00
AX002 29.02.1988 31.08.1988 00:00:00 00:00:00
AX003 01.02.1987 01.02.1987 16:00:00 23:41:59

SELECT PROJCOD, DATAINI + 1 YEAR AS DATAINI,


DATAFIM - 2 MONTHS AS DATAFIM ...

Resultado:
PROJCOD DATAINI DATAFIM
AX001 31.01.1991 31.01.2005
AX002 28.02.1989 30.06.1988
AX003 01.02.1988 01.12.1986

SELECT PROJCOD, DATAFIM - DATAINI AS aaaammdd,


HRFIM - HRINI AS hhmmss ...

Resultado:
PROJCOD aaaammdd hhmmss
AX001 00150200 153000
AX002 00000602 000000
AX003 00000000 074159
FUNÇÕES ESCALARES DATE/TIME

• CHAR: Controla formato externo de dados DATE/TIME

SELECT CHAR(HRFIM,ISO) AS HR_ISO,


CHAR(HRFIM,USA) AS HR_USA
FROM DT
WHERE PROJCOD = ‘AX001’

Resultado:
HR_ISO HR_USA
15.30.00 03:30 PM

• DAY, MONTH, YEAR


HOURS, MINUTE, SECOND
MICROSECOND

Extrai parte de uma data, horário ou timestamp


Resulta num inteiro binário.

SELECT DAY(DATAINI) AS DIA, MONTH(DATAINI) AS MÊS,


YEAR(DATAINI) AS ANO FROM DT
WHERE YEAR(DATAINI) > 1988

Resultado:
DIA MÊS ANO
31 1 1990
FUNÇÕES ESCALARES DATE/TIME(Continuação)

• DAYS Número de dias desde 31/01/0000

SELECT DATAFIM - DATAIN AS DATAS, DAYS(DATAFIM) -


DAYS(DATAIN) AS NU_DIAS FROM DT
WHERE PROJCOD = ‘AX001’

Resultado:
DATAS NU_DIAS
00150228 5538
aaaammdd (n.º dias)

• DATE, TIME

Extrai data ou horário de um timestamp.

• CURRENT DATE

Data de hoje

• CURRENT TIME

Horário do momento.

• CURRENT TIMESTAMP

Data e horário do momento convertido para Timestamp.


JOIN DE TABELAS

Mesmo domínio

ID NOME DEPT
10 SANTANA 20
20 ORSINI 20
30 DANTAS 38
40 O’BRIEN 38
50 SOUZA 15
60 SUZUKI 38 DEPTCOD DEPTNOME GERENTE
70 ALMEIDA 15 10 MATRIZ 160
80 JAMES 20 15 CAMPINAS 50
90 KOONITZ 42 20 RIO 10
100 PLOTZ 42 38 MINAS 30
. . . 42 BAHIA 100
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 pelas cláusulas FROM
♦ Resultado é um subconjunto do produto cartesiano das tabelas.
JOIN DE TABELAS(Continuação)

Listar o nome dos departamentos e seus respectivos gerentes.

SELECT DEPTNOME, NOME


FROM x.staff, x.org
WHERE GERENTE = ID

Resultado:
DEPTNOME 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 DIVISAO = ‘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.

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
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
. . . . .

♦ QUALIFICADORES

COD NOME DEPT CARGO COD DEPTNOME GERENTE


10 SANTANA 20 GER 10 MATRIZ 160
20 ORSINI 20 VENDA . . .
. . . . 10 RIO 10

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


departamentos.

SOLUÇÃO:

♦ Qualificar com o nome da tabela


SELECT NOME, x.org.CODIGO, DEPTNOME
FROM x.staff, x.org
WHERE CARGO = ‘GER’ AND DEPT = x.org.CODIGO

♦ Qualificador correlacionado

SELECT NOME, Z.CODIGO, DEPTNOME


FROM x.staff, x.org Z
WHERE CARGO = ‘GER’ AND DEPT = Z.CODIGO
QUALIFICADORES

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 caso exemplo a tabela x.org foi rotulada como “Z”. Assim a
coluna Z.CODIGO é uma referência à coluna x.org.CODIGO.
Esta rotulação não é permanente e vale somente durante a execução da
instrução SELECT que faz uso da mesma.
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 ... SALARIO ... GER
150 OLIVEIRA 19456.50 140

2. Obter informações do gerente da VEMPR


MATR NOME ... SALARIO ... GER
140 SANTANA 18357.50 050

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.SALARIO, G.NOME, G.SALARIO


FROM VEMPR E, VEMPR G
WHERE E.GER = G.MATR AND E.SALARIO > G.SALARIO

Resultado:
NOME SALARIO NOME SALARIO
OLIVEIRA 19456.50 SANTANA 18357.50
. . . .
. . . .
INNER JOIN

♦ Uma outra maneira de codificar o JOIN entre duas tabelas

SELECT DEPTNOME, NOME


FROM x.staff INNER JOIN x.org
ON GERENTE = ID

Resultado:
DEPTNOME NOME
RIO SANTANA
MINAS DANTAS
CAMPINAS SOUZA
. .

Nota:

Quando utilizamos a cláusulas JOIN deve mudar o predicado WHERE por


ON.

TABELAS EXEMPLOS:
EMPL DEPTO
EMPNO NOME DEPTNOME CODEMP
10 HAAS SPIFFY COMPUTER 10
150 ADAMSON DEVELOPMENT -
20 THOMPSON SOFTWARE 100
250 SMITH ADMINISTRATION 700
100 SPENSER BRANCH OFFICE -
70 PILASKI
140 NATZ
OUTER JOIN

♦ Seleciona todas as linhas de um INNER JOIN mais as linhas não


selecionadas de ambas as tabelas.
♦ RIGHT OUTER JOIN Seleciona as linhas da tabela à
direita.
♦ LEFT OUTER JOIN Seleciona as linhas da tabela à
esquerda.
♦ FULL OUTER JOIN Seleciona as linhas de ambas as
tabelas.

SELECT NOME, DEPTNOME


FROM EMPL RIGHT OUTER JOIN DEPTO
ON EMPNO = CODEMP

SELECT NOME, DEPTNOME


FROM EMPL LEFT OUTER JOIN DEPTO
ON EMPNO = CODEMP

Resultados:
RIGHT OUTER JOIN LEFT OUTER JOIN
NOME DEPTNOME NOME DEPTNOME
HAAS SPIFFY COMPUTER HAAS SPIFFY COMPUTER
- DEVELOPMENT ADAMSON -
SPENSER SOFTWARE THOMPSON -
PULASKI ADMINISTRATION SMITH -
- BRANCH OFFICE SPENSER SOFTWARE
PULASKI ADMINISTRATION
NATZ -
EXPRESSÕES CASE

♦ Em tempo de retorno do resultado da Query podemos atribuir


valores a serem mostrados/exibidos a determinados retornos, o
exemplo abaixo nos dará uma boa noção desta facilidade.

SELECT PARTNO, DESCRIPT, COLOR,


CASE WHEN SIZE = ‘S’ THEN ‘Small’
WHEN SIZE = ‘M’ THEN ‘Medium’
WHEN SIZE = ‘L’ THEN ‘Large’
WHEN SIZE = ‘X’ THEN ‘Xlarge’
ELSE ‘DESCONHECIDO’ END AS SIZE, QTY
FROM QTY <= REORDER_PT

Resultado:
PARTNO DESCRIPT COLOR SIZE QTY
12-234 SWEATER BLUE SMALL 18
12-235 SWEATER RED MEDIUM 22
14-276 JACKET GREEN DESCONHECIDO 9

Mais Expressões CASE

♦ Usando na cláusulas WHERE

... WHERE (CASE WHEN SALARY = 0 THEN NULL


ELSE COMM/SALARY END) > .25

♦ Usando em Funções de colunas

... MIN (CASE WHEN QTY > 0 THEN QTY


ELSE NULL END)
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

Notas:

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


Query complexas podem ser feitas usando o UNION.
A Quantidade de colunas deve ser a mesma em todos os SELECTs.
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.
operador UNION ALL também une tabelas mas não elimina linha
duplicadas. Não chama o SORT portanto.
Para os nomes das colunas no cabeçalho são adotadas as do primeiro bloco
de SELECT.
UNION(Continuação)

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


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

SELECT CARGO, SALARIO * 1.17 AS SALARIO


FROM x.staff
WHERE CARGO = ‘ATEND’
UNION
SELECT CARGO, SALARIO * 1.02
FROM x.staff
WHERE CARGO = ‘VENDAS’
ORDER BY 2 DESC

Resultado:
CARGO SALARIO
VENDAS 21420.0000
. .
. .
VENDAS 17144.4660
ATEND 16918.2000
VENDAS 16832.8866

SELECT NOME FROM X.CANDIDATOS


WHERE ENDERECO LIKE ‘%SP’
UNION ALL UNION
SELECT SOBRENOME FROM X.ENTREVISTADOS
WHERE SIT = ‘REP’
Cabeçalho do
primeiro
SELECT
Resultado:
NOME NOME
JACOBS ARANTES
MARQUES JACOBS
ARANTES MARQUES
SILVA SILVA
MARQUES
JACOBS
SUBQUERY

♦ É um SELECT embutido dentro de um SELECT


♦ O resultado de uma subquery é usado pelo SELECT “EXTERNO”

Exemplo de SUBQUERY.

Listar empregados cujo departamento esteja subordinado ao


departamento ‘A00’

SNOME DEPARTAMENTO DCOD DSUPER

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

Considerações SUBQUERY:
1. Pode ser usada no WHERE ou no HAVING
2. Pode ser encadeado
3. A escolha do operador do SELECT externo depende da quantidade de
linhas do SUBQUERY.
4. Deve estar a direita do operador na condição de seleção.
5. Deve ser colocado entre parênteses.
6. O SUBQUERY deve selecionar apenas um coluna.
7. O SUBQUERY pode retornar uma ou mais linhas e isto acaba
determinando o operador a ser usado na condição de procurar.
8. Não pode conter UNION, UNIN ALL ou ORDER BY.
9. SUBQUERY conhecido como SUBSELECT.
SUBQUERY DE UMA LINHA
Listar os funcionários com salário superior à média da companhia

SELECT NOME, SALARIO


FROM x.staff
WHERE SALARIO > (SELECT AVG(SALARIO)
FROM x.staff)

Resultado:
NOME SALARIO
SANTANA 18357.50
ORSINI 18171.25

Mostrar o funcionário com o maior salário.

SELECT NOME, SALARIO


FROM x.staff
WHERE SALARIO = (SELECT MAX(SALARIO)
FROM x.staff)

Resultado:
NOME SALARIO
MOLINARI 22959.20
SUBQUERY COM VÁRIAS LINHAS: ALL

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(SALARIO) FROM x.staff GROUP BY DEPT)
♦ Compare o salário de cada funcionário com a lista devolvida pela
SUBQUERY.

SELECT NOME, SALARIO FROM x.staff


WHERE SALARIO > ALL (SELECT AVG(SALARIO)
FROM x.staff GROUP BY DEPT)
ORDER BY NOME

Resultado:
NOME SALARIO
FRAYE 21150.00
GRAHAM 21000.00
JONES 21234.00
MOLINARE 22959.20

Lista classificada dos funcionários com salário maior que a média salarial
de qualquer departamento.

♦ Encontrar a média salarial para cada departamento.


♦ Compare o salário e cada funcionário com a lista devolvida pela
SUBQUERY.

SELECT NOME, SALARIO FROM x.staff


WHERE SALARIO > ANY(SELECT AVG(SALARIO)
FROM x.staff GROUP BY DEPT)
ORDER BY NOME

Resultado:
NOME SALARIO
DANIELS 19260.25
DAVIS 15454.50
EDWARDS 17844.00
IN

Lista de gerentes da divisão Sul

SELECT DEPT, NOME FROM x.staff


WHERE ID = ANY (SELECT GERENTE FROM x.org
WHERE DIVISAO = ‘SUL’)

♦ SUBQUERY Resulta numa lista de Gerentes da divisão SUL


♦ ‘IN’ equivale a um série de ‘OR’ ... = ‘ sobre uma coluna
♦ ‘=ANY’ pode substituir ‘IN’

SELECT DEPT, NOME FROM x.staff


WHERE ID IN (SELECT GERENTE FROM x.org
WHERE DIVISAO = ‘SUL’)

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(SALARIO) FROM x.staff


WHERE CARGO <> ‘GER’ GROUP BY DEPT
HAVING AVG(SALARIO) < (SELECT AVG(SALARIO)
FROM x.staff
WHERE CARGO <> ‘GER’)
ORDER BY 2 DESC

Resultado:
DEPT
66 16880.175000000
51 16235.200000000
84 15443.000000000
20 15309.530000000
SUBQUERY CORRELACIONADA

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


departamento.

SELECT NOME, SALARIO


FROM x.staff CV
WHERE SALARIO > (SELECT AVG(SALARIO) FROM x.staff
WHERE DEPT = CV.DEPT)

♦ Uma SUBQUERY correlacionada é executada a cada linha devolvida


ao SELECT externo!

Listar os gerentes ganhando menos que $18.000 se existir pelo menos um


gerentes com salário superior à $22.000.

SELECT ID, NOME, SALARIO, DEPT FROM x.staff


WHERE CARGO = ‘GER’ AND SALARIO < 18000
AND EXISTS(SELECT * FROM x.staff
WHERE CARGO = ‘GER’ AND
SALARIO > 22000)

ID NOME SALARIO DEPT


30 MARENGHI 17506.75 38

♦ Verdadeiro/Falso no SELECT interno


Determina se o SELECT externo será executado.

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 condição de
procura, determina uma eventual execução ou não do SELECT externo.
♦ EXISTS pode ser negado por um NOT.
MANUTENÇÃO DE DADOS - INSERT

Insert de uma linha

INSERT INTO PROJ


VALUES(‘MA2114’, ‘ ‘, ‘B01’, ‘ ‘, NULL, CURRENT DATE, NULL)

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

Resultado:
PCODIGO PNOME DEPT RESP EQUIPE DATAINI DATAFIM
........... .............. ....... ........ ............. ................. ................
OP2011 SUPORTE E21 320 001.00 25.12.1998 01.02.1999
OP2012 APLICACAO E21 330 001.00 25.12.1998 01.02.1999
OP2013 DB/DC E21 340 001.00 25.12.1998 01.02.1999
MA2114 B01 ? 26.12.1998 ?

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 20 001.00 01.01.1987 15.09.1987
OP1010 OPERAÇÃO E11 90 005.00 01.01.1986 01.05.1988
OP2010 SUPORTE II E21 100 004.00 01.01.1982 01.02.1988
OP2011 ..... E21 320 001.00 01.01.1982 01.02.1988
OP2012 ..... E21 330 001.00 01.01.1982 01.02.1988
OP2013 ..... E21 340 001.00 01.01.1982 01.02.1988
MANUTENÇÃO DE DADOS - UPDATE

Update de colunas

Antes:
PCOD PROJNOME DEPT RESP EQUIPE DATAINI DATAFIM
PL2100 ...... B01 20 001.00 01.01.1987 15.09.1987
OP1010 OPERAÇÃO E11 90 005.00 01.01.1986 01.05.1988
OP2010 SUPORTE II E21 100 004.00 01.01.1982 01.02.1988
OP2011 ..... E21 320 001.00 01.01.1982 01.02.1988
OP2012 ..... E21 330 001.00 01.01.1982 01.02.1988
OP2013 ..... E21 340 001.00 01.01.1982 01.02.1988

UPDATE TESTPROJ
SET EQUIPE = EQUIPE*2, DATAFIM=NULL,
DATAINI=’02.01.1999’
WHERE DEPT = ‘B01’

Depois:
PCOD PROJNOME DEPT RESP EQUIPE DATAINI DATAFIM
PL2100 ...... B01 20 002.00 02.01.1999 ?
OP1010 OPERAÇÃO E11 90 005.00 01.01.1986 01.05.1988
OP2010 SUPORTE II E21 100 004.00 01.01.1982 01.02.1988
OP2011 ..... E21 320 001.00 01.01.1982 01.02.1988
OP2012 ..... E21 330 001.00 01.01.1982 01.02.1988
OP2013 ..... E21 340 001.00 01.01.1982 01.02.1988

♦ Um subconjunto de linhas

UPDATE PESSOAL
SET SALARIO = SALARIO + 300
WHERE CARGO = ‘ATEND’

♦ Todas as linhas:

UPDATE PESSOAL
SET ANOS = ANOS + 1
MANUTENÇÃO DE DADOS - DELETE

Antes:
PCOD PROJNOME DEPT RESP EQUIPE DATAINI DATAFIM
PL2100 ...... B01 20 002.00 02.01.1999 ?
OP1010 OPERAÇÃO E11 90 005.00 01.01.1986 01.05.1988
OP2010 SUPORTE II E21 100 004.00 01.01.1982 01.02.1988
OP2011 ..... E21 320 001.00 01.01.1982 01.02.1988
OP2012 ..... E21 330 001.00 01.01.1982 01.02.1988
OP2013 ..... E21 340 001.00 01.01.1982 01.02.1988

DELETE FROM TESTPROJ


WHERE DEPT = ‘B01’

Depois:
PCOD PROJNOME DEPT RESP EQUIPE DATAINI DATAFIM
OP1010 OPERAÇÃO E11 90 005.00 01.01.1986 01.05.1988
OP2010 SUPORTE II E21 100 004.00 01.01.1982 01.02.1988
OP2011 ..... E21 320 001.00 01.01.1982 01.02.1988
OP2012 ..... E21 330 001.00 01.01.1982 01.02.1988
OP2013 ..... E21 340 001.00 01.01.1982 01.02.1988

♦ Eliminar todas as ocorrências de uma tabela

DELETE FROM TESTPROJ

Depois:
PCOD PROJNOME DEPT RESP EQUIPE DATAINI DATAFIM
DDL

DATA DEFINITION LANGUAGE


DDL

A Data Definition Language(DDL) faz parte das instruções SQL e divide-


se em três grupos.

1. CREATE Definição de objetos


2. ALTER Alteração da definição dos objetos
3. DROP Eliminação de objetos

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 o proprietário dos objetos.
STORAGE GROUP

O nome de um STORAGE GROUP não deve ultrapassar 8 caracteres

Podem ser especificados até 133 volumes do mesmo device type no


parâmetro VOLUMES.

VCAT aponta para o catálogo ICF que qualificará os Datasets dos


Tablespaces e dos Indexspaces.

Exemplos:

Para criação de um Storage Group

CREATE STOGROUP CURXSG01


VOLUMES(PRD510)
VCAT DES;
COMMIT;

Alteração de um Storage Group:

ALTER STOGROUP CURXSG01


ADD VOLUMES(PRD512, PRD513)
REMOVE VOLUMES(PRD510);
COMMIT;

ALTER STOGROUP CURXSG01


VCAT CUR;
COMMIT;
DATABASE

O Database é uma definição lógica, onde podemos agrupar todos os


Tablespaces, Tabelas, Índices com o mesmo critério de administração.

Autorização necessária para Criação de um DATABASE

Privilégio de CREATEDBA
Privilégio de CREATEDBC
Autoridade de SYSADM ou SYSCTRL

CREATE DATABASE CURXSG01


BUFFERPOOL BP0
STOGROUP CURXSG01;
COMMIT;

Parâmetros do Create DATABASE

1. BUFFERPOOL Indica o Buffer pool default para os Tablespaces e


Índices deste Database.
2. STOGROUP Indica o Stogroup default para todos os Objetos
deste Database.
TABLESPACE

É uma VSAM LDS, onde serão definidas as tabelas.


Existem 3 tipos de Tablespaces:
1. SIMPLES As páginas de seus datasets contém dados de
uma ou mais tabelas. Aqui na CEF não utilizamos este tipo de
Tablespace.
2. Segmentado É dividido em segmentos que variam de 4 a 64
páginas e sempre em múltiplos de 4. E cada segmento só pode
conter ocorrências de uma única tabela, tamanho máximo deste
tipo de tablespace é 2Gbytes.
3. Particionado Utilizada para tabelas com grande quantidade
de dados, podendo chegar até 64Gbytes, assim distribuídos:
• Até 16 Partições Cada partição com 4Gbytes
• de 17 a 32 Partições Cada partição com 2Gbytes

• de 33 a 64 Partições Cada partição com 1Gbytes

Exemplo de Criação de Tablespace SEGMENTADO.

CREATE TABLESPACE CURXTS01 IN CURXDB01


USING STOGROUP CURXSG01
PRIQTY 144
SECQTY 48
ERASE NO
LOCKSIZE ANY
BUFFERPOOL BP0
CLOSE NO
FREEPAGE 4
PCTFREE 25
SEGSIZE 8;
COMMIT;

ALTER TABLESPACE CURXDB01.CURXTS01


PRIQTY 240
USING STOGROUP CURXSG02;
COMMIT;
TABLESPACE

Parâmetros

♦ PRIQTY, SECQTY - Área de alocação em Kbytes.


♦ LOCKSIZE - Tipo de Locking, as opções são:
◊ Any - É o valor default , com este valor a decisão
pelo Locking fica por conta do DB2.
◊ Tablespace - Locking pelo tablespace
◊ Table - Locking pela Tabela
◊ PAGE - Locking por página
◊ ROW - Locking por Linha
♦ ERASE - Especifica se o espaço ocupado pelo
datasets devem ser preenchidos com zero quando forem eliminados
(DROP).
♦ CLOSE - Especifica se o Dataset do tablespace
deve ser fechado quando não esta sendo utilizado.
♦ 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 á 255. Se o tablespace é
segmentado, o número deve ser menor que o tamanho do segmento.
♦ PCTFREE - Especifica qual é a fração percentual
das páginas que devem ser mantidas livres quando o tablespace é
carregado ou reorganizado.
♦ SEGSIZE - Se especificado, determina que o
tablespace será segmentado. O tamanho de um segmento é dado em
quantidade de páginas, deve ser inteiro múltiplos de 4, variando de 4 á
64.
♦ NUMPARTS - Parâmetro mutuamente exclusivo como o
SEGSIZE, quando especificado indica que o Tablespace será
Particionado, é acompanhado de um número que indica a quantidade de
partições. Este número pode variar de 1 á 64.

Se nem SEGSIZE e nem NUMPARTS forem especificados, o Tablespace


será Simples.
TABLE

É um conjunto de linhas coma as mesmas colunas. Os atributos das colunas


dever ser do tipo:

♦ NOT NULL Preenchimento obrigatório


♦ NOT NULL WITH DEFAULT Quando não preenchido,
assume o valor default
♦ NULL Preenchimento opcional

Definições para colunas numéricas:


♦ SMALLINT Inteiros, valor entre -32768 a 32767
♦ INTEGER Inteiros, valor entre -2147483648 a
2147483648
♦ DECIMAL (x,y) x=Dígitos e y=Decimais, até 31 Dígitos
♦ FLOAT Ponto Flutuante 5.4E-79 TO 7.2E+75

Smallint é uma halfword (2bytes)


Integer é uma fullword(4bytes)
Decimal armazena números em decimal compactado. A faixa de valores
depende da quantidade de casas decimais.

Definições para colunas alfanuméricas:


♦ CHAR(x) String de tamanho fixo, máximo 254
caracteres
♦ VARCHAR(x) String de tamanho variável, onde x pode
variar de 0 a 4096 caracter.

Uma página DB2 não é totalmente utilizada para os dados pois existe um
espaço ocupado para informação de controle.

Definições para colunas DBCS:


♦ GRAPHIC(x) String de tamanho fixo, máximo 127 caracteres.
♦ VARGRAPHIC(x) String de tamanho variável, onde x pode variar
de 0 a 2048 caracteres.

Double Byte Caracter são caracteres especiais como ideogramas asiáticos


que requerem 2 bytes para serem identificados.
TABLE

CREATE TABLE SICUR.CURXTB01FUNCAO


(CODIGO SMALLINT NOT NULL,
DESC_FUNCAO CHAR(20) NOT NULL,
DATA_INCLUSAO DATE NOT NULL,
PRIMARY KEY
(CODIGO))
IN CURXDB01.CURXTS01;

CREATE TABLE SICUR.CURXTB02CONCEITOS


( MATR CHAR(9) NOT NULL,
ALUNO CHAR(30) NOT NULL.
FUNCAO SMALLINT NOT NULL,
NOTA SMALLINT ,
CLASSIFICACAO SMALLINT ,
PRIMARY KEY(
MATR ,
ALUNO ),
FOREIGN KEY (FUNCAO) REFERENCES SICUR.CURXTB01FUNCAO
ON DELETE CASCADE)
IN CURXDB01.CURXTS01;

ALTER TABLE SICUR.CURXTB02CONCEITO


ADD DT_PROVA DATE ;
COMMIT;

• PRIMARY KEY
• Especifica a chave primária da tabela, sendo que a chave
pode ser composta de até 64 colunas. O comprimento de uma
chave primária não pode exceder 254 bytes. Apenas uma chave
primária é permitida por tabela.
• FOREIGN KEY
• Especifica a chave estrangeira da tabela. A definição de uma
chave estrangeira deve ser igual tamanho e tipo de dados. A
palavra chave REFERENCES identifica a tabela mãe (Parent
table). A Palavra chave ON DELETE especifica a regra de
deleção.
ÍNDICE

É utilizado para agilizar o acesso aos dados.

CREATE [ UNIQUE ] INDEX SICUR.CURXPX02


ON SICUR.CURXTB02CONCEITO
(MATR ASC,
ALUNO ASC)
USING STOGROUP CURXSG02
PRIQTY 48
SECQTY 48
ERASE NO
BUFFERPOOL BP1
CLOSE YES
FREEPAGE 4
PCTFREE 15
CLUSTER;
COMMIT;

ALTER INDEX CURXPX02


USING STOGROUP CURXPX02
PRIQTY 192
CLOSE YES ;
COMMIT;

Parâmetros:

♦ UNIQUE Palavra chave que indica que o índice não


permite duplicidade nas colunas compostas
neste índice.
♦ CLUSTER Indica que o dados devem estar
clusterizado
pelo índice
VIEW

A View pode poder um subconjuto de uma ou mais tabelas.


Uma view é um objeto lógico e assim, seus dados não ocupam espaço físico.

CREATE VIEW SIXXX.CURXVW01JUNCAO


(CODIGO, FUNCAO, ALUNO)
AS
SELECT CODIGO, DESC_FUNCAO, ALUNO
FROM SICUR.CURXTB02CONCEITO INNER JOIN
SICUR.CURXTB01FUNCAO
ON CODIGO = FUNCAO;
COMMIT;

SYNONYM E ALIAS

CREATE SYNONYM FUNCAO FOR SICUR.CURXTB01FUNCAO;


COMMIT;

CREATE ALIAS CONCEITO FROM SICUR.CURXTB02CONCEITO;


COMMIT;

Diferença entre e o SYNONYM e ALIAS:

SYNONYM é restrita a um AUTH-ID.


ALIAS é de uso compartilhado a todos.
DROP

Usado para eliminar qualquer objeto criado a partir de um comando


CREATE no DB2.

♦ DROP DATABASE CURXDB01


Quando se elimina um Database, todos os objetos vinculados à ele
também são eliminados, tais como TABLESPACE, TABLE, INDEX, VIEW,
ALIAS e SYNONYM.

♦ DROP TABLESPACE CURXDB01.CURXTS01


A sua eliminação acarreta a eliminação de Table, Index, View, Alias,
Synonym e Relacionamentos vinculadas a qualquer objeto deste
Tablespace, deleta fisicamente do Disco.

♦ DROP TABLE SICUR.CURXTB01FUNCAO


A eliminação vem acompanhada da eliminação de Index, View, Alias,
Synonym e Relacionamento.

♦ DROP INDEX SICUR.CURXPX01


Elimina o Índice, inclusive o INDEXSPACE.

♦ DROP VIEW SICUR.CURXVW01


Elimina logicamente do DB2 o apontamento dos dados para a VIEW.

♦ DROP SYNONYM/ALIAS CONCEITO


Elimina Sinônimo/Alias

♦ DROP STOGROUP CURXSG01


Só podemos eliminar este objeto se o mesmo não estiver mais sendo
referenciado por um outro objeto.
SQL ESTÁTICO vs. SQL DINÂMICO

♦ ESTÁTICO
.....................................................
..................................................... Instrução SQL Completa
Exec SQL Fixo
Delete from Dept
End-Exec.
..................................................... Estratégia de
acesso ..................................................... pré-estabelecida.
.....................................................

♦ DINÂMICO
.....................................................
Var . Instrução SQL fornecida
durante a execução.
.....................................................
Exec SQL Estratégia de acesso
Execute Immediate : Var pré-estabelecida.
End-Exec
.....................................................
Delete from Dept

Notas:

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 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áusulas WHERE é candidata a estático.
Exemplo: WHERE SALARIO = :SAL AND NOME LIKE :STR
PROGRAMAÇÃO EM SQL

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 a manipular linhas de uma tabela como se
estivesse trabalhando com um arquivo comum.

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.

♦ Instrução SQL entre delimitadores.


EXEC SQL DELETE FROM DEPT END-EXEC

Os 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 tratados antes de serem
submetidas ao compilador.

Cada linguagem tem seu delimitador próprio para isolar as instruções SQL.
O delimitador que indica o início de uma instrução SQL é comum á todas
as linguagens.
VARIÁVEL HOST

As 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 da variável HOST é a de fornecer um valor a


uma instrução AQL, tornando-a assim uma instrução genérica.

A referencia á variável HOST deve ser precedida pelo caracter “:”. Seu
uso é facultativo mas recomenda-se sua utilização para evitar
possibilidade de confusão.

O uso da variável HOST é opcional. Seu uso é obrigatório somente para as


instruções SELECT.

A variável HOST deve ser compatível com a coluna quanto ao seu data
type e ao seu tamanho.

As variáveis HOST não devem ser utilizadas para referenciar nomes de


tabelas ou de colunas.

Exemplo de Variáveis HOST:

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

EXEC SQL
UPDATE EMPR
SET SALARIO = SALARIO * :PERCENT
WHERE CARGO = :CARGO
END-EXEC

EXEC SQL
SELECT MATR, SOBRENOME
INTO :MATR, :SNOME
FROM EMPR
WHERE CARGO = :CARGO
END-EXEC
PROCESSAMENTO DE MÚLTIPLAS LINHAS

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.


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.

SELECT OPEN
MATR SOBRENOME
30 SILVA
290 SANTOS
300 ALMEIDA

FETCH
MATR SOBRENOME
30 SILVA
290 SANTOS
300 ALMEIDA

FETCH
MATR SOBRENOME
30 SILVA
290 SANTOS
300 ALMEIDA
SELECT COM FETCH

♦ Definição de um CURSOR

EXEC SQL
DECALRE CUR001 CURSOR FOR
SELECT MATR, SOBRENOME
FROM EMPR
WHERE DEPT = :DEPT
END-EXEC

♦ Abrindo um CURSOR previamente definido.

EXEC SQL OPEN CUR001 END-EXEC

♦ FETCH das linhas resultantes

EXEC SQL
FETCH CUR001 INTO :MATR, :SNOM
END-EXEC

♦ Fechando o CURSOR quando terminar a leitura dos dados.

EXEC SQL CLOSE CUR001 END-EXEC

♦ 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 no CURSOR não implica em COMMIT.


COMMIT / ROLLBACK

• COMMIT
• Indica término bem sucedido de uma unidade de trabalho
• Alteração dos dados serão gravadas.
• Todas os PAGE LOCKS serão liberados
• CURSOR fechado, exceto para CURSOR WITH HOLD

• ROLLBACK
• Unidade de trabalho corrente é abandonado
• Atualização dos dados desde o último COMMIT são desfeitas
• Todos os PAGE LOCKS são liberados
• CURSOR fechado
BIND

Preparação de Programa

Código Fonte
SQL

Biblioteca de
Include

PRECOMPILAÇÃO

DBRM
Código Fonte Biblioteca de
Modificado Usuário

Catálogo DB2

Compilação BIND Descrição da tabela

Autorização
Módulo Objeto
DBRM

Linkedição
Diretório

Plano/Package

Módulo de Carga

Language Interface Execução


BIND

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 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. Mas sua função é
gerar a partir de fonte dois data set’s selados com um Timestamp. Os
data set’s gerados são:

• DBRM (Database Request Module)


• Contém todas as instruções SQL embutidas no fonte.

• Fonte Modificada
• 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
copiados a partir de uma biblioteca de INCLUDE (DCLGEN – book
das tabelas)

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 é gerado.

O compilador gera o módulo objeto a partir do fonte modificado pelo


precompilador. O Timestamp é copiado do fonte.
BIND

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.

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 do SQL
• E outros

A fase de compilação/Linkedição e a fase de BIND são executadas


separadamente e podem ser executadas em qualquer ordem.
BIND

O propósito de BIND é a geração do Plano ou de um Package. Á partir do


DBRM e do catálogo são executados os seguintes procedimentos:

• Checagem das consistências 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 da


manipulação, pelo otimizador do DB2.

• Plano/Package é armazenado no diretório e uma cópia do


DBRM é carregado no Catálogo.

• BIND ADD
Utilizado para criar um novo Plano/Package

• BIND REPLACE
Utilizado quando a própria instrução SQL foi alterada e queremos
refazer o Plano/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 índices ou atualizações das estatística do
Catálogo.
BIND

BIND ADD REBIND BIND REPLACE

Adiciona Refaz Plano Refaz Plano


Plano Novo (Ambiente alterado) (SQL Alterado)

OTIMIZADOR

PLANO
DBRM PACKAGE

DBRM CATÁLOGO DIRETÓRIO


SEGURANÇA INTERNA DO DB2

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

Quando existe uma solicitação de atividade, o DB2 verifica três fatores:

Auth-id - Quem fez a solicitação?


Privilégios - O que se deseja fazer com o recurso?
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ário e é informado ao
DB2 através do monitor de transações.

TABELAS SELECT
VIEW UPDATE [Lista de colunas]
INSERT

PLANOS BIND
PACKAGES EXECUTE

STOGROUP
BUFFERPOOL USE
TABLESPACE

SYSADM
DB2 RECOVER
TRACE, etc..

DBADM
DATABASE CREATETS
LOAD, etc..
SEGURANÇA INTERNA DO DB2

Recursos DB2

Podemos proteger:

• OBJETOS
• Tabela, View

• PLANOS/PACKAGES
• Programas, QMF, SPUFI

• COMANDOS DB2
• -Bind, -Display

• UTILITÁRIS DB2
• Load, Recover

• RECURSOS DO SISTEMA
• Buffer, Storage Group

ATRIBUIÇÃO DE AUTORIDADE

Instrução SQL

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

Privilégio
REVOKE Sobre FROM AUTH-ID
+ Recurso + +

Exemplo: GRANT SELECT ON EMPR TO PUBLIC


REVOKE SELECT FROM EMPR FROM PUBLIC
UTLITÁRIOS DO DB2

Divididos em 3 grandes grupos:

• ONLINE
1. LOAD Carga de arquivo sequencial para uma
tabela.
2. CHECK INDEX Checa a consistência entre o Índex e os
Dados.
3. CHECK DATA Checa a integridade entre a Chave
Primária e a Chave estrangeira.
4. REORG Reorganiza um Tablespace, Partição de
um Tablespace ou Índex.
5. RUNSTATS Atualiza informações do catálogo sobre
os Tablespaces e Indexes.
6. STOSPACE Atualiza informações sobre a utilização
em Disco do Storage Group.
7. COPY Copia um Tablespace para um dataset
Sequencial
8. MERGECOPY Utilizado para juntar um ImageCopy FULL
com outro Incremental.
9. RECOVER Recuperação de um Tablespace, Partição
ou Recuperação de Índex.
10. QUIESCE Estabelece um ponto de sincronismo de
uma lista de tablespaces.
11. MODIFY Manutenção no catálogo DB2.
12. REPORT Listas informações de Recovery para
Tablespaces.
13. REPAIR Função de reparo físico em Disco.

• OFFLINE

1. CHANGE LOG INVENTORY Atualiza log datasets no


BSDS.
2. PRINT LOG MAP Listas dados de Log BSDS.
3. UTLITÁRIOS DO DB2(Continuação)

• SERVICE AIDS

1. DSN1COPY Trata user data por data set


2. DSN1PRNT Listas e formatas data set pages
3. DSN1COMP Estimativas de espaços a ser
arquivados(DB2)
4. DSN1LOGP Lê o conteúdo da Log e formata para
display.
5. DSN1CHKR Verifica a Integridade dos diretórios e
catálogo.
6. DSNTIAUL Unload de tabelas para uma arquivo
sequencial.
7. DSNTEP2 Para emissão de SQL dinâmico.
8. DSNTIAD Para emissão de SQL dinâmico exceto
SELECT.

SYSIBM.SYSUTILX

Uma Tabela de Diretório DB2.

JOB UTILITY CHECKPOINT


UTILID NOME NOME INFORMAÇÃO....

Identificador
Único

Coluna é inserida no Início do Utility.


Coluna é atualizada em Pontos de Checkpoints e Parada de Utility.
Coluna eliminada quando do termino do Utility.
LOAD

• Faz carga de arquivo sequencial para um Tablespace

Pode se carregar múltiplas tabelas em um mesmo Tablespace


Conversão de dados serão feitas.

• Construir Índices definidos

Índice único não permite chaves duplicadas

• Checagem Integridade

Cada chave estrangeira deve conter uma chave primária


correspondente.

Pode ser inibida esta checagem.

Notas:

Os dados podem ser carregado de 2 maneiras:

1. Através do INSERT (SQL).


2. Através do Utilitário LOAD.

Só não serão carregadas as tabelas:

Se a conversão dos dados forem diferentes do formato do


Tablespace
Se os Índices únicos detectar violações.
Caso haja relacionamento não existir a chave primária.
LOAD

Definição da Tabela:

CREATE TABLE PROD.EMPRESA


(NOME_EMPRESA CHAR(6) NOT NULL,
PRIMEIRO_NOME VARCHA(12) NOT NULL,
INTERM_NOME CHAR(1) NOT NULL,
ULTIMO_NOME VARCHAR(15) NOT NULL,
FONE CHAR(4) ,
SALARIO DECIMAL(8,2) ,
DEPTO CHAR(3) ,
PRIMARY KEY(NOME_EMPRESA),
FOREIGN KEY(DEPTO)
REFERNCES DEPT
ON DELETE SET NULL)
IN TESTEDB1.TESTTSP1;

Exemplo do Registo para o LOAD:


....+.....1....+....2....+....3....+....4....+....5....+....6....+....7
000010 KARINA L BEZERRA A00 3978 650101 66 18 F 330814 52750

LOAD – JCL

//LOADTEST EXEC DSNUPROC,....


//DSNUPROC.SYSREC DD DSN=ARQUIVO.ENTRADA ,DISP=SHR
//DSNUPROC.SYSUT1 DD DSN=ARQUIVO.SYSUT1,DISP=( MOD,DELETE,CATLG),...
//DSNUPROC.SORTOUT DD
DSN=ARQUIVO.SORTOUT,DISP=(MOD,DELETE,CATLG),...
//DSNUPROC.SYSERR DD DSN=ARQUIVO.SYSERR,DISP=(MOD,DELETE,CATLG),...
//DSNUPROC.SYSMAP DD DSN=ARQIVO.SYSMAP,DISP=(MOD,DELETE,CATLG),...
//DSNUPROC.SYSIN DD *
LOAD DATA INTO TABLE PROD.EMPRESA WHEN (32:34) = ‘A00’
(NOME_EMPRESA POSITION (1:6),
PRIMEIRO_NOME POSITION(8:16) CHAR,
INTERM_NOME POSITION(19),
ULTIMO_NOME POSITION(21:30) CHAR,
DEPTO POSITION(32:34),
FONE POSITION(36:39) NULLIF PHONE = ‘ ‘,
SALARIO POSITION(65:69) DECIMAL EXTERNAL)
LOAD

Load Logging

O default é LOG YES, a vantagem de não ser necessário fazer ImageCopy


após a carga. Mas deve ser usar com critérios:
Carregar uma tabela em um Tablespace compartilhado
Carga e em tabelas pequenas
Carga com RESUME YES

Quando o volume de carga é grande, deve ser usar LOG NO, pois isto evita
uma trabalho do DB2 para registrar cada registro na LOG, e
consequentemente a LOG poderá ficar mais tempo em DISCO para um
possível RECOVERY.

• LOG YES
Cada página será registrada na LOG.

• LOG NO
• Carga mais rápida
• Requer ImageCopy
• Modificação por SQL não permitida enquanto não fizer o
ImageCopy
- SQL error code –904

LOAD RESUME NO
REPLACE

LOAD RESUME YES

LOAD RESUME NO
(Cond. Code = 8)
TABLESPACE
LOAD

LOAD RESUME NO
Usada somente quando a tabela estiver vazia, caso haja algum
registro na tabela ocorrerá abend com Return-Code 8.

LOAD RESUME YES


Opção para adicionar novas ocorrências na tabela.

LOAD RESUME NO REPLACE


Opção para carregar novas ocorrências na tabela eliminando todas
as ocorrências existentes dentro da tabelas.

A Variação do LOAD permite trabalhar a nível de Partição.

LOAD INTO TABLE tabelax PART x RESUME NO


Carrega ocorrências em uma partição vazia

LOAD INTO TABLE tabelax PART x RESUME YES


Adiciona novas ocorrências à partição.

LOAD INTO TABLE tabelax PART x RESUME YES REPLACE


Carrega ocorrências em uma única partição, eliminando as
ocorrências existente na partição.

Violação de Índice Único

Quando do LOAD, se inserido duas ou mais ocorrências com a mesma


chave o DB2 descartas todas as ocorrências deste LOAD.

CHAVE ENTRADA CARGA NA TABELA DESCARTES


A A
B B
C C
D D
B B
LOAD

Integridade Referencial

• ENFORCES CONSTRAINTS é o default.


• Verifica se existe uma chave primária para a chave
estrangeira.
• Pode se inibido com ENFORCE NO
• Se encontrado Violação, a ocorrência é eliminada.

Saída
FASES DO LOAD Tabela

Dados de Entrada Sysut1


(SYSREC)
RELOAD

Syserr

Sysmap

Sysut1 Sortout
SORT

Sortout Sysut1
Sysut1 BUILD Syserr

Indexes

Sysut1 Saída
Syserr IDEXVAL
Tabelas
FASES DO LOAD

Sysut1 Sysut1

Sortout Saída
ENFORCES
Tabelas

Parent Sortout
Tables Syserr

Dados entrada
(SYSREC)

Sortout Sysdisc
DISCARD
Syserr

Sysmap

Sortout REPORT Relatório


Sumário
Syserr
FASES DO LOAD

RELOAD
Esta fase faz a carga do sequencial para a Tabela, Armazena as
chaves dos índices e chave estrangeira não indexados (Se ENFORCE
CONSTRAINTS) na SYSUT1.

O DD SYSDISC conterá as ocorrências descartadas

Caso ocorra algum este requer:


SYSERR - Qualquer erro será armazenado.
Se SYSERR não informado, o RELOAD abend antes de
qualquer carga de dados.

Se descartes não requerido. Reload termina no primeiro error.

Se SYSMAP é necessário (Violação de chave Única ou Violação RI),


informações da posição da ocorrência no SYSREC.

SORT
Sorteia o registros da SYSUT1 pelo Chave do índices, e Chaves
estrangeiras seguem a chave indexadas.

O SORT pode ser inibido em uma das condições:


Não existe mais que um chave por tabela
O dados carregados já estão em sequência.
Todas as chaves devem ser do mesmo tipo.

BUILD
Constrói os Índice do SORTOUT e adiciona informações de erros na
SYSERR, e informações na SYSUT1 caso não ocorra erros.

INDEXVAL
Das informações recolhidas dos SYSERR/SYSUT1 são removidas as
ocorrências da tabelas.
FASES DO LOAD

ENFORCE
De acordo com o SORTOUT, e o relacionamento definido para a
tabela, esta fase faz a checagem para a violação da RI. A Checagem
envolves a tabela mãe onde se verifica a chave estrangeira carregada.
Todas as ocorrências sem um ”PAI” serão removidos da tabela, e
incluída na SYSDISC.

REPORT
Listas um relatório de sumário contendo os erros.

Recomendações:

• Pré processamento para remover os erros.


• Sorteia os dados de entradas na sequência da clusterização.
• Criar todos os índices antes de carregar os dados.
• Use LOG NO para evitar excessivo I/O na LOG
• Carregar primeiros as PARENT TABLES (Tabelas mães).
• Preferir sempre ENFORCE CONSTRAINTS.
• Usar BLKSIZE otimizado para SYSUT1, SORTOUT e SORTWWKxx
CHECK DATA

Checa todas as chaves estrangeiras de uma lista de tablespaces com os


valores de chaves primárias correspondentes.

Checa todas as ocorrências dependentes, ou somente as adicionadas pelo


LOAD.

Opcionalmente copia ocorrências ‘Órfã’ para uma tabela de exceção, e


elimina a ocorrência da tabela ou não.

Tirar do Status de CHECK PENDING

Nenhuma violação foi detectado, ou


Erros são eliminados com a opção DELETE YES.

//DSNUPROC. SYSIN DD *
CHECK DATA
TABLESPACE PRD.EMPRESA
TABLESPACE PRD.DEPTO
SCOPE
PENDING ou ALL
FOR EXCEPTION
IN PRD.EMPRESA USE prd.EmpresaX
IN PRD.DEPTO USE prd.DeptoX
DELETE
YES ou NÃO
EXCEPTIN n

Se SCOPE ALL checa todas as chaves estrangeiras de um tablespaces.


Se SCOPE PENDING checa apenas as chaves estrangeiras adicionada pelo
LOAD.
DELETE YES deleta todas as ocorrências “’ÓRFÔ de um Tablespace
EXCEPTIONS especifica os limite de exceção, quando excede este limite
o CHECK termina.
FASES DO CHECK DATA

Repetida para Dependent Table (Tabela “FILHA”)

Dependent table SYSUT1

SCANTAB

SYSUT1 SORTOUT

SORT

Sortout/Índice chave estrangeira


SYSERR
SCANTAB

Índice chave Primária

Dependent/Descendent Tables Tabela Exceção

REPORTCK
SYSERR Relatório de Sumário
FASES DO CHECK DATA

1. SCANTAB
Esta fase extrai as chaves estrangeiras necessárias e grava no
SYSUT1

2. SORT
Sorteia a entradas contidas no SYSUT1 pelo nome da constraints e o
valor da chave estrangeira.

3. CHECKDAT
Esta fase produz um erro para cada chave estrangeira não encontrada.

4. REPORTCK
Se DELETE YES especificado, este fase deleta as ocorrências, e copia
para a tabela de Exceção. Produz também um Relatório de sumarização
para cada tabela.

5. UTILTERM
Esta fase termina o processo.
CHECK INDEX

O CHECK INDEX testa a consistência entre o dados e o Índices. O


Check procura a inconsistência e emite uma mensagem de erro,
descrevendo qual o problema.

Exemplos de SYSIN:

//DSNUPROC.SYSIN DD *
CHECK INDEX NAME(prd.indice1, prd.index2)
CHECK INDEX(prd.indice1 PART 3)
CHECK INDEX(ALL) TABLESPACE PRD.EMPRESA

FASES DO CHECK INDEX

Índices UNLOAD Sysut1

Sysut1 SORT Sysut1

Sysut1

Relatório
Sumário
CHECKINDEX

Tabelas
REORG

• A fase de UNLOAD dos registros de uma tabela.


Descarrega as ocorrências na sequência do Índice de clusterização

• Fase de RELOAD
carrega os dados de volta a tabela, respeitando os FREE PAGE,
PCTFREE, etc.

• FASE de SORT
Sorteia as chaves dos índices contidas no SYSUT1, gravando no
SORTOUT.

• Fase de BUILD
Reconstroí os Índices com a saída do SORT.

FASES DO REORG

Table
space UNLOAD

Saída dos Dados


(SYSREC)
Entrada dos Dados
Table
(SYSREC) space
RELOAD

Sysut1

Sysut1 Sortout
SORT

Indexes
Sortout BUILD
REORG

UNLOAD CONTINUE

RESTART

UNLOAD PAUSE
STOP
Edit/Field Field/Edit

UNLOAD ONLY TERMINATE LOAD REPLACE


Edit/Field Validation/Field/Edit

Existem 3 opção de UNLOAD para o utilitário REORG.

1. Unload Continue
Todas as fases serão concluídas em uma execução
2. Unload Pause
O Utilitário é parado após o Unload do Tablespace ou Índices.
O Utilitário deve ser reestartdo para completar
O Edit and Field são invocados duranto o Unload e Reload Fases.
3. Unload Only
Após a fase de Unload é terminado o Utilid
A saída pode ser usada como entrada do utilitário LOAD.
REORG

Exemplos de SYSIN:
//DSNUPROC.SYSIND DD *
REORG TABLESPACE PRD.EMPRESA UNLOAD CONTINUE LOG NO
REORG TABLESPACE PRD.EMPRESA UNLOAD PAUSE LOG NO
REORG TABLESPACE PRD.EMPRESA UNLOAD ONLY
REORG TABLESPACE PRD.EMPRESA PART 3
REORG INDEX PRD.ÍNDICE1
COPY

Cria um Backup do Tablespace

COPY TABLESPACE CURXDB01.CURXTS01


FULL YES SHRLEVEL REFERENCE
Permite Atualização
Leitura compartilhada

Se não quiser compartilhar acesso a base, emita o comando no DB2:


-START DB(CURXDB01) SPACE(CURXTS01) ACCESS(UT)

Assim somente utilitários podem agir sobre os Objetos.

• Controle de Cópia Incremental

SPACE
MAP
PAGE

Altera Indicadores de Páginas

Altera bit no HEADER

DATA
PAGE

• O Copy Full e Incremental desliga o bit.


• Fazer sempre Image Copy FULL após REORG LOG NO ou LOAD LOG
NO.
• Se mais que 15% das páginas foram alteradas, opte por COPY FULL.
• Especifique DISP=(MOD,CATLG) para permitir restart do utilitário.
MERGECOPY

MERGECOPY

Image Copys Incremental Merge Image Copy


Incremental

SYSIN:
MERGECOPY TABLESPACE PRD.EMPRESA NEWCOPY NO

Incremental

MERGECOPY

Full Full Image Copy

SYSIN:
MERGECOPY TABLESPACE PRD.EMPRESA NEWCOPY YES

NEWCOPY YES insere um apontamentos no catalogo DB2 como FULL


Image Copy.

NEWCOPY NO atualiza os registros com Image Copy Incremental.


RECOVERY

TABLESPACE
RECOVER TABLESPACE CURXDB01.EMPRESA
TABLESPACE CURXDB01.DEPTO

DATASET
RECOVER TABLESPACE CURXDB01.EMPRESA DSNUM 3
TABLESPACE CURXDB01.DEPTO DSNUM 2

Funções do Utilitário RECOVER

1. Inicialização
2. Alocação Dinâmica se não existir apontamento no statements DD
3. Define os datasets do Tablespaces.
4. Image Copy Merge e Restaura
5. Aplica a log.

Índices e Tablespace DB2 podem ser copiados por este utilitário não DB2.

DB2 RECOVER aceita somente as seguintes entradas:


Image Copy + Log
Image Copy somente
Logs DB2 somente
RECOVERY

IMAGECOPY
22:00 EMPRESA FULL YES

RUN PROGRAM
22:20 XYZ

Descobre que programa


08:45 Atualizou dados errados

Restaurar a partir do Último


09:00 Image Copy

PONTOS DE RECOVERY

Permite restaurar ate:

Um especifico Full ou Incremental Image Copy


RECOVER .... TOCOPY I.D15.CUR.DBP0TS01.G0001V00

Um especifico LOG RBA.


RECOVER .... TORBA X’005E00123456’
QUIESCE

Verifica restrições para os tablespaces especificados e cria um ponto de


consistência para eles. Para cada tabespace, o Quiesce cria uma entrada
na SYSCOPY com RBA válido para a recuperação.

QUIESCE TABLESPACE CURXDB01.CURXTS01


TABLESPACE CURXDB01.CURXTS02

REPORT

Listas dados sobre Tablespaces. O relatório pode Ter 2 tipos de saídas:


• TABLESPACESET – Tablespace e tabelas que participam de
Relacionamento de Integridade Relacional (RI).
• RECOVERY - Informações de recuperação a partir do catálogo,
diretório e BSDS.

REPORT TABLESPACESET TABLESPACE CURXDB01.CURXTS01


REPORT RECOVERY TABLESPACE CURXDB01.CURXTS01.
INDEX RECOVERY

Fase UNLOAD Fase SORT Fase BUILD

Index1
UNLOAD
Sysut1

BUILD

Arquivo de Trabalho
SORT
Index2

Tablespace
Sysut1

Exemplos de SYSIN:
RECOVER INDEX(PRD.INDICE1, PRD.INDICE2)
RECOVER INDEX (ALL) TABLESPACE PRDXDB01.EMPRESA
RECOVER INDEX(PRD.INDICE1 PART 2)
RECOVERY PENDING

Tablespace ou Index deve ser recuperado


1. RECP significa que a partição de um Index ou Tablespace
esta pendente
2. PSRCP significa que a entrada de um Index não particionado
esta com RECOVERY Pendente.
Acesso proibido exceto para:
1. RECOVER
2. LOAD REPLACE
3. REPAIR
4. MERGE COPY

-DISPLAY DB revela os status RECP/PSRCP

RECP/PSRCP é resetado por:


1. RECOVER tablespace ou Index
2. LOAD REPLACE
3. REPAIR com SET NORCVRPEND
4. START DB .... ACCESS(FORCE)

RECOVERY PENDING segue as seguintes condições:

Condição UTILITÁRIO FASE OBJETOS colocado em RECP


Term Util Recover TS -------- TABLESPACE
Term Util Recover Index BUILD Índice ainda não construídos
RELOAD Tablespace, Partições e Índices
Term Util Reorg/Load SORT Todos os Índices
BUILD Índice ainda não construídos
Point in Time Recover -------- Todos os Índices
TS Recovery Tablespace
MODIFY

Elimina Image Copy desnecessários e log ranges do catálogo DB2, As


entradas são da SYSCOPY e SYSLGRNG.
Possível acesso concorrente durante o MODIFY com exceção do SYSCOPY
e SYLGRNG.

Exemplo:

MODIFY RECOVERY TABLESPACE(CURXDB01.CURXTS01)


DELETE DATE(19981101).
MODIFY RECOVERY TABLESPACE(CURXDB01.CURXTS01)
DELETE AGE(90)

DELETE DATE é eliminados as ocorrências da data informada para trás


DELETE AGE todos ocorrências com a quantidades de dias maior que a
informadas serão eliminadas.

DIAGNOSE
Ajuda no diagnóstico de problemas de utilitários.
Normalmente sua utilização é a pedido do SUPORTE IBM

STOSPACE
Colhe informação de espaço alocado para cada Storage Groups,
Tablespaces e índices relacionados. A informação é registrada no
catálogo DB2.
RUNSTATS

Varre um Tablespace ou índice para atualização no catálogo de


utilização de espaço e eficiência do índices. Esses dados são
utilizados pelo otimizador do DB2.
O Runstats atualizadas as tabelas:
• Estatística usada pelo OTIMIZADOR
1. SYSTABLES
2. SYSTABLESPACE
3. SYSINDEXES
4. SYSCOLUMNS
5. SYSCOLDIST

• Outras para informações do DBA


1. SYSTABLEPART
2. SYSINDEXPART
3. SYSCOLDISTSTAS
4. SYSCOLSTATS
5. SYSINDEXSTATS
6. SYSTABSTATS

REPAIR
Repara dado do usuário, índices, catálogo, Space Map, etc.
REPAIR deve ser usado com extrema cautela.
DSNTIAUL

Permite gerar um arquivo sequencial dos dados da tabelas, e um outro com


as informações de onde inicia e termina os registros, alem das
informações necessária para o LOAD.

Exemplo do JCL:

//UNLOAD EXEC PGM=IKJEFT01,DYNAMNBR=20


//SYSUDUMP DD SYSOUT=*
//SYSTSPRT DD SYSOUT=*
//SYSPRINT DD SYSOUT=*
//SYSPUNCH DD DSN=P915537.FONTES.CAPXTS14,UNIT=SYSDA,
// DISP=(,CATLG,DELETE),SPACE=(TRK,(50,10),RLSE)
//SYSREC00 DD DSN=P915537.DADOS.CAPXTS14,UNIT=SYSDA,
// DISP=(,CATLG,DELETE),SPACE=(CYL,(80,05),RLSE)
//SYSTSIN DD *
DSN SYSTEM(DBP0)
RUN PROGRAM(DSNTIAUL) PLAN(DSNTIB41) PARMS('SQL') -
LIB('DB2P1.V4R1M0.RUNLIB.LOAD')
//SYSIN DD *
SELECT * FROM SICAP.CAPXTB14ENTRADA
;
/*
COMANDOS DB2

Principais comandos DB2


• -DIS DB(ABE*) SPACE(*) LIMIT(*)
Verifica os status de todos os Tablespace e Indexspace do
DATABASE que comece com ABE.

• -DIS DB(*) SPACE(*) LIMIT(*) RESTRICT


Verifica todos os Tablespaces e Indexspace com alguma Restrição

• -START DB2 / -STOP DB2


Inicializa e encerra o DB2 (Comandos na console OS/390)

• -DIS UTIL(*)
Mostra todos os UTILID com seus respectivos STATUS

• -TERM UTIL(IMAGCCP)
Termina o UTILID IMAGCCP

• -START DB(ABEXDB01) SPACE(*) ACCESS(RW)


Libera todos Indexspace e Tablespaces para acesso de READ/WRITE

• -START DB(ABEXDB01) SPACE(ABEXTS12,ABEXPX12) ACCESS(UT)


Starta os Tablespace ABEXTS12 e o Indexspace ABEXPX12 somente
para acesso de utilitários DB2.

• -DIS DB(ABEXDB01) SPACE(*) LIMIT(*) LOCKS


Mostra todos os Tablespaces e Indexspaces do Database ABEXDB01 e
as respectivas alocação.

• -DIS THREAD(*)
Mostra todas as threads conectado ao DB2.