You are on page 1of 287

ÍNDICE

INTRODUÇÃO AO DB2 ................................................................................................................................................................7


O QUE É UM BANCO DE DADOS RELACIONAL ?............................................................................................................................8
DB2 É UM DBMS RELACIONAL.....................................................................................................................................................9
ESTRUTURA DE DADOS DO DB2.................................................................................................................................................. 10
NOMENCLATURA ..................................................................................................................................................................... 11
NOMENCLATURA ..................................................................................................................................................................... 12
INTEGRIDADE DE REFERÊNCIA ..................................................................................................................................................... 13
INTEGRIDADE DE REFERÊNCIA (CONT .)...................................................................................................................................... 14
INTEGRIDADE DE REFERÊNCIA (CONT .)...................................................................................................................................... 15
AMBIENTE DB2.............................................................................................................................................................................16
COEXISTÊNCIA ENTRE OS A MBIENTES........................................................................................................................................ 17
OBJETOS DB2 ................................................................................................................................................................................. 18
OBJETOS DB2 (CONT .)................................................................................................................................................................... 19
NOTAS.............................................................................................................................................................................................. 20
NOTAS (CONT .)............................................................................................................................................................................... 21
NOTAS (CONT .)............................................................................................................................................................................... 22
NOTAS (CONT .)............................................................................................................................................................................... 23
ESTRUTURA DO DB2...................................................................................................................................................................... 24
ESTRUTURA DO DB2 (CONT .)....................................................................................................................................................... 25
UTILIZAÇÃO DA LINGUAGEM SQL ...................................................................................................................................26
UTILIZAÇÃO DA LINGUAGEM SQL .............................................................................................................................................. 27
UTILIZAÇÃO DA LINGUAGEM SQL (CONT .)............................................................................................................................... 28
UTILIZAÇÃO DA LINGUAGEM SQL (CONT .)............................................................................................................................... 29
LINGUAGEM SQL........................................................................................................................................................................... 30
LINGUAGEM SQL (CONT .) ............................................................................................................................................................ 31
LINGUAGEM SQL (CONT .) ............................................................................................................................................................ 32
DDL - DATA DEFINITION LANGUAGE......................................................................................................................................... 33
CREATE TABLE............................................................................................................................................................................... 34
DADOS NUMÉRICOS....................................................................................................................................................................... 35
DADOS NUMÉRICOS (CONT .) ....................................................................................................................................................... 36
DADOS CHARACTER STRING........................................................................................................................................................ 37
DADOS DATE / TIME ...................................................................................................................................................................... 38
NULIDADE ....................................................................................................................................................................................... 39
NOT NULL WITH DEFAULT ........................................................................................................................................................... 40
CREATE VIEW................................................................................................................................................................................. 41
DML - DATA MANIPULATION LANGUAGE................................................................................................................................. 42
TABELAS USADAS NOS EXEMPLOS.............................................................................................................................................. 43
TABELAS USADAS NOS EXEMPLOS (CONT .)............................................................................................................................... 44
QUERY ............................................................................................................................................................................................. 45
QUERY EM FORMATO LIVRE ......................................................................................................................................................... 46
SELECT ...FROM ............................................................................................................................................................................... 47
SELECT DE TODAS AS COLUNAS.................................................................................................................................................. 48
CONTROLE DE LINHAS................................................................................................................................................................... 49
OPERADORES DE COMPARAÇÃO.................................................................................................................................................. 50

Domini Treinamento – DB2 para Desenvolvedores -1-


EXEMPLOS DE W HERE ................................................................................................................................................................... 51
SELEÇÃO DE NULOS....................................................................................................................................................................... 52
SELEÇÃO DE NULOS (CONT .)........................................................................................................................................................ 53
MÚLTIPLAS CONDIÇÕES................................................................................................................................................................ 54
MÚLTIPLAS CONDIÇÕES (CONT .)................................................................................................................................................. 55
MÚLTIPLAS CONDIÇÕES (CONT .)................................................................................................................................................. 56
MÚLTIPLAS CONDIÇÕES (CONT .)................................................................................................................................................. 57
IN...................................................................................................................................................................................................... 58
BETWEEN......................................................................................................................................................................................... 59
PESQUISAS PARCIAIS ..................................................................................................................................................................... 60
NEGAÇÃO ........................................................................................................................................................................................ 61
ORDER BY ....................................................................................................................................................................................... 62
ORDER BY (CONT .)......................................................................................................................................................................... 63
ORDER BY (CONT .)......................................................................................................................................................................... 64
SELECT DISTINCT ........................................................................................................................................................................... 65
SELECT DISTINCT (CONT .) ............................................................................................................................................................ 66
SELECT DE VALORES CALCULADOS............................................................................................................................................ 67
NOMEANDO A COLUNA RESULTADO............................................................................................................................................ 68
CONDIÇÕES COM VALOR CALCULADO ....................................................................................................................................... 69
‘ORDER BY’ POR VALOR CALCULADO....................................................................................................................................... 70
OPERADOR DE CONCATENAÇÃO.................................................................................................................................................. 71
FUNÇÕES DE COLUNA (COLUMN FUNCTIONS) .......................................................................................................................... 72
SUM AVG M AX MIN ...................................................................................................................................................................... 73
SUM AVG M AX MIN (CONT .)........................................................................................................................................................ 74
COUNT ............................................................................................................................................................................................. 75
CUIDADO COM NULOS................................................................................................................................................................... 76
CUIDADO COM NULOS................................................................................................................................................................... 77
LITERAIS.......................................................................................................................................................................................... 78
LITERAIS.......................................................................................................................................................................................... 79
GROUP BY ....................................................................................................................................................................................... 80
GROUP BY (CONT ).......................................................................................................................................................................... 81
GROUP BY (CONT .)......................................................................................................................................................................... 82
GROUP BY ... ORDER BY ............................................................................................................................................................... 83
GROUP BY ... HAVING ................................................................................................................................................................... 84
EXEMPLO DE HAVING.................................................................................................................................................................... 85
SELECT - 6 CLÁUSULAS............................................................................................................................................................... 86
EXECUÇÃO CONCEITUAL DO SELECT .......................................................................................................................................... 87
EXECUÇÃO CONCEITUAL DO SELECT (CONT .)........................................................................................................................... 88
EXEMPLOS DE HAVING (CONT .)................................................................................................................................................... 89
SUMÁRIO FUNÇÕES DE COLUNA.................................................................................................................................................. 90
FUNÇÕES ESCALARES (SCALAR FUNCTIONS) ............................................................................................................................ 91
FUNÇÕES ESCALARES.................................................................................................................................................................... 92
SUBSTR (STRING, INÍCIO, COMPRIMENTO).................................................................................................................................. 93
SUBSTR (STRING, INÍCIO, COMPRIMENTO) (CONT .)................................................................................................................... 94
LENGTH (ARGUMENTO)................................................................................................................................................................. 95
LENGTH (ARGUMENTO) (CONT .)............................................................................................................................................... 96
VALUE (ARG1, ARG2, ..., ARGN )................................................................................................................................................... 97
VALUE (ARG1, ARG2, ..., ARGN ) (CONT .)................................................................................................................................. 98
FUNÇÕES DE CONVERSÃO............................................................................................................................................................. 99
DADOS DA T E/T IME......................................................................................................................................................................100
ARITMÉTICA DATE/T IME ............................................................................................................................................................101
ARITMÉTICA DE DATE/T IME (CONT ).........................................................................................................................................102
EXEMPLOS DATE/TIME................................................................................................................................................................103

Domini Treinamento – DB2 para Desenvolvedores -2-


FUNÇÕES ESCALARES DATE/T IME ............................................................................................................................................104
FUNÇÕES ESCALARES DATE/T IME (CONT .)..............................................................................................................................105
FUNÇÕES ESCALARES DATE/T IME (CONT .)..............................................................................................................................106
VALORES CORRENTES.................................................................................................................................................................107
JOIN DE TABELAS .........................................................................................................................................................................108
JOIN DE TABELAS - INNER JOIN ..................................................................................................................................................109
JOIN DE TABELAS - INNER JOIN (CONT .)...............................................................................................................................110
OUTER JOIN...................................................................................................................................................................................111
JOIN COM MAIS DE DUAS TABELAS ..........................................................................................................................................112
QUALIFICADORES.........................................................................................................................................................................113
QUALIFICADORES (CONT .)..........................................................................................................................................................114
JOIN DE UMA TABELA COM ELA MESMA ...................................................................................................................................115
JOIN DE UMA TABELA COM ELA MESMA (CONT .).....................................................................................................................116
UNIÃO............................................................................................................................................................................................117
UNIÃO (CONT .).........................................................................................................................................................................118
UNIÃO - EXEMPLO......................................................................................................................................................................119
UNION ALL VS. UNION................................................................................................................................................................120
SUBQUERY.....................................................................................................................................................................................121
EXEMPLO DE SUBQUERY.............................................................................................................................................................122
CONSIDERAÇÕES SUBQUERY......................................................................................................................................................123
SUBQUERY COM UMA LINHA......................................................................................................................................................124
SUBQUERY C/VÁRIAS LINHAS: ALL ........................................................................................................................................125
SUBQUERY C/VÁRIAS LINHAS: ALL (CONT.)..........................................................................................................................126
SUBQUERY C/VÁRIAS LINHAS: A NY OU SOME .......................................................................................................................127
SUBQUERY C/VÁRIAS LINHAS: A NY OU SOME (CONT .).........................................................................................................128
IN....................................................................................................................................................................................................129
IN (CONT .).....................................................................................................................................................................................130
SUBQUERY NUM HAVING...........................................................................................................................................................131
SUBQUERY CORRELACIONADO ..................................................................................................................................................132
SUBQUERY COM EXISTS - TESTANDO V OU F........................................................................................................................133
SUBQUERY COM EXISTS............................................................................................................................................................134
MANUTENÇÃO........................................................................................................................................................................... 135
INSERT DE UMA LINHA ................................................................................................................................................................136
INSERT DE MÚLTIPLAS LINHAS..................................................................................................................................................137
UPDATE DE COLUNAS..................................................................................................................................................................138
UPDATE DE COLUNAS (CONT )....................................................................................................................................................139
DELETE DE LINHAS......................................................................................................................................................................140
DELETE DE TODAS AS LINHAS ...................................................................................................................................................141
PROGRAMAÇÃO ....................................................................................................................................................................... 142
PROGRAMA EM LINGUAGEM TRADICIONAL.............................................................................................................................143
PROGRAMAÇÃO ............................................................................................................................................................................144
INSTRUÇÃO SQL ..........................................................................................................................................................................145
INSTRUÇÃO SQL (CONT .)............................................................................................................................................................146
VARIÁVEL HOST ...........................................................................................................................................................................147
VARIÁVEL HOST (CONT .)............................................................................................................................................................148
OUTROS EXEMPLOS.....................................................................................................................................................................149
VARIÁVEL HOST (CONT .)...........................................................................................................................................................150
VARIÁVEL HOST (CONT .)...........................................................................................................................................................151
VARIÁVEL HOST (CONT .)...........................................................................................................................................................152
VARIÁVEL HOST (CONT .)...........................................................................................................................................................153
DEFINIÇÃO DE VARIÁVEL HOST ................................................................................................................................................154

Domini Treinamento – DB2 para Desenvolvedores -3-


DEFINIÇÃO DE VARIÁVEL HOST (CONT .)..................................................................................................................................155
DEFINIÇÃO DE VARIÁVEL HOST (CONT .)..................................................................................................................................156
DEFINIÇÃO DE VARIÁVEL HOST (CONT .)..................................................................................................................................157
COMMIT /ROLLBACK ....................................................................................................................................................................158
COMMIT /ROLLBACK (CONT .) .....................................................................................................................................................159
LUW ................................................................................................................................................................................................160
LUW (CONT .).................................................................................................................................................................................161
COMMIT /ROLLBACK ....................................................................................................................................................................162
SQLCA..........................................................................................................................................................................................163
SQLCA (CONT .)...........................................................................................................................................................................164
SQLCA (CONT .)...........................................................................................................................................................................165
FORMATO SQLCA .......................................................................................................................................................................166
SQL WARNING .............................................................................................................................................................................167
SQL WARNING (CONT .) ..............................................................................................................................................................168
AUXÍLIO À CODIFICAÇÃO............................................................................................................................................................169
INSTRUÇÃO WHENEVER..............................................................................................................................................................170
INSTRUÇÃO WHENEVER (CONT .)...............................................................................................................................................171
DCLGEN ......................................................................................................................................................................................172
DCLGEN (CONT .)........................................................................................................................................................................173
INSTRUÇÃO INCLUDE ...................................................................................................................................................................174
PREPARAÇÃO DE PROGRAMA COM SQL ................................................................................................................... 175
PREPARAÇÃO DE PROGRAMA COM SQL ...................................................................................................................................176
PREPARAÇÃO DE PROGRAMA COM SQL (CONT .)....................................................................................................................177
PRECOMPILADOR..........................................................................................................................................................................178
COMPILADOR / LINKAGE EDITOR / BIND ..................................................................................................................................179
VISÃO GERAL “BIND ” .................................................................................................................................................................180
VISÃO GERAL “BIND ” (CONT .)...................................................................................................................................................181
VISÃO GERAL “BIND ” (CONT .)...................................................................................................................................................182
PACKAGE ...................................................................................................................................................................................183
COLLECTION ............................................................................................................................................................................184
TOKEN DE CONSISTÊNCIA - P REP . DO P ROGRAMA ..........................................................................................185
PLANO - LIGAÇÃO ENTRE O PACKAGE E O LOAD MODULO.....................................................................................................186
PLANOS E PACKAGES...........................................................................................................................................................187
ERRO DE TIMESTAMP...........................................................................................................................................................188
BIND - OPÇÃO QUALIFIER.....................................................................................................................................................189
CURSOR..........................................................................................................................................................................................190
CURSOR (CONT .)...........................................................................................................................................................................191
SELECT COM FETCH.....................................................................................................................................................................192
PROCURE DEFINIR........................................................................................................................................................................193
PROCURE DEFINIR (CONT .).........................................................................................................................................................194
DELETE VIA CURSOR ...................................................................................................................................................................195
DELETE VIA CURSOR (CONT .)....................................................................................................................................................196
UPDATE VIA CURSOR ..................................................................................................................................................................197
UPDATE VIA CURSOR (CONT .) ...................................................................................................................................................198
MANIPULAÇÃO DE CURSOR ........................................................................................................................................................199
MANIPULAÇÃO DE CURSOR (CONT .) .........................................................................................................................................200
VARIÁVEL INDICADORA..............................................................................................................................................................201
VARIÁVEL INDICADORA (CONT .)...............................................................................................................................................202
VETOR DE VAR. INDICADORAS ..................................................................................................................................................203
VETOR DE VAR. INDICADORAS (CONT .)....................................................................................................................................204
OUTROS USOS DA VARIÁVEL INDICADORA..............................................................................................................................205

Domini Treinamento – DB2 para Desenvolvedores -4-


ERROS DE A RITMÉTICA E CONVERSÃO - EXEMPLO................................................................................................................206
USO DA VARIÁVEL INDICADORA - RESUMO ............................................................................................................................207
ESTRATÉGIA DE A CESSO .............................................................................................................................................................208
ESTRATÉGIA DE A CESSO (CONT.) ..............................................................................................................................................209
EXECUÇÃO DO PROGRAMA .........................................................................................................................................................210
EXECUÇÃO DO PROGRAMA (CONT .)..........................................................................................................................................211
CONSIDERAÇÕES SOBRE PROGRAMAÇÃO ............................................................................................................... 212
RECOMENDAÇÕES DML .............................................................................................................................................................213
RECOMENDAÇÕES DML (CONT.)...............................................................................................................................................214
RECOMENDAÇÕES DML (CONT.)...............................................................................................................................................215
RECOMENDAÇÕES DML (CONT.)...............................................................................................................................................216
USO DO ÍNDICE .............................................................................................................................................................................217
EXPRESSÕES A RITMÉTICAS ........................................................................................................................................................218
CONDIÇÕES NOT ...........................................................................................................................................................................219
USO DO “LIKE ”.............................................................................................................................................................................220
SUBQUERIES..................................................................................................................................................................................221
EXPLAIN.........................................................................................................................................................................................222
EXPLAIN (CONT .)..........................................................................................................................................................................223
EXPLAIN (CONT .)..........................................................................................................................................................................224
PLAN_TABLE.................................................................................................................................................................................225
PLAN_TABLE (CONT .)..................................................................................................................................................................226
PLAN_TABLE (CONT .)..................................................................................................................................................................227
TÓPICOS ADICIONAIS ........................................................................................................................................................... 228

LOCKING ...................................................................................................................................................................................... 229


LOCKING ........................................................................................................................................................................................230
GRANULARIDADE - LOCKSIZE TABLESPACE..........................................................................................................................231
GRANULARIDADE - LOCKSIZE TABLE......................................................................................................................................232
GRANULARIDADE - LOCKSIZE PAGE/ ANY..............................................................................................................................233
GRANULARIDADE - LOCKSIZE ROW ........................................................................................................................................234
GRANULARIDADE DO LOCK ........................................................................................................................................................235
MODO DO LOCK............................................................................................................................................................................236
DURACÃO DO LOCK (CONT .) ......................................................................................................................................................237
DURACÃO DO LOCK (CONT .) ......................................................................................................................................................238
AUTORIZAÇÕES ........................................................................................................................................................................ 239
SEGURANÇA DO DB2...................................................................................................................................................................240
ITENS PROTEGIDOS......................................................................................................................................................................241
IDENTIFICAÇÃO DO USUÁRIO DO DB2......................................................................................................................................242
COMANDO GRANT /REVOKE .......................................................................................................................................................243
UTILITÁRIOS.............................................................................................................................................................................. 244
UTILITÁRIOS DB2 ........................................................................................................................................................................245
UTILITÁRIOS DB2 (CONT.)..........................................................................................................................................................246
UTILITÁRIO 'LOAD'' .....................................................................................................................................................................247
EXECUTANDO O UTILITÁRIO ''LOAD''........................................................................................................................................248
EXECUTANDO O UTILITÁRIO ''LOAD'' (CONT.).........................................................................................................................249
LOAD - FASES DE EXECUÇÃO ...................................................................................................................................................250
LOAD - FASES DE EXECUÇÃO (CONT .) ....................................................................................................................................251
LOAD - CARTÕES DE CONTROLE ..............................................................................................................................................252
OPÇÕES RESUME E REPLACE......................................................................................................................................................253

Domini Treinamento – DB2 para Desenvolvedores -5-


EXERCÍCIO - LOAD......................................................................................................................................................................254
OPÇÃO LOG (YE S/NO).................................................................................................................................................................255
UTILITÁRIO '‘CHECK DATA''.......................................................................................................................................................256
CHECK DATA - FASES DE EXECUÇÃO ...................................................................................................................................257
OPÇÕES DO CHECK DATA .......................................................................................................................................................258
UTILITÁRIO '‘RUNSTATS''............................................................................................................................................................259
RUNSTATS - FASE DE EXECUÇÃO ..............................................................................................................................................260
OPÇÕES DO RUNSTATS................................................................................................................................................................261
OPÇÕES DO RUNSTATS (CONT .)..................................................................................................................................................262
CONSIDERAÇÕES SOBRE RUNSTATS..........................................................................................................................................263
UTILITÁRIO '‘COPY'' ...................................................................................................................................................................264
COPY - FASES DE EXECUÇÃO....................................................................................................................................................265
OPÇÕES DO COPY.........................................................................................................................................................................266
COPY INCREMENTAL E MERGECOPY.........................................................................................................................................267
RECOVER .......................................................................................................................................................................................268
RECOVER - FASES DE EXECUÇÃO...........................................................................................................................................269
RECOVER - A GILIZAÇÃO DO PROCESSO .................................................................................................................................270
RECOVER - PARA UM PONTO NO TEMP O................................................................................................................................271
RECOVER - PARA UM PONTO NO TEMP O................................................................................................................................272
DSNTIAUL – PROGRAMA SAMPLE PARA UNLOAD.........................................................................................................273
DSNTIAUL - DATA SETS E PARÂMETRO ........................................................................................................................274
DSNTIAUL - EXEMPLOS............................................................................................................................................................275
DSNTIAUL - EXEMPLOS............................................................................................................................................................276
STORED PROCEDURES INTRODUÇÃO.......................................................................................................................... 277
O QUE SÃO E PARA QUE SERVEM AS STORED PROCEDURES .............................................................................277
CALL SINTAXE .......................................................................................................................................................................... 279

CREATE PROCEDURE............................................................................................................................................................ 281


EXEMPLOS.................................................................................................................................................................................282
PARÂMETROS ..........................................................................................................................................................................283
PROGRAMAÇÃO DE SP.......................................................................................................................................................... 284
REGRAS GERAIS......................................................................................................................................................................285
COMMIT E ROLLBACK..........................................................................................................................................................286

Domini Treinamento – DB2 para Desenvolvedores -6-


Introdução ao DB2
Parte 1

Domini Treinamento – DB2 para Desenvolvedores -7-


O que é um Banco de Dados Relacional?

Um Banco de Dados Relacional é aquele que pode ser percebido


externamente como uma coleção de tabelas.
COLUNA

Tabela DEPT

DCODIGO DNOME GERENTE DSUPERIOR

A00 SPIFFY COMP.SERVICE 000010

B01 PLANNING 000020 A00

LINHA
D01 MARKETING 000030
000030 A00

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

Anotações:

Domini Treinamento – DB2 para Desenvolvedores -8-


DB2 é um DBMS Relacional

Sistema de Gerência
de Banco de Dados

· Integridade e Segurança de Dados


· Recuperação / Reinicio Integrados
· Definição Dinâmica
· Operação Contínua

Modelo de Dados Linguagem


Relacional Sql

Dados vistos como Tabelas Definição, Manipulação e


Controle dos Dados
Projeto mais fácil

Anotações:

Domini Treinamento – DB2 para Desenvolvedores -9-


Estrutura de Dados do DB2

- A Tabela Relacional

Tabela EMP

MATR NOME SOBRENOME DEPARTAMENTO SALÁRIO

000010 CHRISTINE HAAS A00 52750


000020 MICHAEL THOMPSON S01 41250
000030 SALLY KWAN C01 38250
000050 JOHN GEYER E01 40175
000330 WING LEE E21 25370
000340 JASON GOUNOT E21 23840

• Todos os dados e relacionamento entre dados são representados


por valores de campo.

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 10 -


NOMENCLATURA

O primeiro caracter
precisa ser:
Toda tabela e A-Z, $, @, #
toda coluna
precisam ser Demais caracteres:
nomeadas A-Z, $, @, #, 0-9, _

O nome da
tabela é único
através do Nome da
owner/creator/ coluna é
schema unico na
tabela

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 11 -


NOMENCLATURA

Schema/Owner/Creator
Nome simples da Tabela
da Tabela
PROD EMPL

Nome da Tabela
Qualificado(completo)
PROD.EMPL

Nome da Tabela Nome da Coluna


EMPL LASTNAME

Nome da Coluna
Qualificado
EMPL.LASTNAME

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 12 -


Integridade de Referência

CHAVE CHAVE
ESTRANGEIRA PRIMÁRIA

EMP ( D E P E N D E N T E ) D E P T (PAI)
NOME DEPT DEPTCOD
CARLOS Z13 INT. Q3A
MARIA A05 REF. Z13
·· · ·
·
· · ·
Um depto. só pode ser
excluído se não tiver
nenhum dependente.

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 13 -


Integridade de Referência (cont.)

• Chave Primaria(PK) – coluna(s) que garante(m) a unicidade das


linhas. É a chave principal de uma tabela. Uma tabela só pode ter
uma Chave Primária.

• Chave Estrangeira(FK) – coluna(s) de uma tabela que contém


valores da PK de outra tabela. Uma tabela pode ter mais de uma
Chave Estrangeira.

• É implementado no DB2 via comandos 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

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 14 -


Integridade de Referência (Cont.)

§ Na eliminação de uma linha da tabela PAI (PARENT TABLE), podem


ocorrer situações conforme a regra de deleção estabelecida para a
chave estrangeira.

• regra CASCADE: todas as linhas dependentes são eliminadas.

• regra SET NULL: a chave estrangeira das linhas dependentes


são atualizadas com valor nulo.

• regra RESTRICT: a eliminação é impedida se ela possuir alguma


linha dependente.

• Todas as tabelas associadas entre si via regra de IR formam um conjunto


chamado de estrutura referencial (reference structure).

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 15 -


Ambiente DB2

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 16 -


Coexistência entre os Ambientes

TSO BATCH IMS/TM


TSO BATCH
UTILITY

QMF
CICS

DB2
SPUFI

BSDS LOG DB CAT DIR

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 17 -


Objetos DB2

TABLESPACE A

TABELA 1 INDEX 1

TABELA 2 INDEX 2 TS A
IDX1 IDX2 IDX4

TABLESPACE B NÃO DB2

TS B IDX3
TABELA 3 INDEX 3

TABELA 4 INDEX 4

DATABASE X

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 18 -


Objetos DB2 (cont.)

STORAGE GROUP1 STORAGE GROUP2

VOL1 VOL2 VOLX

NÃO DB2 NÃO DB2


TS
TS TS
IX

VOL3 VOL4 VOLY

NÃO DB2
TS TS
TS IX IX

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 19 -


Notas

• DATABASE (Banco de dados)

Conjunto de TABLESPACES e índices agrupados sob um


critério administrativo.

• TABLE (Tabelas)

Conjunto de linhas com as mesmas colunas (atributos).

• TABLESPACE

Conjunto da data sets VSAM LDS (linear data set) que


contêm dados de uma ou mais tabelas

Suas páginas podem ser de 4K, 8K, 16K ou 32 K.

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 20 -


Notas (cont.)

Tipos de TABLESPACE

− simples: as páginas de seus data sets podem conter dados de


uma ou mais tabelas.

− segmentado: é dividido em segmentos(conjuntos de páginas) .


Cada segmento só pode conter dados de uma tabela. Utilização
recomendada pois permite ao DB2 uma administração melhor
de espaço.

− particionado: recomendado para tabelas gigantes. É dividido


em partições( data set VSAM). Requer um índice cluster com
uma faixa de valores estabelecidos para cada partição. O DB2
se baseia nesta faixa para saber em qual partição gravar uma
linha.

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 21 -


Notas (cont.)

• INDEX (ÍNDICES)

É uma lista ordenada de valores que apontam para os dados nas tabelas.
Utilizado para agilizar a leitura de dados. Pode ser utilizado t ambém para
forçar a unicidade dos dados.

Tipos:

UNIQUE : força a unidade dos dados


NORMAL : permite a duplicidade de dados
CLUSTER : usado para manter a seqüência física dos dados no Tablespace

• VIEW
• É um subconjunto de uma ou mais tabelas.
• Sua utilização, em princípio, nada difere de uma tabela normal.
• Conforme o caso uma VIEW pode ser somente leitura.

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 22 -


Notas (cont.)

• STORAGE GROUP

• É um conjunto de volumes (discos) aonde o s T A B L E S P A C E S ou índices são


armazenados.
• Os discos devem ter o mesmo device type (3375, 3380 etc).
• A utilização dos STG poupa o usuário da codificação de AMS de VS AM para
criar os data sets via DEFINE CLUSTER.
• Os discos de um STG não precisam ser dedicados ao DB2.

• SYNONYM (SINÔNIMO)

É um nome alternativo (apelido) para uma tabela ou view. Uma vez criado, sua
utilização é restrita a um Auth-id. (Proprietário ou usuário)

• ÁLIAS

É um nome alternativo (apelido) para uma tabela ou view. Utilizado mais como
nome local de uma tabela remota. Seu uso é compartilhado.

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 23 -


Estrutura do DB2

CAT ÁLOGO DIRETÓRIO

LOG
ATIVA
DDBB22

DATABASES
LOG
ARCHIVE
BSDS IMAGE
COPY

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 24 -


Estrutura do DB2 (cont.)

NOTAS:

• O catálogo é um conjunto de tabelas do DB2 e pode ser acessado


através da linguagem SQL.
• O BSDS é um arquivo VSAM KSDS, que contém um histórico das
Logs do DB2.
• O diretório é um conjunto de arquivos com informações do DB2,
não podendo ser acessado por nenhum usuário.

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 25 -


Utilização da Linguagem SQL

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 26 -


Utilização da Linguagem SQL

DB2
TSO Attach IMS Attach CICS Attach

DB2 I QMF PROGRAMA PROGRAMA PROGRAMA

USUÁRIO USUÁRIO

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 27 -


Utilização da Linguagem SQL (cont.)

SQL
STRUCTURED
QUERY
LANGUAGE

DDL DML DCL


DATA DATA DATA
DEFINITION MANIPULATION CONTROL
LANGUAGE LANGUAGE LANGUAGE

PROGRAMA SQL ESTÁTICO


PROGRAMA SQL DINAMICO
INTERATIVO

DB2

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 28 -


Utilização da Linguagem SQL (cont.)

• DML (Data Manipulation Language) (Desenvolvimento)

•SELECT : pesquisa de dados (READ)


• UPDATE : atualização de dados
• DELETE : eliminação de dados
•INSERT : inserção de dados

• DDL (Data Definition Language) (Suporte)

• CREATE : definição de um objeto (tabela, índice)


• ALTER : alteração de um objeto
• DROP : eliminação de um objeto

• D C L (Data Control Language) (Suporte/Desenvolvimento)

• GRANT : fornecer um privilégio


• REVOKE : tirar um privilégio

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 29 -


Linguagem SQL

• Qualquer acesso ao DB2 é feito através da linguagem SQL.

• O usuário ao emitir um comando SQL deve estar autorizado para a


execução do mesmo.

• A linguagem SQL :

• NÃO É PROCEDURAL

• T E M O CONCEITO DE TEORIA DOS CONJUNTOS

• É S I MP L E S

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 30 -


Linguagem SQL (cont.)

• Não é procedural .
Para cada dada pesquisa não precisamos informar os procedimentos
necessários como:
1. zere o contador
2. abra o arquivo
3. leia um registro
4. verifique se satisfaz o critério
5. incremente o contador
6. etc.
Com a instrução SELECT basta dizer:

1. quero os dados que satisfazem a condição X.


• O SQL trabalha com conjuntos e permite a execução dos operadores que
são familiares para nós da matemática elementar.
Quem não conhece os operadores União e Intersecção?
Com uma instrução SELECT podemos implementar os seguintes
operadores:

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 31 -


Linguagem SQL (cont.)

..União A B UNION

..Intersecção A B JOIN

..Diferença A - B OUTER JOIN

..Produto Cartesiano A X B = {(x.y):x ∈ A e y ∈ B }

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 32 -


DDL - Data Definition Language

CREATE DEFINIÇÃO DE OBJETOS

ALTER ALTERAÇÃO DE UM OBJETO

DROP ELIMINAÇÃO DE UM OBJETO


PREVIAMENTE DEFINIDO

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 33 -


Create Table

• CREATE TABLE ORG


(DEPTCOD CHAR(3) NOT NULL,
DEPTNOME VARCHAR(36) NOT NULL,
GERENTE CHAR(6),
DIVISAO CHAR(8) NOT NULL WITH DEFAULT,
PRIMARY KEY(DEPTCOD))
IN DBXX.TSXX
• CREATE TABLE STAFF
(ID CHAR(6) NOT NULL,
NOME VARCHAR(12) NOT NULL,
.
.
.
DEPT CHAR(3),

PRIMARY KEY(ID),
FOREIGN KEY(DEPT) REFERENCES ORG ON DELETE CASCADE)
IN DBYY.TSYY
• ALTER TABLE STAFF ADD COLX DECIMAL (8,2)

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 34 -


Dados Numéricos

Definição
Definição para
para Colunas
Colunas
TIPO DE DADO DESCRIÇÃO FAIXA
SMALLINT Inteiros -32.768 + 32.767
INTEGER Inteiros -2.147.483.648
INT +2.147.483.647
DECIMAL (X,Y) Decimais X=total de dígitos
Y=casas decimais
X <=31
FLOAT (m) precisão simples 5.4e-79 to 7.2e+75
REAL ponto flutuante
FLOAT dupla precisão 5.4e-79 to 7.2e+75
FLOAT (n) ponto flutuante**
DOUBLE PRECISION

** 1 <=m <=21
21 <=n <=53 Para DECIMAL, defina X com número impar

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 35 -


Dados Numéricos (cont.)

• S MALLINT é uma half word (2 bytes)

• INTEGER é uma full word (4 bytes)

• DECIMAL armazena números em decimal compactado. A faixa de


valores depende da quantidade de casas decimais.

• Critério de escolha do tipo de dado

• faixa de valores requerido

• tipo de comparação necessária para os processamentos


Comparação entre números de tipos diferentes implica em
overhead necessário para conversão e riscos maiores devido a
erros induzidos por arredondamento.

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 36 -


Dados Character String

Definição
Definição para
para Colunas
Colunas
TIPO DE DADO DESCRIÇAO TAMANHO

CHAR (x) string fixo x caracteres


(máximo 254)

VARCHAR (x) string de 0 a 254 **


tam. variável caracteres

LONG VARCHAR(x) string de x >254 **


tam. Variável caracteres

** O tamanho máximo de uma coluna do tipo VARCHAR


depende do tamanho da página do Tablespace.

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 37 -


Dados Date / Time

Definição
Definição para
para Colunas
Colunas

TIPO DE DADO F O R MATO INTERNO

DATE aaaammdd (4 bytes)

TIME hhmmss (3 bytes)

TIMESTAMP aaaammddhhmmsssnnnnnn (10 bytes)


(nnnnnn =microsegundos )

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 38 -


Nulidade

Uma coluna pode ser:

• NOT NULL o valor deve ser fornecido

• NOT NULL WITH DEFAULTvalor pode ser omitido e assume default

• NULLABLE o valor pode ser omitido

um valor NULO: NÃO É ZERO


NÃO É BRANCO
É DESCONHECIDO

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 39 -


Not Null With Default

Para uma coluna ‘not null with default ‘ o sistema fornece o valor em
caso de omissão.

• Zero para colunas numéricas

• Branco para colunas fixed length caracter

• Comprimento zero para colunas variable length character

• Time
• Date Valores Correntes
• Timestamp

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 40 -


Create View

CREATE VIEW V_DEPT


(VCODIGO,VNOME)
AS
SELECT CODIGO, DNOME
FROM TAB_DEPT
WHERE DCODIGO LIKE ‘A%’

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 41 -


DML - Data Manipulation Language

SELECT ACESSA DADOS

UPDATE ATUALIZA CAMPOS

DELETE REMOVE LINHAS

INSERT INSERE NOVAS LINHAS

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 42 -


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 AL MEIDA 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 194 56.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 L U 10 GER 10 20010.00 -
220 SMITH 51 VENDAS 7 17654.50 992.80
230 LUNDQUIST 51 ATEND 3 13369.80 189.65
240 DANIELS 10 GER 5 19260.65 -
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
Anotações:
330
340
BURKE
VIEIRA
66
84
ATEND
VENDAS
1
7
10988.00
17844.00
55.50
1285.00
350 GAFNEY 84 ATEND 5 13030.50 188.00

Domini Treinamento – DB2 para Desenvolvedores - 43 -


Tabelas Usadas nos Exemplos (cont.)

X. ORG

DEPTCOD DEPTNOME GERENTE DIVISÃO LOCAL

10 MATRIZ 160 CENTRO SÃO PAULO


15 CAMPINAS 50 SUDESTE CAMPINAS
20 RIO 10 SUDESTE R. 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

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 44 -


Query

SEQUÊNCIA OBRIGATÓRIA:

S E L E C T NOME, ANOS, SALÁRIO - Diz quais as colunas desejadas

F R O M X. STAFF - Diz de quais tabelas

W H E R E D E P T =38 - Diz quais linhas selecionar

O R D E R B Y NOME - Diz como ordenar o resultado

A menor informação que a linguagem SQL necessita para atender um a


solicitação:

SELECT ∗ FROM X.STAFF

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 45 -


Query em Formato Livre

SELECT NOME, ANOS, SALARIO FROM X.STAFF WHERE DEPT = 38


ORDER BY NOME

OBS: APESAR DA QUERY PODER SER ESCRITA EM FORMATO LIVRE,


QUANDO SE ESCREVE DE MANEIRA ESTRUTURADA FICA MELHOR PARA
VISUALIZAR.

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 46 -


Select...From

• SELECT algumas colunas da tabela


• Lista as colunas desejadas na seqüência de esquerda para direita
• Vírgulas separa as colunas (obrigatórias)
• 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
. .

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 47 -


Select de Todas as Colunas

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


foram definidas no comando CREATE TABLE:

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 R.JANEIRO
38 MINAS 30 SUDESTE B.HORIZONTE

OBS.: EVITAR O USO DO SELECT *

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 48 -


Controle de Linhas

• WHERE

• traz certas linhas


• estabelece condições

Exemplo: Listar empregados do departamento 20

SELECT DEPT, NOME,CARGO, COMIS


FROM X.STAFF
WHERE DEPT = 20

Resultado:

DEPT NOME CARGO COMIS

20 SANTANA GER -
20 ORSINI VENDAS 612.45
20 JAMES ATEND 128.20
20 SNEIDER ATEND 126.50

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 49 -


Operadores de Comparação

= Igual
<> or ¬= Diferente
> Maior
>= Maior ou Igual
< Menor
<= Menor ou 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’

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 50 -


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’

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 51 -


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 -

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 52 -


Seleção de Nulos (cont.)

• 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

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 53 -


Múltiplas Condições

• Operadores para múltiplas condições


AND
OR
• Dadas duas condições
CARGO = ‘VENDAS’ SALÁRIO < 17000

Para ter ambas satisfeitas: AND


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

Resultado:

NOME CARGO SALÁRIO

SUZUKI VENDAS 16808.30


ALMEIDA VENDAS 16502.83

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 54 -


Múltiplas Condições (cont.)

Para ter qualquer uma satisfeitas: OR

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

Resultado:

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

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 55 -


Múltiplas Condições (cont.)

Usar parênteses para separar as condições AND, OR


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

Resultado:

NOME CARGO ANOS COMIS

KOONITZ VENDAS 6 1386.70


JONES GER 12 -
GRAHAM VENDAS 13 1200.30
VIEIRA VENDAS 7 1285.00

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 56 -


Múltiplas Condições (cont.)

não eqüivale a:

WHERE CARGO = ‘VENDAS’


AND (COMIS > 1200 OR ANOS > 10)

Resultado:

NOME CARGO ANOS COMIS

KOONITZ VENDAS 6 1386.70


GRAHAM VENDAS 13 200.30
VIEIRA VENDAS 7 1285.00

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 57 -


IN

• Valor deve coincidir com algum elemento da lista

WHERE DEPT IN (38, 20, 42)

equivale a:

Múltiplos O R s para a mesma coluna:

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

NEGAÇÃO: NOT IN

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 58 -


Between

• Para selecionar um intervalo fechado de valores


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

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

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 59 -


Pesquisas Parciais

Para pesquisar um subconjunto de caracteres: L I K E


% = Conjunto de caracteres quaisquer
_ = Um caracter qualquer

Exemplos:
1. WHERE NOME LIKE ‘G%’ inclui: GRAHAM
GONZALES
GAFNEY
2. WHERE NOME LIKE ‘%SON’ inclui: WILSON ***
JASON
3. WHERE NOME LIKE ‘%M%N%’ inclui: MOLINARI
4. WHERE NOME LIKE ‘_ _’ inclui: LU (TAM=2
BYTES)
5. WHERE NOME LIKE ‘_R%’ inclui: FRAYE
(R na 2ª posição) GRAHAM
*** VARCHAR

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 60 -


Negação

• Para negar o teste:

WHERE NOME NOT LIKE ‘G%’

exclui: GRAHAM
GONZALES
GAFNEY

WHERE ANOS NOT BETWEEN 9 AND 11

exclui ANOS de 9 a 11

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 61 -


Order By

• Para classificar numa sequê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 VENDAS 7
PINHO ATEND 5
VIEIRA GER 10

OBS.:
Primeiro seleciona e depois classifica.
Para pequenos volumes pode ser usado sem problemas.

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 62 -


Order By (cont.)

• Para classificar pelas coluna (s) em ordem A S C endente (default) ou


D E S C endente
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

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 63 -


Order By (cont.)

• 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. Podemos
também referenciar um ALIAS.

• ORDER BY classifica uma tabela resultante. Logo deve ser


S E MPRE a ÚNICA e a ÚLTIMA a aparecer numa instrução
SELECT.

• Usar sempre que desejar as linhas segundo uma ordem


específica.

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 64 -


Select Distinct

• 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 DEPT DEPT


FROM X.STAFF 20
20
38
38
38
15
10
.
.
Para eliminar linhas duplicadas:
SELECT DISTINCT DEPT DEPT
FROM X.STAFF 10
15
20
38
.

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 65 -


Select Distinct (cont.)

MÚLTIPLAS -COLUNAS
SELECT DISTINCT DEPT, CARGO DEPT CARGO
10 GER
15 ATEND
15 GER
15 VENDAS
20 ATEND
20 GER
20 VENDAS
38 ATEND

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 66 -


Select de Valores Calculados

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

Total de ganho de cada pessoa do DEPT 20

SELECT ID, SALÁRIO, COMIS, SALÁRIO + COMIS


FROM X.STAFF
WHERE DEPT = 20

Resultado:
ID SALÁRIO COMIS COL1

10 18357.50 - - (1)
20 18171.25 612.45 18783.70
80 13504.60 128.20 13632.80
190 14252.75 126.50 14379.25

OBS.: NÃO FAZ EXPONENCIAÇÃO.


(1) Quando uma das colunas a serem somadas contiver
nulos, não é efetuado o calculo.

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 67 -


Nomeando a coluna resultado

SELECT ID, SALÁRIO, COMIS, SALÁRIO + COMIS AS RENDIMENTOS


FROM X.STAFF
WHERE DEPT = 20
ORDER BY RENDIMENTOS

Resultado:
ID SALÁRIO COMIS RENDIMENTOS

80 13504.60 128.20 13632.80


190 14252.75 126.50 14379.25
20 18171.25 612.45 18783.70
10 18357.50 - -

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 68 -


Condições com Valor Calculado

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

SELECT NOME, SALÁRIO + COMIS


FROM X.STAFF
WHERE SALARIO + COM > 20000

Resultado:

NOME COL1

OLIVEIRA 20094.15
GRAHAM 21200.30

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 69 -


‘Order By’ Por Valor Calculado

EXEMPLO 1:

SELECT NOME, SALÁRIO + COMIS


FROM X.STAFF
WHERE SALARIO + COMIS > 20000
ORDER BY 2 DESC

Resultado:

NOME COL1

GRAHAM 21200.30
OLIVEIRA 20094.15

EXEMPLO 2:

SELECT CARGO, SALÁRIO + COMIS


FROM X. STAFF
ORDER BY CARGO, 2

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 70 -


Operador de Concatenação

string1 || string2 string1string2


‘ABC’ || ‘XYZ ‘ABCXYZ’

TABELA X (COLUNAS varchar : snome nome)


SNOME NOME MID
JONES JOHN P
MAR Q U E S FRANCO X
· · ·
· · ·
· · ·
SELECT SNOME || ‘, ‘ || NOME || ‘ ‘ || MID || ‘.‘
FROM TABELA X
Resultado :
JONES, JONES P.
MARQUES, FRANCO X.
· · ·
· · ·

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 71 -


Funções de Coluna (Column Functions)

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

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 72 -


Sum Avg Max Min

EXEMPLO

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


FROM X.STAFF
WHERE DEPT = 56

Resultado:

COL1 COL2 COL3

86076,20 17245,89 550844,60

OBS.: Valor nulo não são considerados em funções de coluna,


EXCETO para a função COUNT(*).

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 73 -


Sum Avg Max Min (cont.)

• Gera um único valor a partir de um conjunto de valores de uma ún ica


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

AVG(SALÁRIO + COMIS)

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 74 -


Count

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


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

Contar as pessoas cujo salário exceda


$ 18.000 e seus respectivos departamentos.
Mostre a média salarial.

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


FROM X.STAFF
WHERE SALARIO>18000

Resultado: COL1 COL2 COL3

8 16 19604.190625000

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 75 -


Cuidado com Nulos

SUM(SALARY)+SUM(BONUS)+SUM(COMM)
VERSUS
SUM(SALARY+BONUS+COMM)

EMPNO SALARY BONUS COMM SALARY+BONUS+COMM


000010 1000 500 100 1600
000020 2000 NULL 300 NULL
000030 2500 400 NULL NULL
000040 1500 100 400 2000
------ ------ ----- ---- -----------------
Sum: 7000 1000 800 --> 8800 3600
====== ===== ==== ====

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 76 -


Cuidado com Nulos

A B

2 5
- 3
4 -

SUM (A) =... SUM (A +B ) = ...


SUM (B) =...
AVG (A) = ...

SUM (A) =...


COUNT(*)

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 77 -


Literais

• Literais podem ser mostradas no resultado de um SELECT.

• Podem ser ú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

(é necessário que a tabela exista).

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 78 -


Literais

SELECT AVG(COMIS), SUM(COMIS)


FROM X.STAFF

COL1 COL2

513.31 12319.45

SELECT ‘MED:’ , AVG(COMIS),


‘SOMA: ‘, SUM(COMIS)
FROM X.STAFF

COL1 COL2 COL3 COL4

MED: 513.31 SOMA: 12319.45

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 79 -


Group By

Agrupa um conjunto de linhas.


Com GROUP BY, a função de coluna calcula um valor para cada
agrupamento.

SELECT SUM(SALÁRIO), SELECT SUM(SALÁRIO),


SUM(COMIS) SUM(COMIS)
FROM X.STAFF FROM X.STAFF
WHERE CARGO <> ‘GER’ WHERE CARGO <> ‘GER’
GROUP BY DEPT

COL1 COL2 COL1 COL2

146976.93 4249.15 41269.53 1468.70


45928.60 867.15
59778.80 1913.30
. .
. .
. .

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 80 -


Group By (cont)

SELECT DEPT, SUM(SALÁRIO), SUM(COMIS)


FROM X.STAFF
WHERE CARGO <> ‘GER’
GROUP BY DEPT

Resultado:

DEPT COL1 COL2

15 41269.53 1468.70
20 45928.60 867.15
38 59778.80 1913.30
. . .
. . .
. . .

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 81 -


Group By (cont.)

NOTAS:

• Podemos fazer ‘GROUP BY’ sobre múltiplas colunas.

GROUP BY DEPT, CARGO

• As colunas referenciadas pelo SELECT que não sejam função precisam ser
agrupadas pelo ‘GROUP BY’(ver pagina anterior). O não agrupamento neste
caso gera erro.

• O resultado contém uma linha sumário para cada grupo.

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

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 82 -


Group By ... Order By

• Para garantir a ordem de classificação é necessário usar Order B y

SELECT DEPT, SUM(SALÁRIO), SUM(COMIS)


FROM X.STAFF
WHERE CARGO <> ‘GER’
GROUP BY DEPT
ORDER BY 3

Resultado:

DEPT COL1 COL2

20 45928.60 867.15
. . .
. . .
15 41269.53 1468.70
. . .
. . .
38 59778.80 1913.30

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 83 -


Group By ... Having

CONDIÇÕES SOBRE GRUPOS

S E L E C T . . . F R O M..

WHERE.....

FILTROS

GROUP BY...

HAVING....

WHERE - escolhe linhas


HAVING - escolhe grupos

É executado sempre após GROUP BY

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 84 -


Exemplo de Having

SELECT DEPT, SUM(SALÁRIO)


FROM X.STAFF
GROUP BY DEPT

DEPT COL1

10 83643.45
15 61929.33 SELECT DEPT, SUM(SALÁRIO)
20 64286.10 FROM X.STAFF
38 77285.55 GROUP BY DEPT
42 58369.05 HAVING SUM(SALÁRIO) > 65000
. .
. . DEPT COL1
. .
10 83643.45
38 77285.55
. .
. .
. .

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 85 -


Select - 6 Cláusulas

SELECT DEP, JOB, AVG(SAL)


FROM EMPL
WHERE JOB <> 'M'
GROUP BY DEP, JOB
HAVING AVG(SAL) > 28000
ORDER BY 3 DESC

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 86 -


Execução conceitual do Select

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 87 -


Execução conceitual do Select (cont.)

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 88 -


Exemplos de Having (cont.)

Média salarial por departamento


apenas dos não-gerentes dos departamentos
com mais de 3 pessoas.

SELECT DEPT, AVG(SALÁRIO) FROM STAFF


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

Média salarial dos não -gerentes por departamento, que tenham


somente pessoas com no mínimo 5 anos de experiência.
Listar em ordem descendente por média.

SELECT DEPT, AVG(SALÁRIO)


FROM STAFF
WHERE CARGO <> ‘GER’
GROUP BY DEPT
HAVING MIN(ANOS) >= 5
ORDER BY 2 DESC
Os exemplos mostram que o SELECT e o HAVING podem usar funções
diferentes.

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 89 -


Sumário Funções de Coluna

• Funções de Coluna s ó podem ser especificadas em:


SELECT
HAVING

• SELECT pode especificar somente


Funções de Coluna
Colunas especificadas no ‘GROUP BY’

• HAVING pode especificar


Funções de Coluna sobre qualquer coluna contida numa tabela
especificada no FROM

• Funções de Coluna não podem ser embutida uma dentro da outra.

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 90 -


Funções Escalares (Scalar Functions)

• Transforma um único valor em outro valor.

• Funções STRING

• Funções de Conversão

• Funções Date/Time

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 91 -


Funções Escalares

• Ao contrário das funções de coluna 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 dentro da outra.

• Ex.: SUBSTR (SUBSTR (...)...)

• Funções de Coluna podem ser argumento de uma função escalar.

• Ex.: SUBSTR (MAX(...)...)

• Funções Escalares podem ser argumento de uma função de coluna.

• Ex.: MAX (SUBSTR(...)).

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 92 -


Substr (string, início, comprimento)

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

• S e o início +comprimento ultrapassar o final do string teremos erro.

• Substring de nulo é nulo

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 93 -


Substr (string, início, comprimento) (cont.)

SELECT DEPTNOME, SUBSTR(DEPTNOME, 1, 4)


FROM X.ORG

Resultado:
DEPTNOME COL1

MATRIZ MATR
CAMPINAS CAMP
RIO RIO
MINAS MINA
BAHIA BAHI

SELECT DEPTCOD, DIVISAO


FROM X.ORG
WHERE SUBSTR(DIVISAO, 3) =‘EAS’

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 94 -


Length (argumento)

• Fornece o tamanho de uma coluna do tipo caracter.

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

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 95 -


Length (argumento) (cont.)

SELECT NOME, LENGTH(NOME), CARGO, LENGTH(CARGO)


FROM X.STAFF

Obs: NOME tem tamanho variável


CARGO tem tamanho fixo

Resultado:

NOME COL1 CARGO COL2

SANTANA 7 GER 6
SILVAl 6 VENDAS 6
DANTAS 6 GER 6

. . . .
. . . .

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 96 -


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

• 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 ser do mesmo tipo de dado (todos


numéricos ou todos caracteres).

• Se todos os argumentos forem nulos, o resultado será nulo.

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 97 -


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

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

SELECT ID, COMIS, BONUS, VALUE(COMIS, BONUS, 0)


FROM X.STAFF

Resultado :

ID COMIS BONUS COL1

10 - - 0.00
20 612.45 534.25 612.45
30 - 345.89 345.89
40 846.55 - 846.55

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 98 -


Funções de Conversão

• Converte um tipo de representação em outro.

DECIMAL, FLOAT, INTEGER : converte número em número


DIGITS : converte número em alfa
HEX : converte alfa / número em hexa

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


FROM.STAFF
WHERE ID = 55

se coluna SALARIO é (DEC (7,2)) : 17506.75

Resultado:
COL1 COL2

17506.7 17506

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 99 -


Dados Date/Time

DATE, TIME, TIMESTAMP armazenados como decimal compactado sem sinal.

TIPO DE DADO FORMATO INTERNO


DATE aaaammdd
TIME hhmmss
TIMESTAMP aaaammddhhmmssnnnnnn

Programas lidam só com FORMATO EXTERNO: string de caracteres

PADRÃO Formato TAMANHO Formato TAMANHO


TIME DATE
ISO hh.mm.ss 8 bytes aaaa-mm-dd 10 bytes
USA hh: mm AM 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
Timestamp: aaaa-mm -dd-hh.mm.ss.nnnnnn 26 bytes

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 100 -


Aritmética Date/Time

• Somente subtração
horário - horário = = > duração em hhmmss (packed decimal (6,0))

data - data =====>duração em aaaammdd (packed decimal (8,0))

• Na adição é necessário usar DURAÇÃO ROTULADA:


Número “n“ seguido da palavra chave: YEARS, MONTHS, DAYS, HOURS,
MINUTES, SECONDS, MICROSECONDS
horário ±duração rotulada ==>horário

data ±duração rotulada ====>data

• Pode usar MIN, MAX, COUNT

• Não pode usar SUM e AVG

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 101 -


Aritmética de Date/Time (cont)

• Somando/Subtraindo duração
data + ou - duração (data) - - Resulta em data
DATACOL1 + 3 MONTHS
horário +or - duração (tempo) - - Resulta em horário
TEMPCOL1 - 30 MINUTES - 20 SECONDS
timestamp +or - duração (data) - - Resulta em TIMESTAMP
timestamp +or - duração (tempo)
T S T C O L +2 DAYS - 3 HOURS
T M S R C O L +50000 MICROSECONDS

• Subtraindo datas e horas


data - data - - Resulta em duração
DATACOL1 - DATACOL2
DATACOL1 - ‘1984-12-20’

Horário - Horário - - Resulta em duração


TEMPCOL1 - T E M P C O L 2
‘11:30 PM’- TEMPCOL1

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 102 -


Exemplos Date/Time

TABLE DT
PRJDOC DATAINI DATAFIM HRINI HRFIM
AX001 19900131 20050331 000000 153000
AX002 19880228 19880831 000000 000000
AX003 19870201 19870201 160000 234159
SELECT PRJCOD, DATAINI + 1 YEAR, DATAFIM - 2 MONTHS ....

Resultado : PRJCOD COL1 COL2

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

Resultado: PRJCOD COL1 COL2

AX001 00150200 153000


AX002 00000602 000000
AX003 00000000 074159

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 103 -


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 :

COL1 COL2

15.30.00 03.30 PM

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 104 -


Funções Escalares Date/Time (cont.)

• DAY, MONTH, YEAR, HOUR, MINUTE, SECOND, MICROSECOND

- E X T R A I 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:

COL1 COL2 COL3

31 1 1990

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 105 -


Funções Escalares Date/Time (cont.)

• DAYS

Número de dias desde 01/01/0001

SELECT DATAFIM - DATAINI,


DAYS(DATAFIM) - DAYS(DATAINI)
FROM DT
WHERE PRJCOD = ‘AX001’

Resultado:

COL1 COL2

00150200 5538
(nº.dias)

• DATE, TIME
Extrai data ou horário de um timestamp

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 106 -


Valores Correntes

•CURRENT DATE

Data de hoje

• C U R R E N T TIME

Horário corrente

• C U R R E N T TIMESTAMP

Data e horário corrente convertido para timestamp

SELECT * FROM DT
WHERE DATAINI < CURRENT DATE - 90 DAYS

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 107 -


Join de Tabelas

ID NOME DEPT
10 SANTANA 20
20 ORSINI 20
30 DANTAS 38
40 O’BRIEN 38
50 SOUZA 15
70 ALMEIDA 15
80 JAMES 20
90 KOONITZ 42
. . .
. . .
D E P T C O D DEPTONOME G E R E N T E
10 MATRIZ 160
15 CAMPINAS 50
20 RIO 10
38 MINAS 30
42 BAHIA 100
• Tabelas são relacionadas via dados comuns (domínios)
• J o i n é implementado pela cláusula FROM ou WHERE
• Não faça J OIN de tabelas sem o predicado de join, o resultado é um
produto cartesiano entre as tabelas

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 108 -


Join de Tabelas - Inner Join

Listar o nome dos departamentos e seus respectivos gerentes

SELECT DEPTNOME, NOME


FROM X.STAFF, X.ORG
WHERE GERENTE = ID

X.ORG
DEPTNOME GERENTE DIVISÃO
RIO 10 .
MINAS 30 WESTERN
BAHIA 100 .
. . . Resultado:

X.STAFF DEPTNOME NOME


ID NOME RIO SANTANA
30 DANTAS MINAS DANTAS
10 SANTANA
100 PLOTZ BAHIA PLOTZ
. .

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 109 -


Join de Tabelas - Inner Join (cont.)

Listar o nome dos departamentos da divisão Western e seus gerentes

SELECT DEPTNOME, NOME


FROM X.STAFF, X.ORG
WHERE DIVISÃO = ‘WESTERN’
AND GERENTE = ID

Resultado: DEPTNOME NOME


MINAS DANTAS

Outra maneira de escrever o Inner Join

SELECT DEPTNOME, NOME


FROM X.STAFF INNER JOIN X.ORG
ON GERENTE = ID
WHERE DIVISÃO = ‘WESTERN’

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 110 -


Outer Join

Listar
Listar todos
todos empregados,
empregados, ee para
para os
osgerentes,
gerentes, oodepto
deptoque
queeles
elesgerenciam
gerenciam
SELECT DEPTNOME, NOME
FROM X.STAFF LEFT OUTER JOIN X.ORG
ON GERENTE = ID
X. ORG
DEPTNOME G E R E N T E DIVISÃO Resultado:
SÃO PAULO . .
MINAS 30 WESTERN DEPTNOME NOME
BAHIA 100 CPC
RIO 10 WESTERN RIO SANTANA
X. STAFF - ORSINI
MINAS DANTAS
ID NOME - O’BRIEN
10 SANTANA
20 ORSINI BAHIA PLOTZ
30 DANTAS
40 O’BRIEN
100 PLOTZ
•OPÇÕES: LEFT JOIN, RIGHT JOIN e FULL JOIN

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 111 -


Join com Mais de Duas Tabelas

Listar
Listaros
osempregados,
empregados,oonome
nomedo
dodepartamento
departamentoaonde
aondetrabalham
trabalhameesseus
eus
respectivos
respectivospedidos
pedidosde
devendas.
vendas.

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

REGRA: o número de predicados join é igual ao número de tabelas menos 1

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 112 -


Qualificadores

X.STAFF
CODIGO NOME DEPT CARGO
20 SANTANA 20 GER
20 ORSINI 20 VENDAS
. . . .
. . . .

X.ORG
CODIGO DEPTNOME GERENTE
10 MATRIZ 160 SELECT NOME,DEPTNOME,CODIGO
FROM X.STAFF, X.ORG
10 RIO 10 WHERE CARGO = ‘GER’
. . . AND DEPT = CODIGO
. . .

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


departamentos

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 113 -


Qualificadores (cont.)

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.CÓDIGO

• Qualificador correlacionado

SELECT NOME, O.CODIGO, DEPTNOME


FROM X.STAFF, X.ORG O
WHERE CARGO = ‘GER’
AND DEPT = O.CODIGO

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 114 -


Join de uma Tabela com ela mesma

Liste os empregados que ganham mais que os seus gerentes

1. Obter informações do empregado na X.STAFF (E)


ID NOME ... SALÁRIO ... DEPT
80 J A ME S 19456.50 20

2. Obter informações do departamento na X.ORG


DEPTCOD DEPTNOME ... GERENTE ...
20 RIO 10

3. Obter informações do gerente na X.STAFF (G)


ID NOME ... SALÁRIO ... DEPT
10 SANTANA 18357.50 20

4. Comparar o salário dos dois

5. Se a condição é satisfeita, colocar a linha na tabela resultante e partir para


o próximo empregado.

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 115 -


Join de uma Tabela com ela mesma (cont.)

SOLUÇÃO:
SELECT E.NOME, E.SALARIO, G.NOME, G.SALARIO
FROM STAFF E, ORG D, STAFF G
WHERE E.DEPT = D.DEPTCOD
AND D.GERENTE = G.ID
AND E.SALARIO > G.SALARIO

Resultado:
NOME SALARIO NOME SALARIO

OLIVEIRA 19456.50 SANTANA 18357.50


. . . .

• Qualificadores são necessários porque existe uma necessidade de tratar


duas linhas da mesma tabela como se fossem pertencentes a tabelas
distintas.

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 116 -


União

UNION faz a união de tabelas resultados

SELECT A1, A4 FROM TBLA


WHERE A2 = ‘Z’ Resultado

UNION . .
. .

SELECT B1, B4 FROM TBLA


WHERE B1 > = ‘N’
Resultado

. .
. .
. .

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 117 -


União (cont.)

• Queries são executadas serialmente.

• A quantidade de colunas deve ser a mesma em todos os S E L E C T s .

• Os tipos de dados das colunas correspondente devem ser iguais.

• O operador union une as tabelas resultantes e elimina as linhas


duplicadas, que implica num SORT.

• O operador UNION ALL também une tabelas mas não elimina linhas
duplicadas. Não chama o sort portanto.

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 118 -


União - Exemplo

A faixa de salários dos atendentes atingiria a faixa 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 COL1
VENDAS 21420.0000
. .
VENDAS 17144.4660
ATEND 16918.2000
VENDAS 16832.8866
. .

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 119 -


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’
NOME NOME ==>do primeiro SELECT
JACOBS ARANTES
MAR Q U E S JACOBS
ARANTES MAR Q U E S
SILVA SILVA
MAR Q U E S
JACOBS
UNION ALL UNION
- Não faz classificação - Classifica
- Não elimina duplicados - Elimina duplicados

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 120 -


Subquery

• É UM SELECT EMBUTIDO DENTRO DE UM S E L E C T

• R E S U L T A D O D E U M A S U B Q U E R Y É U S A D O P E L O S E L E C T “ E X T E R N O”

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 121 -


Exemplo de Subquery

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


X. STAFF
NOME SALARIO

• Encontrar a média salarial da companhia (SUBQUERY)

SELECT AVG(SALARIO) FROM X.STAFF 16675.64

• Comparar o salário de cada funcionário com o resultado


SELECT NOME, SALÁRIO
FROM X.STAFF
WHERE SALARIO > (SELECT AVG(SALARIO) FROM X.STAFF)

Resultado:
RREESSUULLTTAADDOO SSOOM MEENNTTEE NOME SALARIO
DDOO SSEELLEECCTT DDEE NNÍ ÍVVEELL RREESSUULLTTAADDOO DDAA SSUUBBQQUUEERRYY SANTANA 18357.50
MAIS
MAIS ALTOALTO RREETTOORRNNAADDOO PPAARRAA OO NNI IVVEELL ORSINI 18171.25
SSUUPPEERRI O
I ORR

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 122 -


Considerações Subquery

• Pode ser usado no WHERE ou no HAVING

• Pode ser encadeado

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

• Deve ser colocado entre parênteses.

• Antes da Versão 7 do DB2, 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 condição de busca.

• NÃO pode conter UNION, UNION ALL ou O R D E R B Y

• Muitas vezes é citado como SUBSELECT. Prefira SUBQUERY.

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 123 -


Subquery com uma Linha

Mostrar o funcionário com o maior salário da empresa

SELECT NOME, SALARIO FROM X.STAFF


WHERE SALARIO =
(SELECT MAX(SALARIO) FROM X.STAFF)

Resultado :

NOME SALARIO

MOLINARI 22959.20

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 124 -


Subquery C/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 (SALÁRIO)


FROM X.STAFF
GROUP BY DEPT

Resultado:

20865.862500000
20865.862500000
15482.332500000
15482.332500000
16000.000000000
16000.000000000

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 125 -


Subquery C/Várias Linhas: ALL (cont.)

• 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 SALARIO

FRAYE 21150.00
GRHAM 21000.00
JONES 21234.00
MOLINARE 22959.20

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 126 -


Subquery C/Várias Linhas: Any ou Some

Lista
Listaclassificada
classificadados
dosfuncionários
funcionárioscom
comsalário
saláriomaior
maiorque
queaa
média
médiasalarial
salarialde
dealgum
algumdepartamento
departamento

• Encontrar média salarial para cada departamento .

SELECT AVG (SALÁRIO)


FROM X.STAFF
GROUP BY DEPT

Resultado:

20865.862500000
20865.862500000
15482.332500000
15482.332500000

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 127 -


Subquery C/Várias Linhas: Any ou Some (cont.)

• 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
DANIEL 19260.25
DAVIS 15484.50
EDWARDS 17844.00
. .
. .

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 128 -


IN

Lista de gerentes da divisão Sul

SELECT DEPT, NOME


FROM X.STAFF
WHERE CARGO = ‘GER’
AND DEPT IN (SELECT DEPTCOD
FROM X.ORG
WHERE DIVISÃO = ‘SUL’)

• SUBQUERY resulta numa lista de D E P T C O D s da divisão Sul (66 e 84).

• ‘IN’ eqüivale a uma série de ‘OR...=‘sobre uma coluna

• “=ANY” pode substituir “IN”

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 129 -


IN (cont.)

SELECT DEPT, NOME


FROM X.STAFF
WHERE CARGO = ‘GER’
AND DEPT = ANY (SELECT DEPTCOD
FROM X.ORG
WHERE DIVISÃO = ‘SUL’)

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 130 -


Subquery Num Having

Liste
Liste os
os departamentos
departamentos cuja
cuja média
média salarial
salarial éé inferior
inferiorààmedia
mediada
da
companhia,
companhia, com as suas respectivas médias. O salário dos
com as suas respectivas médias. O salário dos gerentes
gerente s
não
não deve
deve ser
ser considerado.
considerado. Ordene
Ordene pela
pela média.
média.

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 COL1

66 16880.175000000
51 16235.200000000
84 15443.000000000
20 15309.530000000

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 131 -


Subquery Correlacionado

Listar
Listar os
osempregados
empregadoscom
comsalário
saláriosuperior
superiorààmédia
médiade
deseus
seus
respectivos departamentos.
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 subselect correlacionado é executado a cada linha devolvida ao


select externo.

• Deve ser evitado.

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 132 -


Subquery com EXISTS - Testando V ou F

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

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 133 -


Subquery com EXISTS

Liste
Liste os
os gerentes
gerentes ganhando
ganhando menos
menosqueque$18.000
$18.000se seexistir
existir
pelos menos um gerente com salário superior a $22.000.
pelos menos um gerente com salário superior a $22.000.

SELECT ID,NOME, SALÁRIO, DEPT


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

ID NOME SALÁRIO DEPT

30 MAR E N C H I 17506.75 38

• VERDADEIRO/FALSO NO SELECT INTERNO

Determina se o SELECT externo será executado.

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 134 -


Manutenção

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 135 -


Insert de uma Linha

INSERT INTO PROJ


VALUES (‘MA2114’,’ ‘,’B01’,’ ‘,NULL,CURRENT DATE,NULL)
- - OU - -
INSERT INTO PROJ
(DEPT, PCODIGO, PNOME, RESP, DATAIN)
VALUES (‘B01’,‘MA2114’,’ ‘,’ ‘,CURRENT DATE)
Obs.- formato obrigatório no banco.

Resultado:
PCOD PNOME DEPT R E S P EQUIPE DATAINI DATAFIM
............ ................. .... .......... .......... ............. ..............
OP2011 SUP. SISTEMA E21 000320 001.00 19880101 19880201
OP2012 SUP. APLICAÇÃO E21 000330 001.00 19880101 19880201
OP2013 SUP. DB \DC E21 000340 001.00 19880101 19880201
............. ................. .... ............ ........... ............. ...............
MA2114 B01 ? 19880920 ?

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 136 -


Insert de Múltiplas Linhas

TESTPROJ
PCOD PNOME DEPT RESP E Q U I P E DATAINI DATAFIM

INSERT INTO TESTPROJ


SELECT * FROM PROJ
WHERE DEPT LIKE ‘B%’
OR DEPT IN(‘E11’, `E21’, ’E31’)

Resultado:

PCOD PNOME DEPT RESP E Q U I P E DATAINI DATAFIM


PL2100 ................. B01 000020 001.00 19870101 19870915
OP1010 OPERAÇÃO E11 000090 005.00 19860101 19880501
OP2010 SUP. SISTEMA E21 000100 004.00 19820101 19880201
OP2011 ................... E21 000320 001.00 19820101 19880201
OP2012 ................... E21 000330 001.00 19820101 19880201
OP2013 ................. E21 000340 001.00 19820101 19880201

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 137 -


Update de Colunas

ANTES:
PCOD PNOME DEPT R E S P EQUIPE DATAINI DATAFIM
............ ................. .... .......... .......... ............. ..............
OP2011 SUP. SISTEMA E21 000320 001.00 19880101 19880201
OP2012 SUP. APLICAÇÃO E21 000330 001.00 19880101 19880201
OP2013 SUP. DB \DC E21 000340 001.00 19880101 19880201
............. ................. .... ............ ........... ............. ...............
MA2114 B01 001.00 19880920 19890201
UPDATE RESTPROJ
SET EQUIPE = EQUIPE * 2, DATAFIM = NULL,
DATAINI = ‘1987-06-01’
WHERE DEPT = ‘B01’
PCOD PNOME DEPT R E S P EQUIPE DATAINI DATAFIM
............ ................. .... .......... .......... ............. ..............
OP2011 SUP. SISTEMA E21 000320 001.00 19880101 19880201
OP2012 SUP. APLICAÇÃO E21 000330 001.00 19880101 19880201
OP2013 SUP. DB \DC E21 000340 001.00 19880101 19880201
............. ................. .... ............ ........... ............. ...............
MA2114 B01 002.00 19870601 ?

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 138 -


Update de Colunas (cont)

um subconjunto de linhas

UPDATE PESSOAL
SET SALARIO = SALARIO + 300
WHERE CARGO = ‘ATEND’
todas as linhas:

UPDATE PESSOAL
SET ANOS = ANOS + 1

Obs.: Cuidado com este tipo de alteraçao, pois todas as linhas serão
afetadas

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 139 -


Delete de Linhas

ANTES:
PCOD PNOME DEPT RESP EQUIPE DATAINI DATAFIM
............ ................. .... .......... .......... ............. ..............
OP2011 SUP. SISTEMA E21 000320 001.00 19880101 19880201
OP2012 SUP. APLICAÇÃO E21 000330 001.00 19880101 19880201
OP2013 SUP. DB \DC E21 000340 001.00 19880101 19880201
............. ................. .... ............ ........... ............. ...............
MA2114 B01 001.00 19880920 19890201

DELETE FROM TESTPROJ


WHERE DEPT = ‘B01’

DEPOIS:
PCOD PNOME DEPT RESP E Q U I P E DATAINI DATAFIM
............ ................. .... .......... .......... ............. ..............
OP2011 SUP. SISTEMA E21 000320 001.00 19880101 19880201
OP2012 SUP. APLICAÇÃO E21 000330 001.00 19880101 19880201
OP2013 SUP. DB \DC E21 000340 001.00 19880101 19880201
............. ................. .... ............ ........... ............. ...............

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 140 -


Delete de Todas as Linhas

ANTES:
PCOD PNOME DEPT RESP EQUIPE DATAINI DATAFIM
............ ................. .... .......... .......... ............. ..............
OP2011 SUP. SISTEMA E21 000320 001.00 19880101 19880201
OP2012 SUP. APLICAÇÃO E21 000330 001.00 19880101 19880201
OP2013 SUP. DB \DC E21 000340 001.00 19880101 19880201
............. ................. .... ............ ........... ............. ...............
MA2114 B01 001.00 19880920 19890201

DELETE
DELETE FROM
FROM TESTPROJ
TESTPROJ

Obs.: Cuidado com este tipo de deleção, pois todas as linhas ser ão
afetadas

DEPOIS:
PCOD PNOME DEPT RESP EQUIPE DATAINI DATAFIM

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 141 -


Programação
Parte 2

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 142 -


Programa em Linguagem Tradicional

NÃO RELACIONAL RELACIONAL

COBOL
PLI SQL SQL
embutido
FORTRAN
A S S E MB L E R
C

ARQUIVOS CURSOR
TABELAS
REGISTROS VAR.HOST LINHAS

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 143 -


Programação

• O SQL trabalha com tabelas e linhas. É uma linguagem desenvolvid a


para manipular conjuntos.

• Já as linguagens tradicionais trabalham com arquivos e registros e não


conseguem reconhecer tabelas e linhas.

• 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 COMAND LEVEL do CICS.

• Para simularmos um arquivo com seus registros, trabalha-se com o


CURSOR do DB2. Assim, o programa pode acessar linhas de uma
tabela para uma manipulação qualquer.

• As colunas não são manipuladas diretamente pelas linguagens


tradicionais. Para isto são utilizadas as variáveis HOST que “hospedam”
o conteúdo das colunas.

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 144 -


Instrução SQL

INSTRUÇÃO SQL entre DELIMITADORES

EXEC SQL DELETE FROM DEPT END-EXEC.

DELIMITADORES

COBOL EXEC SQL


instrução SQL END-EXEC.
PL/I EXEC SQL
instrução SQL ;
FORTRAN EXEC SQL
X instrução SQL
ASSEMBLER EXEC SQL
instrução SQL X

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 145 -


Instrução SQL (cont.)

• O compilador das linguagens tradicionais não entende a linguagem SQL


• Para separar uma instrução SQL da codificação normal do programa, são
utilizados delimitadores que são diferentes para cada linguagem adotada.
• O pré-compilador do DB2 localiza as instruções SQL por meio dos
delimitadores e os substitui por CALLS do DB2. Assim o fonte fica
adequado para ser submetido ao compilador.
• O delimitador que indica o inicio de um SQL é comum, à todas as
linguagens.
• O final de um SQL é o delimitador “END-EXEC.” no COBOL, e “;” no PL/I.
• No FORTRAN o pré -compilador identifica o fim de uma instrução SQL
quando nas linhas seguintes à do “EXEC SQL” não encontrar mais o
caracter de continuação “X” na coluna 6.
• No ASSEMBLER o caracter “X” na coluna 72 indica que a instrução
continua na linha seguinte.

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 146 -


Variável Host

PARA FORNECER UM VALOR AO DB2

COBOL

MOVE ‘22000’ TO SAL.

22000 SAL

SQL

EXEC SQL... WHERE SALÁRIO = :SAL END-EXEC.

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 147 -


Variável Host (cont.)

• Variáveis HOST são utilizadas para permuta de valores entre o 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 SQL, tornando-a genérica.

• A referência à variável HOST deve ser precedida pelo caracter “:”.

• No banco é obrigatório usar o DCLGEN para definir as variáveis HOST


correspondentes as colunas das tabelas DB2.

• A variável HOST deve ser compatível com a coluna, quanto ao seu tipo
de dado e tamanho.

• Variáveis HOST não podem ser utilizadas para referenciar nome de


tabelas ou nome de colunas.

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 148 -


Outros Exemplos

PARA FORNECER UM VALOR AO DB2

EXEC SQL INSERT INTO EMPR


(MATR, SOBRENOME)
VALUES (:MATR, :SNOME) END-EXEC.

MATR SNOME
EXEC SQL
UPDATE EMPR
SET SALARIO = SALARIO * :REAJ
WHERE CARGO = :CARGO
END-EXEC.

CARGO REAJ

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 149 -


Variável Host (Cont.)

• Variáveis HOST podem ser utilizadas também para o DB2 passar um


valor para o programa.

• São necessárias numa instrução SELECT embutida.

• Uma variável HOST para cada coluna selecionada.

• O tipo de dado e o tamanho das variáveis e das colunas devem ser


compatíveis.

• Variáveis adicionais chamadas variáveis indicadoras são necessár ias


quando a coluna pode ser nula. Serão apresentadas mais tarde

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 150 -


Variável Host (Cont.)

P A R A R E C E B E R U M VALOR DO DB2

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

• SELECT .... INTO só pode ser usado quando a tabela resultado


tem no máximo 1 linha

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 151 -


Variável Host (Cont.)

ESTRUTURA

EXEC SQL SNOME


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

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 152 -


Variável Host (Cont.)

• Uma série contígua de variáveis HOST podem ser agrupadas num


conjunto chamado de ESTRUTURA.

• A estrutura pode ser referenciada como uma unidade, conforme o


exemplo.

• Devem ser selecionadas somente as colunas necessárias ao


processo.

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 153 -


Definição de Variável Host

DADOS
DADOS NUMÉRICOS
NUMÉRICOS

DB2 PL/I COBOL ASSEMBLER FORTRAN


DCL N1 BIN 01 NI PIC S9(4)
SMALLINT N1 DS H INTEGER*2/N1
FIXED(15) COMP.

DCL N2 BIN 01 N2 PIC S9(9)


INTEGER/ INT N2 DS F INTEGER*4 N2
FIXED(31) COMP.

DECIMAL (5,2) DCL N3 DEC 01 N3 PIC S9(3)V9(2) N3 DC


R E A L *8 NE
/ DEC (5,2) FIXED(5,2) COMP -3. PL5’000.00

R E A L *4 N4 /
FLOAT(21) DCL N4 BIN 01 N4 COMP -1. N4 DS E
REAL N4
FLOAT / R E A L *8 N5 /
FLOAT(53) / DCL N5 BIN DOUBLE
01 N5 COMP - 2. N5 DS D
DOUBLE FLOAT(53) PRECISION N5
PRECISION

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 154 -


Definição de Variável Host (cont.)

CCAARRAACCTTEERR SSTTRRIINNGG

DB2 PL/I COBOL ASSEMBLER FORTRAN


DCL STR1 STR1 DS CHARACTER*10
CHAR(10) 01 STR1 PIC X(10)
CHAR (1); CL10 STR1
01 STR2
VARCHAR(80) D C L S T R 2 STR2 DS H, CHARACTE*80
49 STR2L
CHAR (80) VAR; CL80 STR2
PIC S9(4) COMP.
49 STR2C
PIC X(80).

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 155 -


Definição de Variável Host (cont.)

DATA/HORÁRIO/TIMESTAMP

DB2 PL/I COBOL ASSEMBLER FORTRAN


DATE DCL DT CHAR(10) 01 DT PIC X(10) DT DS CL10 CHARACTER*10 DT
TIME DCL TM CHAR(8) 01 TM PIC X(8) TM DS CL8 CHARACTER*8 TM
TIMESTAMP DCL TS CHAR(26) 01 TS PIC X(26) TS DS CL26 CHARACTER*26 TS

DOUBLE BYTE CHARACTER STRING

DB2 PLI COBOL


GRAPHIC (5) DCL DBC1 GRAPHIC(5) 01 DBC1 PIC G(5) DISPLAY-1.

VARGRAPHIC (40) DCL DBC2 GRAPHIC(40) VAR 01 DBC2


49 DBC2L PIC S9(4) COMP.
49 DBC2C PIC G(40) DISPLAY-1.

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 156 -


Definição de Variável Host (cont.)

• Dados DATE/TIME são sempre convertidos para representação em


caracteres, quando são assinalados para as variáveis HOST.

• DATE(ISO): aaaa-mm-dd (10 caracteres)

• TIME(ISO): hh.mm.ss (8 caracteres)

• TIMESTAMP: aaaa-mm-dd-hh.mm.ss.nnnnnn (26 caracteres)

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 157 -


Commit/Rollback

• COMMIT

• INDICA FIM DE UMA LUW


• ATUALIZAÇÃO
• CURSOR FECHADO (EXCETO COM OPÇÃO WITH HOLD)

• ROLLBACK

• LUW ABORTADA
• ATUALIZAÇÃO DESFEITA A PARTIR DO ÚLTIMO COMMIT
• CURSOR FECHADO (EXCETO COM OPÇÃO WITH HOLD)

**** No Banco todo programa BATCH que atualiza tabelas DB2 deve ter
COMMIT e lógica de RESTART. Consultar normas do KIT ANALISTA.

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 158 -


Commit/Rollback (cont.)

• A instrução COMMIT:

• valida todas as atualizações feitas até então


• atualizações são registradas no LOG
• pode liberar as páginas e/ou tablespaces presos (lock)
• indica que uma LUW chegou ao seu final com sucesso
• todos os cursores abertos são fechados (SEM OPÇÃO WITH HOLD)

• A instrução ROLLBACK:

• LUW corrente será abandonada


• todas as atualizações feitas a partir do último COMMIT são
desfeitos
• pode liberar as páginas e/ou tablespaces presos (lock)
• todos os cursores são fechados (SEM OPÇÃO WITH HOLD)

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 159 -


Luw

UPDATE UPDATE COMMIT


CONTA POUPANÇA

500 500 400 500 400 600 400 600


CONTA POUPANÇA
CONTA POUPANÇA

100 100

PONTO DE NOVO PONTO DE t


CONSISTÊNCIA CONSISTÊNCIA
LUW
ROLLBACK

500 500

LUW ABORTADA t

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 160 -


Luw (cont.)

• Uma Logical Unit of Work (LUW) também é conhecida com UNIT OF


WORK ou UNIT OF RECOVERY.
• Alguns processamentos podem ser divididos logicamente em pontos nas
quais os dados estão “consistentes”.
• 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 adicionando na POUPANÇA, teríamos uma situação de
inconsistência dos dados.
• Assim, é inaceitável que um processamento seja interrompido durante
uma LUW.
• Para o DB2, o final de uma LUW é chamada de commit point. Esta situação
é estabelecida:
• ao término normal do programa
• com execução de um comando via programa (COMMIT, Check point
etc., dependendo do ambiente)
• Uma LUW incompleta deve ser desfeita até o último COMMIT point. Este
processamento é conhecido com ROLLBACK. O ROLLBACK é disparado:
• ao término anormal de programa
• com execução de um comando via programa

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 161 -


Commit/Rollback

COMMIT
TSO/BATCH IMS CICS
call C H K P comando SYNCPOINT
COMMIT call sync
GU IOPCB
Automaticamente ao término NORMAL DO PROGRAMA

ROLLBACK

TSO/BATCH IMS CICS


call R O L L comando ROLLBACK
ROLLBACK call R O L B

Automaticamente ao término ANORMAL DO PROGRAMA

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 162 -


SQLCA

• NECESSÁRIO PARA O PROGRAMA

• FORNECE INFORMAÇÕES SOBRE O SQL EXECUTADO

• EMBUTIDO NO PROGRAMA VIA:

EXEC SQL INCLUDE SQLCA END -E X E C .

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 163 -


SQLCA (cont.)

• O DB2 passa as informações referentes à execução de uma


instrução SQL num bloco de controle chamado SQL
COMMUNICATION AREA (SQLCA).

• O SQLCA é rotulado como “SQLCA” e é necessário ao 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 no programa pelo


precompilador se incluirmos a instrução “INCLUDE SQLCA”.

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 164 -


SQLCA (cont.)

CONDIÇÃO SQLCODE

ERRO GRAVE negativo

ADVERTÊNCIA positivo
diferente de 100 VERIFICAR
VERIFICAR
SQLWARN0
SQLWARN0
NÃO
ENCONTRADO + 100
OU
FIM DO CURSOR

SUCESSO 0

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 165 -


Formato SQLCA

01 SQLCA.
05 SQLCAID PIC X(8).
05 SQLCABC PIC S9(9) COMP-4.
05 SQLCODE PIC S9(9) COMP-4.
05 SQLERRM.
49 SQLERRML PIC S9(4) COMP-4.
49 SQLERRMC PIC X(70).
05 SQLERRP PIC X(8).
05 SQLERRD OCCURS 6 TIMES
PIC S9(9) COMP-4.
05 SQLWARN.
10 SQLWARN0 PIC X.
10 SQLWARN1 PIC X.
10 SQLWARN2 PIC X.
10 SQLWARN3 PIC X.
10 SQLWARN4 PIC X.
10 SQLWARN5 PIC X.
10 SQLWARN6 PIC X.
10 SQLWARN7 PIC X.
05 SQLEXT.
10 SQLWARN8 PIC X.
10 SQLWARN9 PIC X.
10 SQLWARNA PIC X.
10 SQLSTATE PIC X(5).

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 166 -


SQL Warning

Se SQLWARN0 = ‘ ‘ : SQLWARN1 ~ 6 estão


Brancos. SE SQLWARN0 =‘W’ : algum SQLWARN..
setado para ‘W’

SQLWARN1 : string assinalada á variável HOST foi truncada


SQLWARN2: nulos ignorados no cálculo de uma função de coluna

SQLWARN3: número de colunas maior que o de variáveis HOST

SQLWARN4: UPDATE ou DELETE “PREPARED” não apresenta cláusula


WHERE.
SQLWARN5: instrução SQL/DS inválida no DB2
SQLWARN6: valor de data ou TIMESTAMP corrigidas de um valor
inválido resultante de uma operação aritmética.

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 167 -


SQL Warning (cont.)

• O campo SQLWARN0 é usado para alguns casos de advertência.


Devem ser examinados em casos de SQLCODE positivos ou zero.

• 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 faz com que


SQLERRD(3) =-1

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 168 -


Auxílio à Codificação

• INSTRUÇÃO WHENEVER
manipulação de exceções

• DCLGEN
gerar declaração de variáveis HOST

• INSTRUÇÃO INCLUDE
embutir estrutura de SQLCA/var.HOST no programa

• DSNTIAR/DSNTIR
rotina de formatações de mensagens de erro.

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 169 -


Instrução Whenever

EXEC SQL WHENEVER CONDIÇÃO AÇÃO END-EXEC.

CONDIÇÃO

SQLERROR : SQLCODE negativo


SQLWARNING : SQLCODE positivo diferente de 100
ou SQLWARN0 = ‘W’
NOT FOUND : SQLCODE = +100

AÇÃO

GO TO :X
CONTINUE

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 170 -


Instrução Whenever (cont.)

• Esta instrução testa o SQLCODE na SQLCA após cada execução de um a


instrução SQL e para uma determinada condição de execução, toma uma
ação determinada.
• A instrução WHENEVER é substituída por códigos “IF... THEN... ELSE”
pelo pré-compilador.
• A instrução WHENEVER não é uma rotina de inicialização como o ON
CONDITION do PL/I. O pré-compilador insere a condição equivalente logo
após cada instrução SQL do programa fonte.
• Ex.: EXEC SQL WHENEVER SQLERROR GO TO :ROTULOZ;
Com esta instrução, um SQLCODE negativo faz o programa saltar para a
rotina rotulada por ROTULOZ.
• As três condições de exceção podem estar em efeito ao mesmo tempo.
• O efeito do WHENEVER é válido para qualquer instrução SQL que vem
codificado depois da mesma. Seu efeito é cancelado por um
“WHENEVER... CONTINUE” ou substituído por outro “WHENEVER... GO
TO...”.
• Só no cobol.

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 171 -


DCLGEN

TABELA EMPR
MATR CHAR (6)
NOME VARCHAR(12)
CATÁLOGO

DCLGEN

ME MB 3
01 DCEMPR.
10 MATR PIC X(6).
10 NOME.
49 NOME -LEN PIC S9(4) USAGE COMP.
49 NOME -TEXT PIC X(12).

BIBLIOTECA INCLUDE

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 172 -


DCLGEN (cont.)

• O DCLGEN é um programa que gera uma codificação de declaração de


variáveis HOST correspondentes às colunas de uma dada tabela.

• Esta codificação é feita numa das seguintes linguagens: COBOL,


COBOL II, PL/I e C.A escolha da linguagem é feita na opção defaults do
painel DB2I.

• O DCLGEN gera também uma instrução SQL “DECLARE TABLE” para


ser utilizado pelo pré-compilador.

• Tanto a instrução DECLARE TABLE como a codificação das variáveis


HOST são armazenadas num único membro de uma biblioteca.

• A função de manter uma biblioteca de INCLUDE com a saída do


DCLGEN normalmente é exercida pelo suporte.

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 173 -


Instrução Include

MEMB3

EXEC SQL
INCLUDE MEMB3
END -E X E C .
. 01 DCLEMPR.
. 10...
.
EXEC SQL
INCLUDE SQLCA 01 SQLCA
END-E X E C . 05...

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 174 -


PREPARAÇÃO DE PROGRAMA COM
SQL

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 175 -


Preparação de Programa com SQL

PREPARAÇÃO
PREPARAÇÃO DE
DE PROGRAMA
PROGRAMA COM
COM SQL
SQL

Código fonte com SQL

Biblioteca de Include

PRECOMPILE

Fonte Modificado DBRM (Biblioteca)


Catálogo do DB2

COMPILE BIND
Definição Table/Column

Autorizações
Módulo Objeto
SYSPACKAGE

LINK EDIT

Diretório do DB2 Diretório do DB2

Package Plan

L o a d Módulo EXECUTE
(Language Interface)

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 176 -


Preparação de Programa com SQL (cont.)

• A preparação de um Programa é o nome que damos ao processo que


torna um programa fonte em um módulo de carga executável.

• Em linhas gerais a preparação de um programa é constituído das


seguintes fases:

• Pré-compilação

• Compilação e Linkedição

• BIND

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 177 -


Precompilador

• O Pré-compilador roda independente do DB2 - não acessa o catálogo.


• Verifica a SINTAXE dos comandos SQL
• A partir do fonte gera dois data sets “selados” com um timestamp:
• DBRM (Data Base Request Module): contém todas as instruções SQL
embutidas no fonte.
• Fonte Modificado: O novo fonte o pré- compilador:
• coloca as instruções EXEC SQL como comentários e transforma-as
em CALL’s para o DB2.
• transforma a instrução WHENEVER em lógica “IF...THEN...ELSE...”
• Inclui a declaração de tabelas e a declaração de variáveis host
(output do DCLGEN). 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
• Inclui a SQLCA
• Gera um relatório de execução com eventuais mensagens de erro.

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 178 -


Compilador / Linkage Editor / Bind

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


pelo pré-compilador. O timestamp é copiado do fonte.

• O linkage editor gera o módulo de carga a partir do módulo objeto


e do módulo de interface de linguagem do DB2. O timestamp
original é copiado do módulo.

• O processador de BIND gera o package a partir do DBRM.

• O timestamp é copiado do DBRM.

• Um package contém a estratégia de acesso aos dados DB2 onde


são descritos informações como :

• índices utilizados
• estratégia de locking
• estratégia de resolução de 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.

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 179 -


Visão Geral “Bind”

VISÃO GERAL “BIND”

DBRM Catálogo
no PDS BIND do DB2
VALIDAÇÃO
Table/col Table/col
Referencias descrições
AUTORIZAÇÃO
Tipo de usuários
soliticação autorizados
ESTRATÉGIA DE ACESSO
Tipo de características
solicitação físicas

DBRM
na Package
S Y S I B M . S Y S P A C K S T MT

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 180 -


Visão Geral “Bind” (cont.)

• O propósito do BIND é a geração de um package. As entradas


necessárias são o DBRM e o catálogo.

• Os procedimentos executados são:

• checagem da consistência da instrução SQL com os objetos sendo


manipulados (nome, formato 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 package é carregado no diretório e uma cópia do DBRM é
carregado no catálogo.

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 181 -


Visão Geral “Bind” (cont.)

• O BIND ADD é utilizado para criar um novo package.

• O BIND REPLACE é utilizado quando a própria instrução foi alterada


e queremos refazer o package existente.
• O REBIND é utilizado quando o SQL está inalterado mas ocorreu
alguma modificação no ambiente tal como criação/eliminação de
índice, atualização das estatísticas no catálogo que precisam ser
refletidos no package existente.

• O otimizador do DB2 pesa fatores com CPU e I/O para optar por uma
estratégia de acesso.

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 182 -


PACKAGE

DBRM

BIND
B I N D PACKAGE
P A C K A G E(online)
( online ) BBIND
I N D PPACKAGE
A C K A G E ( (batch)
batch)
MEMBER
MEMBER (dbrma)
( dbrma) MEMBER ( dbrma)
MEMBER (dbrma)

online batch

dbrma dbrma

Nome
Nomedo
doPackage
P a c k a g e=Collection_id.Package
=Collection _id.P a c k a g e_id
_id

Os packages são armazenados em Collections

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 183 -


COLLECTION

Uma COLLECTION é um conjunto de Packages

Exemplo:
online batch

pkg1 pkg3

A collection é implicitamente criada no primeiro bind package


se referenciando a ela

BIND
BIND PACKAGE
PACKAGE (online ) MEMBER
( online) MEMBER (pkg1)
(pkg1)
BIND
BIND PACKAGE
PACKAGE (batch)
(batch) MEMBER
MEMBER (pkg3)
(pkg3)

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 184 -


TOKEN DE CONSISTÊNCIA - Prep. do Programa

prog3 prog1 prog2

Pre-compilador

prog3 prog1 prog2 dbrm3 dbrm1 dbrm2

Compilador/ Link-edit
BIND PACKAGE
Diretório
Load Módulo

dbrm3 dbrm1 dbrm2

: Timestamp da precompilação

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 185 -


Plano - ligação entre o package e o load modulo

. lmoda
CALL DSNHLI (dbrm1, ,1)
.
.
CALL DSNHLI (dbrm1, ,2)
.
.
Diretório
CALL DSNHLI (dbrm3, ,1)
.
collx colly
RUN PROGRAM ( Imoda)
PLAN ( plana) dbrm1 dbrm3 dbrm1
plana

collx.dbrm1, collz.*
dbrm2

BIND PLAN (plana) collz


P K L I S T ( collx .dbrm1, collz.*)

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 186 -


PLANOS E PACKAGES

• Um package somente pode ser localizado e executado via um PLANO

• Um PLANO contém a PACKAGE LIST, um a lista de ponteiros para os


packages

• O nome do DBRM e o timestamp fornecido no call é usado para localizar


o package correto através da package list

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 187 -


ERRO DE TIMESTAMP

.
CALL DSNHLI (dbrm1, ,1)
.

plana

colly .*, collx.*

RUN PROGRAM (Imoda)


PLAN (plana)

colly collx

dbrm1 dbrm1

-805
51002

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 188 -


BIND - opção QUALIFIER

..
SELECT...
SELECT...
FROM
FROM TAB1
TAB1
..

BINDPACKAGE
BIND PACKAGE BINDPACKAGE
BIND PACKAGE
BIND PACKAGE
BIND PACKAGE
QUAL (TEST)
QUAL (TEST) QUAL (PROD)
QUAL (PROD)

TEST.TAB1 binder.TAB1 PROD.TAB1

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 189 -


Cursor

SELECT MATR,SOBRENOME P R O C E S S A MENTO DE MÚLTIPLAS LINHAS


FROM EMPR OPEN
W H E R E D E P T =‘D01’
MATR SOBRENOME
030 SILVA
050 PARKER
215 CLARK MATR SNOME
FETCH
MATR SOBRENOME
030 SILVA
050 PARKER
215 CLARK 030 S I L V A
MATR SNOME
FETCH
MATR SOBRENOME
030 SILVA
050 PARKER 050 P A R K E R
215 CLARK MATR SNOME

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 190 -


Cursor (cont.)

• Se o resultado do SELECT pode ter mais de uma linhas, o programa


deve trabalhar com um CURSOR.

• Quando o programa executa o 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 a “próxima linha”. As variáveis HOST conterão os valores
da linha sendo apontada.

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 191 -


Select com Fetch

• DEFINIÇÃO do CURSOR
EXEC SQL
DECLARE K9 CURSOR FOR
SELECT MATR, SOBRENOME
FROM EMPR
WHERE DEPT = :DEPT
END-EXEC.
• OPEN DO CURSOR
EXEC SQL OPEN K9 END-EXEC.
• FETCH das linhas resultantes

EXEC SQL
FETCH K9 INTO :MATR, :SNOME
END-EXEC.
• CLOSE CURSOR

EXEC SQL CLOSE K9 END-EXEC.

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 192 -


Procure Definir

DECLARE CURSOR: No COBOL antes da PROCEDURE


No EASY antes do JOB INPUT
Ou verifique os padrões da sua instalação.

• A instrução DECLARE CURSOR define a seleção dos dados que


comporão a tabela resultante. Um nome deve ser atribuído a 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 o cursor K9.

• A instrução OPEN executa a seleção que está limitada pelo 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 SNOME.

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 193 -


Procure Definir (cont.)

• Um programa típico emite FETCHS sucessivamente até receber o


SQLCODE +100 na SQLCA, que indica fim da tabela resultante.

• O CURSOR deve ser fechado com CLOSE quando não é mais


necessário. O final do programa também faz o DB2 fechar os cursores
abertos.

• Um programa pode ter vários cursores abertos ao mesmo tempo.


Porém, procure sempre manter o menor número de cursores abertos
simultaneamente, para otimizar performance.

• Para programas que irão emitir COMMIT e necessitam reposicionar o


cursor, defina o cursor com a cláusula WITH HOLD.
EXEMPLO:
EXEC SQL DECLARE K9 CURSOR WITH HOLD FOR...

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 194 -


Delete Via Cursor

EXEC SQL
DECLARE CE CURSOR FOR
SELECT ... FROM EMPR...
END-EXEC
.
EXEC SQL OPEN CE END-EXEC
.

EXEC SQL FETCH CE INTO...END-EXEC


.
.
.
EXEC SQL DELETE FROM EMPR
WHERE CURRENT OF CE END-EXEC
.
.
.
.
EXEC SQL CLOSE CE END-EXEC

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 195 -


Delete Via Cursor (cont.)

• Um programa tem a opção de eliminar algumas das linhas apontadas por


um CURSOR.

• A instrução DELETE com a claúsula “WHERE CURRENT OF CURSOR” faz


com que a linha apontada pela última instrução FETCH seja eliminada.

• Este formato aplica-se para o caso de DELETE de linhas apontadas por


um CURSOR. Se não existe a necessidade de exame do conteúdo das
linhas, podemos fazer o DELETE de uma ou múltiplas linhas sem a
utilização de um CURSOR

• Um cursor não pode ser usado para DELETE, se na sua declaração


estiverem presente:

• ORDER BY,
• GROUP BY,
• DISTINCT,
• UNION,
• função ou
• Join.

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 196 -


Update Via Cursor

EXEC SQL
DECLARE CX CURSOR FOR
SELECT ... MATR, SOBRENOME
FROM EMPR
WHERE DEPT = : DPT
FOR UPDATE OF SOBRENOME
END-EXEC
.
EXEC SQL OPEN CE END-EXEC
.
.
EXEC SQL FETCH CX INTO :MATR,:SNOME END
.
.
EXEC SQL UPDATE EMPR
SET SOBRENOME = :NOVOSN
WHERE CURRENT OF CX END-EXEC
.
.
EXEC SQL CLOSE CX END-EXEC

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 197 -


Update Via Cursor (cont.)

• Um programa pode fazer a atualização de algumas linhas apontadas por


um CURSOR.

• A atualização deve ser feita para a linha que está sendo apontada pelo
CURSOR especificado na clausula “WHERE CURRENT OF CURSOR”.

• Somente as colunas especificadas na cláusula “FOR UPDATE OF lista de


colunas” da instrução DECLARE podem ser atualizadas.

• Um programa pode atualizar uma ou múltiplas linhas de uma tabela sem


utilizar um CURSOR.

• Uma instrução DECLARE não pode conter cláusula “FOR UPDATE OF”,
se a instrução SELECT associada contiver:

• ORDER BY,
• GROUP BY,
• DISTINCT,
• UNION,
• função ou
• Join.

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 198 -


Manipulação de Cursor

POSICIONAMENTO
OPEN

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

CLOSE

REUTILIZAÇÃO do CURSOR
OPEN

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 199 -


Manipulação de Cursor (cont.)

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

• FETCH avança o cursor uma linha para frente.

• Antes da Versão 7 do DB2 não existe meio de fazermos um FETCH para


trás.

• CLOSE destrói a posição do cursor

• Um cursor pode ser reutilizado e a sua posição é restaurada para o “topo”


da tabela resultante.

• Um CLOSE não implica no fim de uma logical unit of work (LUW) e


portanto não gera um COMMIT.

• Uma instrução COMMIT fecha todos os cursores sem opção with hold e
valida todas as atualizações efetuadas até então.

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 200 -


Variável Indicadora

EXEC SQL
SELECT CARGO DEPT, FONE, NOME
INTO :CC:CCI, :DPT, :FON:NFON, :NOM
FROM EMPR
WHERE MATR = :ID
END-EXEC.

coluna Var.HOST Var.IND


CARGO :CC :CCI

SELECT/ “ANALISTA” “ANALISTA” 0


FETCH NULO inalterado -1

UPDATE/ “GERENTE” “GERENTE” 0


INSERT NULO ignorado -1

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 201 -


Variável Indicadora (cont.)

• Se uma coluna selecionada permite valor nulo, o DB2 requer 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, conforme o exemplo.

• As variáveis HOST que não trabalham com nulo não requerem uma
variável indicadora. Vide a coluna DEPT do exemplo.

• Para um SELECT OU FETCH, se a coluna apresentar valor nulo, DB2


atribui - 1 à variável indicadora e mantém inalterada a variável HOST,
que deve ser ignorada pelo programa.

• Se um programa envolvendo UPDATE ou INSERT atribuir - 1 à variável


indicadora, o DB2 assumirá valor nulo para a coluna correspondente.

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 202 -


Vetor de Var. Indicadoras

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

ID EST VETOR

01 EST. 01 VETOR.
10 CC PIC... 10 ARRAY PIC S9(4) COMP
10 DPT PIC... OCCURS 3 TIMES
10 FON PIC...
10 NOM PIC...

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 203 -


Vetor de Var. Indicadoras (cont.)

• Se as variáveis HOST estão arranjadas numa estrutura e pelo menos um


de seus componentes trabalha com nulo, o programa deve apresentar
um vetor de variáveis indicadoras.

• O Vetor deve conter uma variável indicadora para cada componente da


estrutura, inclusive as que não trabalham com nulo, até a última variável
HOST que deve trabalhar com nulo.

• No nosso exemplo a 4ª coluna não trabalha com nulo e o nosso vetor


não precisa de 4 indicadoras.

• 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 é somente para o COBOL


ou PL/I.

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 204 -


Outros usos da Variável Indicadora

• As variáveis indicadoras podem ser usadas para indicar outras situações.

• - 2 válido para SELECT externo (numa SUBQUERY por ex.) ou


FETCH. Indica que a coluna tem resultado nulo e a variável HOST
permanece inalterada. O teste de SQLCODE dá novas informações:

• +304 indica erro de conversão. Por exemplo uma variável HOST


não conseguiu comportar um valor maior que 32K,
• + 802 indica erro aritmético resultante de divisão por zero ou over
flow.

• “n” indica que uma variável HOST é pequena demais para conter um
string de “N” caracteres que teve de ser truncado. O SQLWARN1 é
setado para ‘W’.

• Erros de conversão ou de aritmética resultavam -304 ou -802 na ausência


da variável indicadora.

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 205 -


Erros de Aritmética e Conversão - Exemplo

01 MV1 PIC S9(9) COMP VALUE 0. SMI1 INT1 SMI2


01 MV2 PIC S9(9) COMP.
01 MV3 PIC S9(9) COMP. 2 345678 0
01 I-VARIABLES.
05 IV1 PIC S9(4) COMP. 4 2111111111 4
05 IV2 PIC S9(4) COMP.
05 IV3 PIC S9(4) COMP.

EXEC SQL
SELECT SMI1, SMI1*INT1, SMI1/SMI2
INTO :MV1:IV1, :MV2:IV2, :MV3:IV3 FROM TABLEA
END-EXEC.

1. Primeira linha:
MV1 = 1 IV1 =0
MV2 = 691356 IV2 = 0
MV3 = 0 IV3 =-2
SQL CODE =+802
2. Segunda linha: MV1 = 4 IV1 =0
MV2 = 691356 IV2 = -2
MV3 = 1 IV3 =0
SQL CODE =+304

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 206 -


Uso da Variável Indicadora - Resumo

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 a uma erro


aritmético ou de conversão

n (>0) s tring de “n”caracteres truncado


no assinalamento à variável HOST

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 207 -


Estratégia de Acesso

SELECT *
FROM EMPR
WHERE SEXO = ‘F’
AND (CARGO = ‘ANALISTA’ OR SALARIO > 1000)
AND DEPT IN (‘E11’,’D14’)

• ÍNDICES DISPONÍVEIS?

• QUANTIDADE DE PÁGINAS LIDAS SE TABLESPACE FOR


VARRIDO? E SE ÍNDICES FOREM UTILIZADOS?

• QUAL A MELHOR ORDEM DE EXECUÇÃO DOS TESTES?

• EXPLAIN. É usado para verificar qual estratégia foi escolhida


pelo DB2

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 208 -


Estratégia de Acesso (cont.)

• A estratégia de acesso de uma instrução SQL é determinada pelo

otimizador do DB2.

• O otimizador procura a melhor opção de acesso para minimizar o

consumo de recursos de I/O e CPU.

• O otimizador se baseia nas informações estatísticas contidas no

catálogo. Tais informações são atualizadas pelo utilitário RUNSTATS.

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 209 -


Execução do Programa

CICS, IMS, TSO DB2

MÓDULO PLANO
DE CALL
CARGA PACKAGE

RELATÓRIO VSAM TABELAS


DB2

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 210 -


Execução do Programa (cont.)

• O programa é executado no address space do usuário, enquanto que o


package é executado no address space do DB2.

• O acesso às tabelas são feitos através de CALL para o DB2.

• Para impedir que eventualmente um programa venha a utilizar um


package que não lhe pertence, o DB2 checa se os timestamps do módulo
de carga e do package são iguais. O programa não é executado se não
forem coincidentes.

SQLCODE= - 805 (PACKAGE)

• Antigamente não existiam packages , e um plano era composto de um


conjunto de DBRM’s. Para estes planos, quando existe um problema de
timestamp diferente é emitido

SQLCODE= - 818 (PLANO com DBRM)

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 211 -


Considerações Sobre Programação

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 212 -


Recomendações DML

• Use DCLGEN para gerar variáveis HOST compatíveis com

colunas. Evite assim conversões numéricas.

- SELECT A INTO :B

- WHERE A = :B

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 213 -


Recomendações DML (cont.)

• SELECIONE SOMENTE AS COLUNAS DESEJADAS

colunas adicionais = CPU ADICIONAL

• É PROIBIDO O USO DO SELECT * NO BANCO

- adição de colunas poderá provocar erros

- acesso ao catálogo DB2

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 214 -


Recomendações DML (cont.)

• EVITE o subquery correlacionado.

SELECT MATR, SOBRENOME


FROM EMPR E, PROJETO P
WHERE E.DEPT = P.DEPT
AND E.MATR = P.RESP

é mais eficiente que

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

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 215 -


Recomendações DML (cont.)

• Use o ORBER BY somente quando necessário

• CPU ADICIONAL

• I/O ADICIONAL NO DATABASE TEMPORÁRIO

• CONSIDERE SORT EXTERNO NO LUGAR DE ORDER BY

• PARA TABELAS COM GRANDE QUANTIDADE DE LINHAS

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 216 -


Uso do Índice

USO
USO DO
DO ÍNDICE
ÍNDICE
COLUNA INDEXADA INDEX SORT
CANDIDATO CANDIDATO

IN SIM
LIKE NOTA 1
BETWEEN SIM
>,>=,<,<=,¬>,¬<,= SIM
¬=,<> NÃO
NOT NOTA 2
OR NOTA 3
ORDER BY SIM SIM
GROUP BY SIM SIM
DISTINCT SIM SIM
COMPARED TO:
LONGER LITERAL NÃO
ARITIMETIC EXP. NÃO
DIFF. DATA TYPE NÃO
USED FOR JOIN SIM SIM
NOTA 1: Sim, exceto quando a variável – host contiver ‘%’ ou ‘-‘ no início.
NOTA 2: Sim, quando pode ser substituido por operador que usa o índice
NOTA 3: Sim se possível converter em IN.

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 217 -


Expressões Aritméticas

EEXXPPRREESSSSÕÕEESSAARRI TI TMMÉTICAS
ÉTICAS

• MATCHING INDEX EM SALARY NÃO UTILIZADO


EXEC SQL
SELECT LASTNAME, SALARY
FROM TEMPL
WHERE SALARY <= :SAL + 1000
END-EXEC
• MATCHING INDEX EM SALARY CONSIDERADO
SAL = SAL + 1000
EXEC SQL
SELECT LASTNAME, SALARY
FROM TEMPL
WHERE SALARY <=: SAL
END-EXEC

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 218 -


Condições Not

CONDIÇÕES
CONDIÇÕESNOT
NOT

• MATCHING INDEX EM DEPTNO NÃO UTILIZADO


WHERE DEPTNO ¬= ‘E01’
WHERE DEPTNO NOT LIKE ‘E%’
WHERE DEPTNO NOT IN (‘E11’,’D11’)
WHERE DEPTNO NOT BETWEEN ‘A11’ AND ‘B28’
WHERE DEPTNO IS NOT NULL

• MATCHING INDEX EM DEPTNO CONSIDERADO

WHERE DEPTNO ¬> ‘D17’


WHERE NOT DEPTNO < ‘D28’

Evitar a utilização do comando NOT

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 219 -


Uso do “Like”

USO
USO DO
DO “LIKE”
“LIKE”

• MATCHING INDEX EM LASTNAME NÃO UTILIZADO

WHERE LASTNAME LIKE ‘%SON’


WHERE LASTNAME LIKE ‘_SON’
WHERE SUBSTR(LASTNAME ,3,3) = ‘SON’

• MATCHING INDEX EM LASTNAME CONSIDERADO

WHERE LASTNAME LIKE ‘B_S%’

Evitar a utilização do comando LIKE

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 220 -


Subqueries

SSUUBBQQUUEERRI IEESS

• MATCHING INDEX EM DEPTNO CONSIDERADO:


WHERE DEPTNO =(SELECT WORKDEPT FROM EMPL
WHERE EMPNO = ‘123456’)
- SUBQUERY NÃO-C O R R E L A T A
- VALOR ÚNICO DA SUBQUERY

• MATCHING INDEX EM DEPTNO NÃO UTILIZADO


WHERE DEPTNO= ANY (SELECT WORKDEPT
FROM EMPL
WHERE LASTNAME=‘SMITH’)
SELECT LASTNAME, FIRSTNAME
FROM EMPL MY
WHERE SALARY> (SELECT AVG(SALARY)
FROM EMPL
WHERE WORKDEPT = MY.WORKDEPT)
- LISTA DE VALORES DA SUBQUERY

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 221 -


Explain

• INFORMA A ESTRATÉGIA DE EXECUÇÃO DE UMA INSTRUÇÃO SQL

− ESCOLHA DO CAMINHO (ÍNDICE X TABLESPACE SCAN)


− ÍNDICES UTILIZADOS
− SORTS REQUERIDOS
− SEQUÊNCIA DE PROCESSAMENTO DAS SUBQUERIES
− ESTRATÉGIA DE LOCKING
SELECT
SELECT MATR,
MATR, SOBRENOME
SOBRENOME FROM
FROM EMPR
EMPR
WHERE ......AND......AND......
WHERE ......AND......AND......

EEXXPPLLAAIINN Instrução ou opção do BIND

P L A N -T A B L E

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 222 -


Explain (cont.)

• FERRAMENTA DO DBA PARA DETERMINAR

• NECESSIDADE DE ÍNDICE
• PROBLEMA DE LOCKING

• FERRAMENTA DO PROGRAMADOR

• TESTAR ALTERNATIVAS DE ESTRATÉGIAS


• VERIFICAR EFICIÊNCIA DA INSTRUÇÃO SQL

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 223 -


Explain (cont.)

EEXXPPLLAAI INN

Comando EEXPLAIN
XPLAIN PLAN - TABLE
SQL

• EXPLAIN ALL

SET QUERY = n
FOR sql-statement

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 224 -


Plan_table

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 225 -


Plan_table (cont.)

PF3

EDIT – DB2. DISCOVER.EXPLAIN(GOLD) -01.03 ----------


COMMAND===> ; ; ;
****** ************** TOP OF DATA ****************
000100 EXPLAIN ALL SET QUERYNO = 1 FOR
000200 SELECT LASTNAME , FIRSTNAME , SALARY
000300 FROM EMP
000400 WHERE EMPNO = ‘ 000280 ’ ;
000500 - - -
000600 SELECT *
000700 FROM PLAN_TABLE
000800 WHERE QUERYNO = 1 ;
****** ************* BOTTOM OF DATA **************

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 226 -


Plan_table (cont.)

PPLLAANN__TTAABBLLEE

• ACCESSTYPE:

− R =T A B L E S P A C E S C A N ( T A B L E S C A N I F S E G M E N T E D T S )
− I = INDEX SCAN
− M = One fetch INDEX access for MIN or MAX function
− N = INDEX access for IN list
− M =Multiple INDEX SCAN. Followed by MX and MI or MU
− MX =One of multiple INDEX SCANs
− MI =Intersection of multiple indexes
− MU = Union of multiple indexes

I F A C C E S S T Y P E = I , M , N , MX , then:
• ACCESSNAME: Name of Index
• MATCHCOLS: # of matching cols
• INDEXONLY: Y if no data access

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 227 -


Tópicos Adicionais

Parte 3

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 228 -


LOCKING

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 229 -


Locking

• O propósito do mecanismo do LOCKING é indicar se um dado está


sendo utilizado ou não, para permitir ao DB2 organizar um situaç ão
de acesso múltiplo aos dados.

• Protege contra

• acesso a um dado com alteração não validada.


• atualização de um dado que está sendo utilizado (para leitura
por exemplo).

• Um LOCK tem três características:

• Granularidade
• Modo
• Duração

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 230 -


Granularidade - Locksize Tablespace

LLOOCCKKSSIIZZEE TTAABBLLEESSPPAACCEE

UPDATE
SELECT

WAITING

WAITING WAITING

UPDATE SELECT

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 231 -


Granularidade - Locksize Table

LLOOCCKKSSI IZZEE TTAABBLLEE

SELECT UPDATE

WAITING WAITING
UPDATE SELECT

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 232 -


Granularidade - Locksize Page/any

LOCKSIZE
L O C K S I Z E PAGE/ANY
PAGE/ANY

SELECT UPDATE

UPDATE SELECT

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 233 -


Granularidade - Locksize Row

LLOCKSIZE
O C K S I Z E RROW
OW

SELECT UPDATE

UPDATE SELECT

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 234 -


Granularidade do Lock

• Indica a granularidade com que os recursos são presos.


• Em outras palavras o LOCK pode ser dado:

• individualmente a páginas
• a todos os segmentos de uma tabela (se a tabela pertence a um TS
segmentado)
• individualmente a um tablespace

• LOCK a nível de páginas/linha é trabalhoso para o DB2, mas dá um a


maior concorrência.

• LOCK a nível de tabela/tablespace é menos trabalhoso para o DB2, mas


pode causar um maior enfileiramento para espera de recursos.

• A granularidade é especificada como parâmetro durante a definição do


tablespace

• Para tablespaces segmentados ou particionados , um programa pode


sobrepor a granuladidade através do comando LOCK TABLE (PART)

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 235 -


Modo do Lock

• Por modos de LOCKING entenda-se modalidade quanto à


exclusividade sobre um recurso, que podem ser:

• S : (Shared) compartilhado. O dado está em uso para leitura por um ou


mais usuários.

• X :(Exclusive) exclusivo. O dado está em uso por um único usuário e


os demais usuários interessados ficam enfileirados.

• U : (UPDATE). O dado está em uso por um usuário com intenção de


atualizar. Enquanto ele estiver lendo outros também podem ler (S ),
mas quando ele resolver atualizar, o DB2 impede novos acessos e
espera os demais usuários terminarem seus serviços para transformar
o LOCK em tipo X.

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 236 -


Duracão do Lock (cont.)

• Para LOCK de leitura a nível de página ou linha temos quatro es tratégias


possíveis:

• R R Repeatable read
O s locks são adquiridos conforme as páginas/linhas vão sendo
acessadas e são liberados só com um COMMIT. O RR só deve ser
escolhido em situações especiais já que as páginas/linhas ficam presas
por muito tempo. O nome vem do fato de que em caso de repetição de
leitura tenho a garantia de que ninguém atualizou o intervalo de dados
lidos.

• R S Read Stability
Os locks são adquiridos somente nas páginas/linhas que satisfazem
todas as condições da clausula WHERE. Permite uma aplicação ler as
mesmas páginas/linhas de dados mais de uma vez sem que estes dados
tenham sido atualizados por outra aplicação. Oferece maior concorrência
que RR, pois embora as outras aplicaçãoes não possam alterar os dados
lidos pela aplicação original, elas podem inserir novas linhas.

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 237 -


Duracão do Lock (cont.)

• CS Cursor Stability
Os locks são adquiridos conforme a necessidade e liberados
quando o programa lê outra página/linha.

• U R Uncommited Read
NENHUM lock é adquirido para a leitura das páginas/linhas. Permite
a leitura dos dados sem checar a integridade. O UR só deve ser
escolhido em situações especiais aonde a informação lida não
precisa estar 100% garantida. Por exemplo: select sum (tot_vendas)
from vendas – aonde o usuário só quer ter uma idéia do total de
vendas até o momento, sem se importar com a precisão da
informação. USAR COM MUITO CUIDADO.

• O R R deve ser evitado

• Quanto aos locks do tipo X, não há diferença com RR, onde a liberação
ocorre somente com o COMMIT.

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 238 -


Autorizações

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 239 -


Segurança do DB2

Qualquer atividade envolvendo qualquer objeto DB2,

recurso ou função, é um privilégio e requer uma autorização.

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 240 -


Itens Protegidos

DATABASE CATALOG

TABLESPACE UTILITIES

TABLE COMMANDS

INDEX BIND

VIEW EXECUTE

STORAGE GROUP GRANT

BUFFER POOL

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 241 -


Identificação do Usuário do DB2

TSO IMS/DC CICS BATCH

LOGON SIGNON SIGNON PARÂMETRO

USER-ID USER-ID USER-ID USER-ID NO

LTERM TRANSAÇÃO CARTÃO JOB

TERM-ID

No ambiente de Produção do Banco:


B A T C H - o Control-M ONLINE - usuário de signon do CICS

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 242 -


Comando Grant/Revoke

GRANT Lista de privilégios


ON Lista de recursos
TO Lista de USER -IDS

[WITH GRANT OPTION]

• GRANT ... ON ... TO PUBLIC


(Essa autorização vale para qualquer USER-ID)

REVOKE Lista de privilégios


ON Lista de recursos
FROM Lista de USER -IDS

• REVOKE ... ON ... FROM user1

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 243 -


Utilitários

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 244 -


Utilitários DB2

PROCESSAMENTO
UTILITÁRIO FUNÇÃO/DESCRIÇÃO
CONCORRENTE
CHECK TESTA SE OS INDÍCES ESTÃO CONSISTENTES
LEITURA
INDEX COM OS DADOS
TESTA INTEGRIDADE REFERÊNCIAL E AS
CHECK DATA LEITURA
CONTRAINTS

COPY CRIA UMA CÓPIA (BACKUP) DE UM TABLESPACE QUALQUER TIPO

NENHUM NO
CARREGA DADOS DE UM ARQUIVO SEQUENCIAL
TABLESPACE OU
LOAD P AR A UMA OU MAIS TABELAS NO MESMO
PARTIÇÃO SENDO
TABLESPACE
CARREGADO
JUNTA CÓPIAS INCREMENTAIS E/OU TOTAIS E
M E R G E C O P Y CRIA UMA NOVA CÓPIA INCREMENTAL E/OU QUALQUER TIPO
TOTAL
DELETA INFORMAÇÕES SOBRE UMA COPIA DA
MODIFY TABELA DO CATÁLOGO ‘SYSIBM.SYSCOPY’ E DO QUALQUER TIPO
DIRETÓRIO ’SYSIBM.SYSLGRNG’

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 245 -


Utilitários DB2 (cont.)

PROCESSAMENTO
UTILITÁRIO FUNÇÃO/DESCRIÇÃO
CONCORRENTE
QUIESCE ESTABELECE UM ‘QUIESCE POINT’ NO
LEITURA
CATÁLOGO PARA O(S) TABLESPACE(S)
RECUPERA O TABLESPACE, UMA PÁGINA,
RECOVER NENHUM
PARTIÇÃO OU “ERRORANGE”
READY-ONLY
DURANTE
REORG REORGANIZA UM TABLESPACE OU UM INDICE
UNLOAD; NEHUM
DURANTE RELOAD
REPORT
LISTA INFORMAÇÕES DE TABLESPACES QUALQUER TIPO
PROCESSING
ATUALIZA TABELAS CATÁLOGO COM
RUNSTATS ESTATÍSTICAS SOBRE UTILIZAÇÃO DE QUALQUER TIPO
TABLESPACES EFICIÊNCIA DE ÍNDICES
ATUALIZA TABELAS CATÁLOGO COM
STOSPACE ESTATÍSTICAS SOBRE UTILIZAÇÃO DE ESPAÇO QUALQUER TIPO
DE “STORAGE GROUP”

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 246 -


Utilitário ''Load''

CARREGA DADOS SEQUENCIALMENTE PARA UMA OU MAIS TABELAS EM


UM ''TABLESPACE'' OU PARTIÇÃO

ARQUIVO
ARQUIVO
SEQUENCIAL
SEQUENCIAL
DE
DEENTRADA
ENTRADA

UTILITÁRIO
UTILITÁRIO
LOAD
LOAD

UMA OU MAIS TABELAS


DE SAÍDA

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 247 -


Executando o Utilitário ''Load''

VISÃO BÁSICA DAS FASES DE EXECUÇÃO DO ''LOAD''

PHASE 1 PHASE 2 PHASE 3


LOAD SORT
BUILD
SYSUT1
SEQ REGISTROS DO
INPUT INDICE E FOREIGN
KEY

SYSREC
DFSORT TODOS INDICES
TABLE RID MAP
DFSORT
DA TABELA
CARREGADA SYSMAP

ERROS DE
ERROS DE CONVERSÃO NO DUPLICA DOS NO
REGISTROS
SYSERR SORTEADOS SYSERR

PHASE 4 AS DUAS LINHAS


DUPLICADAS SÃO
INDEXVAL TAB ELA REMOVIDAS DA TABELA.
INDICES
DUPLICA DOS
SYSERR

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 248 -


Executando o Utilitário ''Load'' (cont.)

PHASE 5

TABELA PARENT TABELA


FOREIGN VIOLAÇÕES DE
ENFORCE KEY INTEGRIDADE
INVÁLIDAS REFERENCIAL
REMOVIDAS

PHASE 6
SYSERR
DISCARD SEQUENCIAL RID MAP
DA TABELA
DATA SET DE
DISCARD
INPUT
CARREGADA COMPLETO
RID MAP
DA TABELA
SYSUT1 CARREGADA SYSMAP SYSDISC

PHASE 7
ERROR
ERROR
SUMMARY
REPORT TODAS VIOLAÇÕES SUMMARY
ACUMULADAS
SYSERR

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 249 -


LOAD - Fases de Execução

(RE)LOAD O arquivo seqüencial é passado uma vez e todas as tabelas são


carregadas. A saída desta fase consiste em:
- Arquivo Temporário com todos os registros de índices e chaves
estrangeiras.
- Um arquivo que contém o 'RID' onde a linha é armazenada na tabela
e o endereço relativo do registro fonte da linha (no arquivo seqüencial
de entrada).
SORT Somente é executado se as tabelas tiverem índices. Classifica o
índice e as chaves estrangeiras.
BUILD Cria os índices definidos na tabela. Detecta violações de 'índices
únicos' e grava registro no arquivo de saída 'SYSERR'.
INDEXVAL Retira fisicamente as linhas que violaram as regras de 'índice único'
da tabela. Note que ambas são retiradas.
ENFORCE Verifica se todas as chaves estrangeiras da tabela são iguais às
chaves primárias da(s) tabela(s) pai. As linhas encontradas com erro
são fisicamente removidas e os registros de erro são gravados no
arquivo ‘SYSERR’ .

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 250 -


LOAD - Fases de Execução (cont.)

DISCARD Usa o arquivo 'SYSERR' para saber quais linhas tiveram erros e o
arquivo 'SYSMAP' para localizá-las no arquivo seqüencial de entrada,
esta fase cria um arquivo 'DISCARD'. O arquivo 'DISCARD' pode ser
editado (usando 'ISPF') e usado como novo 'INPUT' de 'LOAD' após os
erros terem sido corrigidos.
REPORT Usa 'SYSERR' para listar todas as linhas que não foram carregada s.
Uma linha é considerada errada por qualquer uma das
seguintesrazões:
- Erros de conversão de dados durante a fase '(RE)LOAD'
- Erros de chave duplicada encontrados durante a fase 'BUILD
- Erros de integridade referencial descobertos durante a fase
'ENFORCE‘

No Banco é utilizada a opção DISCARD(1). Esta opção especifica o número


máximo de registros que podem apresentar erro (qualquer tipo). C om isto, as
fases de (RE)LOAD, INDEXAL e ENFORCE abendam no primeiro erro
encontrado.

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 251 -


LOAD - Cartões de Controle

LOAD DATA INTO TABLE TAB_EMPR

WHEN (1:1)=‘*’

(MATR POSITION (2:6),


NOME POSITION (8:16),
.
. )

LOCALIZAÇÃO E TAMANHO DO CAMPO DE INPUT

NOME DA COLUNA DESTINO

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 252 -


Opções Resume e Replace

• LOAD INICIAL:
- Tablespace vazio (Este é o default)
LOAD DATA
R E S U ME NO
INTO TABLE EMP

• LOAD Adicional :
- Tablespace não -vazio
- Para carregar outra tabela no mesmo tablespace
- Para adicionar linhas em uma tabela não-vazia
LOAD DATA
R E S U ME YES
INTO TABLE EMP

• Sobrepor dados antigos:


- Esvazia o tablespace e os índices antes do load
LOAD DATA
REPLACE
INTO TABLE EMP
Uma maneira fácil de fazer um refresh dos dados.

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 253 -


Exercício - Load

T1,T2 E T2 CONTÉM DADOS

COMO VOCÊ FARIA PARA

ADICIONAR DADOS NA T2 DE UM FAZER REPLACE DOS DADOS DA T2


ARQUIVO SEQUENCIAL ? POR UM ARQUIVO SEQUENCIAL ?

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 254 -


Opção Log (Yes/No)

Com esta opção é possível carregar os dados mais rápido, porém p ode
causar impacto no momento do RECOVER.

LOAD DATA
INTO TABLE PROJ
LOG YES /NO

OBS: quando a opção LOG(NO) é utilizada o tablespace fica com o status


de COPY PENDING a não ser que a opção COPYDDN seja utilizada

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 255 -


Utilitário '‘Check Data''

CHECA OS DADOS PARA VERIFICAR SE EXISTEM VIOLAÇÕES DE


INTEGRIDADE REFERENCIAL E DE TABLE CHECK CONSTRAINT.

USER TABELA A
UM OU MAIS TABLESPACES
USER TABELA B

UTILITÁRIO
UTILITÁRIO
CCHHEECCKK
DATA
DATA

ERROR
ERROR
SUMMARY
SUMMARY

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 256 -


CHECK DATA - Fases de Execução

SCANTAB Extrai as foreign keys ; usa o índice da foreign key, se existir,


senão faz scan table

SORT Faz o sort das foreign keys caso elas não tenham sido extraidas
através do índice.

C H E C K D A T Procura no índice da primary key as foreign keys


correspondentes e emite mensagens no relatório para os erros
encontrados.

R E P O R T C K Copia as linhas em erro para as exception tables, e as deleta da


tabela original se DELETE YES foi especificado

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 257 -


Opções do CHECK DATA

• FOR EXCEPTION
Copia linhas inválidas para Exception Tables
• DELETE
Deleta linhas inválidas e todas as descendentes (Exception Table é
requerida)
• SCOPE
- PENDING
Indica que somente as linhas das tabelas ou partições que estão em
CHECK pending status devem ser checadas
- ALL
Checa todas as linhas de todas as tabelas existentes no tablespace
especificado
• EXCEPTIONS n
Termina o utilitário após n+ 1erros

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 258 -


Utilitário '‘Runstats''

OBTEM INFORMAÇÕES SOBRE A CARACTERÍSTICA DOS DADOS NOS TABLESPACES,


ÍNDICES E PARTIÇÕES QUE SERÃO ARMAZENADAS NO CATÁLOGO E USADAS PELO
DB2 PARA DEFINIR O MÉTODO DE ACESSO DURANTE O BIND. TAMBÉM PODEM SER
USADAS PELO DBA PARA AVALIAR A NECESSIDADE DE REORGANIZAÇÃO DOS DADOS

NÚMERO DE LINHAS NA TABELA ?


CLUSTER OK ?
NÍVEL DOS ÍNDICES ? REORGANIZAR ?
NÚMERO DE VALORES DISTINTOS DE UMA COLUNA?

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 259 -


Runstats - Fase de Execução

RUNSTATS F a z scan no tablespace e atualiza o catálogo.

OBS: No Banco existe uma rotina pronta para o R unstats , solicitar a criação ao
analista de produção.

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 260 -


Opções do Runstats

• R E P O R T N O |Y E S

Produz um relatório com as estatísticas obtidas pelo Runstats

• U P D A T E A L L |NONE |S P A C E |A C C E S S P A T H

ALL - inclui ambas opções S P A C E e A C C E S S P A T H

NONE - não atualiza o catálogo

SPACE - atualiza informações relativas a gerenciamento de espaço.

ACCESSPATH - atualiza informações usadas pelo Optimizer

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 261 -


Opções do Runstats (cont.)

• Para rodar somente para o Tablespace e ignorar os índices

RUNSTATS TABLESPACE INVDB11. INVS0001

• Para rodar para Tablespace e Índices

RUNSTATS TABLESPACE INVDB11. INVS0001 INDEX

• Para obter estatística para uma coluna específica

RUNSTATS TABLESPACE INVDB11. INVS0001

TABLE( INVDB111. T_ INVOICE) COLUMN( R_ INVOICE)

SAMPLE 25

• Para somente um índice To run against only one index of TS

RUNSTATS INDEX INVDB111

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 262 -


Considerações sobre Runstats

•Rodar o Runstats após um LOAD ou REORG, para atualizar o

catálogo do DB2.

- SQL Dinâmico vai ser benificiado automaticamente

- SQL estático precisará de um rebind.

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 263 -


Utilitário '‘COPY''

CRIA UM BACKUP DE UM TABLESPACE OU DE UMA PARTIÇÃO.

USER TABELA A
TABLESPACE
USER TABELA B

UTILITÁRIO
UTILITÁRIO
CCOOPPYY

IMAGE COPY

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 264 -


COPY - Fases de Execução

REPORT Produz um relatório quando a opção CHANGELIMIT é utilizada

COPY Cópia do objeto

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 265 -


Opções do Copy

• FULL
YES
Cria um backup completo do tablespace/partition
COPY TABLESPACE DB01. TS01
NO
Cria um backup incremental do tablespace/partition
COPY TABLESPACE DB01. TS02
FULL NO
• CONCURRENT
Executa o DFSMS concurrent copy para tirar um full image copy.

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 266 -


Copy Incremental e Mergecopy

T E MP O

CÓPIA CÓPIA CÓPIA


DADOS

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 267 -


Recover

RECUPERA OS DADOS USANDO UMA CÓPIA E APLICANDO OS


REGISTROS DA LOG

TEMPO

ALTERAÇÕES
DADOS NOS DADOS DADO NÃO
ACESSÍVEL

DADO
RECUPERADO

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 268 -


RECOVER - Fases de Execução

RESTORE Localiza e faz um merge das cópias disponíveis e recupera o

tablespace para o nível do backup

L O G A P P L Y Aplica os registros da log no tablespace recuperado

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 269 -


RECOVER - Agilização do processo

TEMPO

CÓPIA CÓPIA CÓPIA


DADO NÃO
DADOS ACESSÍVEL

DADO
RECUPERADO

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 270 -


RECOVER - Para um ponto no tempo

TEMPO
PROCESSOS
PERDIDOS
ALTERAÇÕES
DADO DANIFICADO
DADOS NOS DADOS
LOGICAMENTE
PONTO DE
QUIESCE

DADO
RECUPERADO

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 271 -


RECOVER - Para um ponto no tempo

• TORBA

É usado para especificar um ponto na log para a recuperação F U L L

• TOCOPY

Especifica qual a cópia o DB2 deve usar para recuperar os dados.

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 272 -


DSNTIAUL – Programa SAMPLE para UNLOAD

FAZ O UNLOAD DE ALGUMAS OU TODAS AS LINHAS DE ATÉ 100 TABELAS


AO MESMO TEMPO. O FORMATO DO UNLOAD É COMPATÍVEL COM O LOAD
E ELE TAMBÉM GERA OS CARTÕES DE CONTROLE PARA O LOAD.

USER TABELA A
UMA OU MAIS TABELAS
USER TABELA B

DE ENTRADA

DSNTIAUL
DSNTIAUL

ARQUIVO U
SEQUENCIAL M
DE OUTPUT A

O
U

M
A
I
S

T
A
B
E
L
Anotações: A
S
D
E

S
A
Í
D
A

Domini Treinamento – DB2 para Desenvolvedores - 273 -


DSNTIAUL - DATA SETS e PARÂMETRO

Data Set Description

SYSIN Dataset de input.

SYSPRINT Dataset de output. DSNTIAUL escreve erros e mensagens


informativas neste dataset.

S Y S P U N C H Dataset de output. DSNTIAUL escreve os cartões de controle para o


LOAD neste dataset.

S Y S R E C n n Datset de output. O valor nn tem intervalo de 00 até 99. É possível ter


no máximo 100 datasets de output por execução do DSNTIAUL. Cada
dataset contém os dados que foram ‘unload’ pelo DSNTIAUL. O
número deste dataset deve ser igual ao número de statements de
SELECT ou de tabelas do dataset de input.

O ÚNICO PARÂMETRO ACEITO PELO DSNTIAUL É SQL

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 274 -


DSNTIAUL - Exemplos

//UNLOAD EXEC PGM=IKJEFT01,DYNAMNBR=20


//SYSTSPRT DD SYSOUT=*
//SYSTSIN DD *
DSN SYSTEM(DSN)
RUN PROGRAM(DSNTIAUL) PLAN(DSNTIB61) PARMS('SQL') -
LIB('DSN610.RUNLIB.LOAD')
//SYSPRINT DD SYSOUT=*
//SYSUDUMP DD SYSOUT=*
//SYSREC00 DD DSN=DSN8UNLD.SYSREC00,
// UNIT=SYSDA,SPACE=(32760,(1000,500)),DISP=(,CATLG),
// VOL=SER=SCR03
//SYSREC01 DD DSN=DSN8UNLD.SYSREC01,
// UNIT=SYSDA,SPACE=(32760,(1000,500)),DISP=(,CATLG),
// VOL=SER=SCR03
//SYSPUNCH DD DSN=DSN8UNLD.SYSPUNCH,
// UNIT=SYSDA,SPACE=(800,(15,15)),DISP=(,CATLG),
// VOL=SER=SCR03,RECFM=FB,LRECL=120,BLKSIZE=1200
//SYSIN DD *
SELECT * FROM DSN8610.PROJ;
SELECT * FROM DSN8610.EMP
WHERE WORKDEPT LIKE 'D%'
ORDER BY EMPNO;

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 275 -


DSNTIAUL - Exemplos

//UNLOAD EXEC PGM=IKJEFT01,DYNAMNBR=20


//SYSTSPRT DD SYSOUT=*
//SYSTSIN DD *
DSN SYSTEM(DSN)
RUN PROGRAM(DSNTIAUL) PLAN(DSNTIB61) -
LIB('DSN610.RUNLIB.LOAD')
//SYSPRINT DD SYSOUT=*
//SYSUDUMP DD SYSOUT=*
//SYSREC00 DD DSN=DSN8UNLD.SYSREC00,
// UNIT=SYSDA,SPACE=(32760,(1000,500)),DISP=(,CATLG),
// VOL=SER=SCR03
//SYSPUNCH DD DSN=DSN8UNLD.SYSPUNCH,
// UNIT=SYSDA,SPACE=(800,(15,15)),DISP=(,CATLG),
// VOL=SER=SCR03,RECFM=FB,LRECL=120,BLKSIZE=1200
//SYSIN DD *
DSN8610.PROJ WHERE DEPTNO='D01'

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 276 -


Stored Procedures Introdução

O QUE SÃO E PARA QUE SERVEM AS STORED PROCEDURES

Stored Procedures são programas contendo comandos sql de acesso ao banco de


dados, que rodam junto do servidor de bancos de dados (na mesma máquina e sistema
operacional), sob o controle do servidor RDBMS, em ambiente próprio e separado do
aplicativo que as invoca.

Stored Procedures são armazenadas em bibliotecas funcionais compartilhadas e


acessadas pelo RDBMS.

As sp são invocadas por um aplicativo que desempenha o papel de client. Esse


aplicativo pode estar rodando localmente no mesmo servidor que o RDBMS ou em
qualquer outra máquina com acesso ao servidor db2.

A invocação de sp é feita no db2 com um comando “call”. Note-se que com rdbms de
outros fabricantes o comando de invocação pode ser diferente de “call” ( e.g. O ms sql
usa “execute” ), assim como as regras de programação e ligação podem ser diferentes
também. Por esse motivo, conhecimentos prévios de outros sw, podem não se aplicar a
db2 stored procedures.

Porque razão iríamos querer usar stored procedures em vez de efetuar todos os acessos
sql no programa invocador?
Existem dois tipos de situação em que é mais recomendável o uso de sp:

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 277 -


DESEMPENHO ( PERFORMANCE ).

Quando os aplicativos rodam remotamente, pelo fato de a sp rodar no mesmo servidor,


o acesso local ao rdbms é mais eficiente que via rede. Além disso, como a sp é
controlada diretamente pelo rdbms, a comunicação entre estes é mais otimizada que
entre um aplicativo comum e o rdbms. Tipicamente, a execução de um conjunto de
comandos sql é mais rápida quando estes estão numa sp que quando são executados,
um por vez, num programa comum.

SEGURANÇA.

Em geral um ambiente de servidor é mais controlado e protegido de acessos indevidos.


máquinas desktop são mais vulneráveis.
Os programas existentes num servidor estão mais protegidos contra adulterações e seu
ambiente de processamento também é mais seguro.

Programas que implementam as partes mais confidenciais e importantes de um sistema,


muitas vezes não estariam seguros em desktops. Stored procedures são uma das
alternativas que dispomos para isolar as funções de acesso a banco de dados mais
sensíveis.

Outra razão que poderia indicar o uso de stored procedures é que pelo fato de estas
rodarem no servidor, podem usar comandos que não estão disponíveis para os clients,
como por exemplo “list database directory”. Além disso, stored procedures também
podem fazer acesso a recursos de software e storage diponiveis apenas no servidor.

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 278 -


CALL SINTAXE
CALL proc-name
( parametro, ... )
USING DESCRIPTOR descriptor-name

proc-name INDICA O NOME DA PROCEDURE

Pode ser especificado como constante ou como host variable.


Se for uma constante, então não poderá conter brancos ou caracteres especiais e será
convertido para maiúsculas.

USING DESCRIPTOR descriptor-name

Identifica a sqlda que descreve as host variables usadas como parâmetros, no caso da
procedure ser invocada dessa forma.

O programa que chama a stored procedure deverá inicializar a sqlda:

SQLN indica o numero de ocorrências de SQLVAR na SQLDA


SQLDABC a memória em BYTES alocada para a SQLDA
SQLD quantidade de variáveis usadas na SQLDA para processar um statement

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 279 -


Para cada ocorrencia de S QLVAR Base devem ser indicados os atributos das variaveis,
devendo ser inicializados os seguintes campos:

SQLTYPE
SQLLEN
SQLDATA
SQLIND

Devem ser inicializados os seguintes campos de cada Secondary SQLVAR element:

LEN.SQLLONGLEN
SQLDATALEN
SQLDATATYPE_NAME

Presume-se que cada sqlda seja usada para trocar dados em ambos os sentidos, entre o
programa e a procedure.

Se o programa não usar o parâmetro para transmitir dados para a procedure, o campo
“sqlind” deverá ser inicializado com o valor –1 pelo programa.

Se a procedure não usar o parâmetro para transmitir dados para o programa, o campo
“sqlind” deverá ser inicializado com o valor –128 pela procedure

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 280 -


CREATE PROCEDURE
É o comando sql que define uma stored procedure no db2

Stored procedures escritas em sql pl são definidas completamente pelo comando “create
procedure”, ou seja, os comandos fonte fazem parte do corpo do comando “create
procedure”

Quando escritas em linguagens diferentes de sql pl, as stored procedures são programas
criados à parte e catalogados no db2 pelo comando “create procedure”, onde se faz
referencia ao nome do executavel. Esses programas têm de ter sido objeto de prepare,
bind, compilação, edição de ligações (linkedited), e catalogação em biblioteca
reconhecida pelo db2.

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 281 -


EXEMPLOS

CREATE PROCEDURE nome_cliente


(IN codigo INT, OUT nome CHAR(10))
EXTERNAL NAME ‘nome.cli’
LANGUAGE JAVA PARAMETER STYLE JAVA

CREATE PROCEDURE descricao_produto


(IN cod_prod INT, OUT descricao CHAR(40))
EXTERNAL NAME ‘prod_descr’
DYNAMIC RESULT SETS 1 NOT FENCED
LANGUAGE C PARAMETER STYLE GENERAL

CREATE PROCEDURE descricao_produto


(IN codigo_produto INT, OUT descricao CHAR(40))
DYNAMIC RESULT SETS 1
LANGUAGE SQL
BEGIN
DECLARE EXIT HANDLER FOR NOT FOUND
SET descricao = ‘ ‘ ;
SELECT DESCRICAO_PRODUTO INTO descricao
FROM PRODUTOS
WHERE COD_PROD = codigo_produto;
END

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 282 -


PARÂMETROS
Schema.procname

O nome da procedure é usado para identifica-la no comando “call”

O sistema permite a existência de mais de uma procedure com o mesmo nome e


pertencente ao mesmo schema, mas com quantidade de parâmetros diferente. Por esse
motivo é preciso que o comando “call” passe o número de parâmetros definidos na
procedure, ou esta não será reconhecida.

Em operações como “drop” em que não se usam parâmetros, pode ser usado o nome
indicado pelo atributo specific.

( IN | OUT | INOUT parameter-name datatype, … )

Os parametros permitem que a stored procedure receba dados do programa que


executante e repasse dados para este.

In – indica que este é um parâmetro de input

Out – indica que este é um parâmetro de output

Inout – indica que este parâmetro é usado como input e output

Datatype – tipo de dados do parâmetro


os mesmos tipos de dados usados pelo “create table”

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 283 -


PROGRAMAÇÃO DE SP

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 284 -


REGRAS GERAIS
Não use comandos que finalizam o processo, como stop run ou exit em stored
procedures que rodam como subprogramas. Use return ou goback.

Não use set current sqlid

Não use attachment facility calls explícitos ( os/390 )

Em db2 established address spaces o db2 usa caf ( call attachment facility ) calls
implícitos

Em wlm o db2 usa rrsaf calls ( recoverable resource manager services ) implícitos

Não podem ser usados comandos de conexão e operativos:

BACKUP
CONNECT
CONNECT TO
CONNECT RESET
CREATE DATABASE
DROP DATABASE
FORWARD RECOVERY
RESTORE

O db2 não permite usar overload (procedures diferentes com a mesma identificação) em
procedures com o mesmo número de parâmetros, mesmo que sejam de tipos diferentes.

Com exceção de procedures em db2 cli e jdbc, tem de ser feito bind.

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 285 -


Quando um client chama uma sp remota, deve inicializar todos os parâmetros antes do
call, inclusive os de output, porque nesse caso o db2 não tem como distinguir os
parâmetros de output dos de input

As stored procedures devem declarar os parâmetros com tipos de dados compatíveis


com as convenções do sql, para que não ocorram problemas de resolução ou mesmo de
incompatibilidade entre as variáveis hospedeiras e as colunas das tabelas.

COMMIT E ROLLBACK

As stored procedures invocadas por um programa client executam na mesma transação (


luw - logical unit of work ) que o programa client.

Quando é executado um commit ou rollback dentro de uma stored procedure, é


terminada a luw afetando todas as alterações feitas tanto pela sp como pelo programa
client

Uma procedure que contém commit ou rollback, deve ser definida (create procedure)
como contains sql, reads sql data ou modifies sql data

Se a procedure tiver sido definida com commit on return yes, será executado um commit
ao final da procedure, independentemente de a procedure conter commits ou rollbacks

Os cursores do client também são afetados por commit ou rollback dentro da procedure.
Rollback fecha todos os cursores
Commit fecha todos os cursores com exceção daqueles declarados com with hold

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 286 -


Commit e rollback não podem ser usados em procedures nas seguintes situações:

- Aninhadas em triggers ou functions

- Quando o client usa uma luw em two phase commit

- O client usa type 2 connect para um server que contém a stored procedure

Não pode ser usado rollback numa sp, se o db2 não for o coordenador de transação.

Não é permitido usar commit em sps catalogadas com a cláusula no sql.

Anotações:

Domini Treinamento – DB2 para Desenvolvedores - 287 -

You might also like