apostila db2 para desenvolvedores
TRANSCRIPT
Domini Treinamento – DB2 para Desenvolvedores - 1 -
Í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 AMBIENTES........................................................................................................................................ 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 - 2 -
EXEMPLOS DE WHERE................................................................................................................................................................... 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 MAX MIN ...................................................................................................................................................................... 73 SUM AVG MAX 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 DATE/TIME......................................................................................................................................................................100 ARITMÉTICA DATE/TIME............................................................................................................................................................101 ARITMÉTICA DE DATE/TIME (CONT ).........................................................................................................................................102 EXEMPLOS DATE/TIME................................................................................................................................................................103
Domini Treinamento – DB2 para Desenvolvedores - 3 -
FUNÇÕES ESCALARES DATE/TIME ............................................................................................................................................104 FUNÇÕES ESCALARES DATE/TIME (CONT.)..............................................................................................................................105 FUNÇÕES ESCALARES DATE/TIME (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: ANY OU SOME .......................................................................................................................127 SUBQUERY C/VÁRIAS LINHAS: ANY 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 - 4 -
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 - PREP. DO PROGRAMA..........................................................................................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 - 5 -
ERROS DE ARITMÉTICA E CONVERSÃO - EXEMPLO................................................................................................................206 USO DA VARIÁVEL INDICADORA - RESUMO............................................................................................................................207 ESTRATÉGIA DE ACESSO .............................................................................................................................................................208 ESTRATÉGIA DE ACESSO (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 ARITMÉ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 - 6 -
EXERCÍCIO - LOAD......................................................................................................................................................................254 OPÇÃO LOG (YES/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 - AGILIZAÇÃ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 - 7 -
Introdução ao DB2
Parte 1
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 8 -
O que é um Banco de Dados Relacional?
COLUNA
Tabela DEPT
DCODIGO DNOME GERENTE DSUPERIOR
A00 SPIFFY COMP.SERVICE 000010
B01 PLANNING 000020 A00
000030 A00LINHA
...... ......
000030 A00
Um Banco de Dados Relacional é aquele que pode ser percebido externamente como uma coleção de tabelas.
D01 MARKETING
...... ......
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 9 -
DB2 é um DBMS Relacional
Sistema de Gerênciade Banco de Dados
· Integridade e Segurança de Dados· Recuperação / Reinicio Integrados· Definição Dinâmica· Operação Contínua
Modelo de Dados LinguagemRelacional Sql
Dados vistos como Tabelas Definição, Manipulação eControle dos Dados
Projeto mais fácil
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 10 -
Estrutura de Dados do DB2
- A Tabela Relacional
Tabela EMP
• Todos os dados e relacionamento entre dados são representados por valores de campo.
MATR SOBRENOME DEPARTAMENTO SALÁRIO
000010 CHRISTINE HAAS A00 52750000020 MICHAEL THOMPSON S01 41250000030 SALLY KWAN C01 38250000050 JOHN GEYER E01 40175000330 WING LEE E21 25370000340 JASON GOUNOT E21 23840
NOMEMATR SOBRENOME DEPARTAMENTO SALÁRIO
000010 CHRISTINE HAAS A00 52750000020 MICHAEL THOMPSON S01 41250000030 SALLY KWAN C01 38250000050 JOHN GEYER E01 40175000330 WING LEE E21 25370000340 JASON GOUNOT E21 23840
MATR SOBRENOME DEPARTAMENTO SALÁRIO
000010 CHRISTINE HAAS A00 52750000020 MICHAEL THOMPSON S01 41250000030 SALLY KWAN C01 38250000050 JOHN GEYER E01 40175000330 WING LEE E21 25370000340 JASON GOUNOT E21 23840
MATR SOBRENOME DEPARTAMENTO SALÁRIO
000010 CHRISTINE HAAS A00 52750000020 MICHAEL THOMPSON S01 41250000030 SALLY KWAN C01 38250000050 JOHN GEYER E01 40175000330 WING LEE E21 25370000340 JASON GOUNOT E21 23840
NOME
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 11 -
NOMENCLATURA
Toda tabela e toda coluna
precisam ser nomeadas
O primeiro caracter precisa ser:A-Z, $, @, #
Demais caracteres:A-Z, $, @, #, 0-9, _
O nome da tabela é único
através do owner/creator/
schema
Nome da coluna é unico na
tabela
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 12 -
NOMENCLATURA
Nome da Tabela Nome da Coluna
Nome da ColunaQualificado
Schema/Owner/Creator
Qualificado Nome da Tabela
Nome simples da Tabelada Tabela
(completo)
PROD EMPL
PROD.EMPL
EMPL LASTNAME
EMPL.LASTNAME
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 13 -
Integridade de Referência
EMP (DEPENDENTE) DEPT (PAI)
NOME DEPT DEPTCODCARLOS Z13 Q3AMARIA A05 Z13···
···
··
Um depto. só pode serexcluído se não tivernenhum dependente.
CHAVE CHAVEPRIMÁRIA
INT.R E F .
ESTRANGE IRA
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 14 -
Integridade de Referência (cont.)
• Chave Primaria(PK) – coluna(s) que garante(m) a unicidade das linhas. É a chave principal de uma tabela. Umatabela 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 - 15 -
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 - 16 -
Ambiente DB2
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 17 -
Coexistência entre os Ambientes
BSDS LOG DB CAT DIR
TSO BATCH
C I C S
IMS/TM BATCHUTILITY
D B 2
T S O
Q M F
S P U F I
BSDS LOG DB CAT DIR
TSO BATCH
C I C S
IMS/TM BATCHUTILITY
D B 2
T S O
Q M F
S P U F I
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 18 -
Objetos DB2
TS A
IDX1 IDX2 IDX4
NÃO DB2
TS B IDX3
TABLESPACE A
TABELA 1
TABELA 2
INDEX 1
INDEX 2
TABLESPACE B
TABELA 3
TABELA 4
INDEX 3
INDEX 4
DATABASE X
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 19 -
Objetos DB2 (cont.)
NÃO DB2
T SIX
NÃO DB2
V O L 1
VOL3
VOL2
VOL4
VOLX
VOLY
NÃO DB2
STORAGE GROUP1 STORAGE GROUP2
TS
T STSIX
TSIX
TS
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 20 -
Notas
• DATABASE (Banco de dados)
Conjunto de TABLESPACES e índices agrupados sob umcrité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 - 21 -
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 - 22 -
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 também para forçar a unicidade dos dados.
Tipos:
UNIQUE : força a unidade dos dadosNORMAL : permite a duplicidade de dadosC L U S T E R : usado para manter a seqüência física dos dados no Tablespace
• V IEW• É 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 - 23 -
Notas (cont.)
• STORAGE GROUP
• É um conjunto de volumes (discos) aonde os TABLESPACES 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 - 24 -
Estrutura do DB2
DATABASES
DIRETÓRIOCAT ÁLOGO
DB2DB2
LOGATIVA
LOG ARCHIVE BSDS IMAGE
C O P Y
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 25 -
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 - 26 -
Utilização da Linguagem SQL
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 27 -
Utilização da Linguagem SQL
DB2TSO Attach
DB2 I
IMS Attach CICS Attach
QMF PROGRAMA
USUÁRIOUSUÁRIO
PROGRAMAPROGRAMA
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 28 -
Utilização da Linguagem SQL (cont.)
PROGRAMA SQL ESTÁTICOPROGRAMA SQL DINAMICOINTERATIVO
DB2
DDL
DATADEFINITIONLANGUAGE
SQL
STRUCTUREDQUERYLANGUAGE
DML
DATAMANIPULATIONLANGUAGE
DCL
DATACONTROLLANGUAGE
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 29 -
Utilização da Linguagem SQL (cont.)
• DML (Data Manipulation Language) (Desenvolvimento)
• S E L E C T : pesquisa de dados (READ)• UPDATE : atualização de dados• DELETE : eliminação de dados• I N S E R T : 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
• DCL (Data Control Language) (Suporte/Desenvolvimento)
• GRANT : fornecer um privilégio• REVOKE : tirar um privilégio
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 30 -
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 IMP L E S
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 31 -
Linguagem SQL (cont.)
• Não é procedural .
Para cada dada pesquisa não precisamos informar os procedimentosnecessários como:
1. zere o contador2. abra o arquivo 3. leia um registro4. verifique se satisfaz o critério5. incremente o contador6. 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 - 32 -
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 - 33 -
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 - 34 -
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 - 35 -
Dados Numéricos
Definição para ColunasDefinição para Colunas
** 1 < = m < = 2121 < = n < = 53
TIPO DE DADO DESCRIÇÃO FAIXA
SMALLINT Inteiros -32.768 + 32.767
INTEGER Inteiros -2.147.483.648INT +2.147.483.647DECIMAL (X,Y) Decimais X=total de dígitos
Y=casas decimaisX <= 31
FLOAT (m) precisão simples 5.4e-79 to 7.2e+75REAL ponto flutuante
FLOAT dupla precisão 5.4e-79 to 7.2e+75FLOAT (n) ponto flutuante** DOUBLE PRECISION
Para DECIMAL, defina X com número impar
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 36 -
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 - 37 -
Dados Character String
Definição para ColunasDefinição para Colunas
** O tamanho máximo de uma coluna do tipo VARCHAR depende do tamanho da página do Tablespace.
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
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 38 -
Dados Date / Time
TIPO DE DADO FORMATO INTERNO
DATE aaaammdd
TIME hhmmss
TIMESTAMP aaaammddhhmmsssnnnnnn(nnnnnn =microsegundos )
Definição para ColunasDefinição para Colunas
(4 bytes)
(3 bytes)
(10 bytes)
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 39 -
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 É ZERONÃO É BRANCOÉ DESCONHECIDO
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 40 -
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• Timestamp
Valores Correntes
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 41 -
Create View
CREATE VIEW V_DEPT(VCODIGO,VNOME)AS SELECT CODIGO, DNOME FROM TAB_DEPTWHERE DCODIGO LIKE ‘A%’
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 42 -
DML - Data Manipulation Language
SELECT ACESSA DADOS
UPDATE ATUALIZA CAMPOS
DELETE REMOVE LINHAS
INSERT INSERE NOVAS LINHAS
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 43 -
Tabelas Usadas nos Exemplos
X. STAFFID NOME D E P T CARGO ANOS SALARIO COMIS
10 SANTANA 20 GER 7 18357.5020 ORSINI 20 VENDAS 8 18171.25 612.4530 DANTAS 38 GER 5 17506.75 -40 O’BRIEN 38 VENDAS 6 18006.00 846.5550 SOUZA 15 GER 10 20659.80 -60 SUZUKI 38 VENDAS - 16808.30 650.2570 AL MEIDA 15 VENDAS 7 16502.83 1152.0080 JAMES 20 ATEND - 13504.60 128.2090 KOONITZ 42 VENDAS 6 18001.75 1386.70
100 PLOTZ 42 GER 7 18352.80 -110 NGAN 15 ATEND 5 12508.20 206.60120 NAUGHTON 38 ATEND - 12954.75 180.00130 YAMAGUCHI 42 ATEND 6 10505.90 75,60140 FRAYE 51 GER 6 21150.00 -150 OLIVEIRA 51 VENDAS 6 194 56.50 637.65160 MOLINARI 10 GER 7 22959.20 -170 KERMISCH 15 ATEND 4 12258.50 110.10180 ABRAHAMS 38 ATEND 3 12009.75 236.50190 SNEIDER 20 ATEND 8 14252.75 126.50200 SCOUTTEN 42 ATEND - 11508.60 84.20210 L U 10 GER 10 20010.00 -220 SMITH 51 VENDAS 7 17654.50 992.80230 LUNDQUIST 51 ATEND 3 13369.80 189.65240 DANIELS 10 GER 5 19260.65 -250 WHEELER 51 ATEND 6 14460.00 513.30260 JONES 10 GER 12 21234.00 -270 L E A 66 GER 9 18555.50 -280 WILSON 66 VENDAS 9 18674.50 811.50290 PINHO 84 GER 10 19818.00 -300 DAVIS 84 VENDAS 5 15454.50 806.10310 GRAHAM 66 VENDAS 13 21000.00 200.30320 GONZALES 66 VENDAS 4 16858.20 844.00330 BURKE 66 ATEND 1 10988.00 55.50340 VIEIRA 84 VENDAS 7 17844.00 1285.00350 GAFNEY 84 ATEND 5 13030.50 188.00
ID NOME D E P T CARGO ANOS SALARIO COMIS
10 SANTANA 20 GER 7 18357.5020 ORSINI 20 VENDAS 8 18171.25 612.4530 DANTAS 38 GER 5 17506.75 -40 O’BRIEN 38 VENDAS 6 18006.00 846.5550 SOUZA 15 GER 10 20659.80 -60 SUZUKI 38 VENDAS - 16808.30 650.2570 AL MEIDA 15 VENDAS 7 16502.83 1152.0080 JAMES 20 ATEND - 13504.60 128.2090 KOONITZ 42 VENDAS 6 18001.75 1386.70
100 PLOTZ 42 GER 7 18352.80 -110 NGAN 15 ATEND 5 12508.20 206.60120 NAUGHTON 38 ATEND - 12954.75 180.00130 YAMAGUCHI 42 ATEND 6 10505.90 75,60140 FRAYE 51 GER 6 21150.00 -150 OLIVEIRA 51 VENDAS 6 194 56.50 637.65160 MOLINARI 10 GER 7 22959.20 -170 KERMISCH 15 ATEND 4 12258.50 110.10180 ABRAHAMS 38 ATEND 3 12009.75 236.50190 SNEIDER 20 ATEND 8 14252.75 126.50200 SCOUTTEN 42 ATEND - 11508.60 84.20210 L U 10 GER 10 20010.00 -220 SMITH 51 VENDAS 7 17654.50 992.80230 LUNDQUIST 51 ATEND 3 13369.80 189.65240 DANIELS 10 GER 5 19260.65 -250 WHEELER 51 ATEND 6 14460.00 513.30260 JONES 10 GER 12 21234.00 -270 L E A 66 GER 9 18555.50 -280 WILSON 66 VENDAS 9 18674.50 811.50290 PINHO 84 GER 10 19818.00 -300 DAVIS 84 VENDAS 5 15454.50 806.10310 GRAHAM 66 VENDAS 13 21000.00 200.30320 GONZALES 66 VENDAS 4 16858.20 844.00330 BURKE 66 ATEND 1 10988.00 55.50340 VIEIRA 84 VENDAS 7 17844.00 1285.00350 GAFNEY 84 ATEND 5 13030.50 188.00
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 44 -
Tabelas Usadas nos Exemplos (cont.)
X. ORG
DEPTCOD DEPTNOME GERENTE DIVISÃO LOCAL
10 MATRIZ 160 C E N T R O SÃO PAULO15 CAMPINAS 50 SUDESTE CAMPINAS20 RIO 10 SUDESTE R. JANEIRO38 MINAS 30 SUDESTE B. HORIZONTE42 BAHIA 100 NORDESTE SALVADOR51 R E C I F E 140 NORDESTE R E C I F E66 RIO GRANDE 270 SUL PORTO ALEGRE84 PARANÁ 290 SUL CURIT IBA
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 45 -
Query
SEQUÊNCIA OBRIGATÓRIA:
SELECT NOME, ANOS, SALÁRIO - Diz quais as colunas desejadas
FROM X. STAFF - Diz de quais tabelas
WHERE DEPT = 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 uma solicitação:
SELECT ∗ FROM X.STAFF
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 46 -
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 - 47 -
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, DEPTCODFROM X.ORG
Resultado: DEPTNOME DEPTCODMATRIZ 10CAMPINAS 15RIO 20MINAS 38. .
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 48 -
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 LOCAL10 MATRIZ 160 CENTRO SÃO PAULO15 CAMPINAS 50 SUDESTE CAMPINAS20 RIO 10 SUDESTE R. JANEIRO38 MINAS 30 SUDESTE B.HORIZONTE
OBS.: EVITAR O USO DO SELECT *
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 49 -
Controle de Linhas
• WHERE
• traz certas linhas• estabelece condições
Exemplo: Listar empregados do departamento 20
SELECT DEPT, NOME,CARGO, COMISFROM X.STAFFWHERE DEPT = 20
Resultado:
DEPT NOME CARGO COMIS
20 SANTANA G E R -20 ORSINI VENDAS 612.4520 JAMES ATEND 128.2020 SNEIDER ATEND 126.50
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 50 -
Operadores de Comparação
= Igual< > or ¬= Diferente
> Maior> = Maior ou Igual< Menor< = Menor ou Igual¬> Não maior¬< Não menor
SELECT MATR, COMISFROM X.STAFF
WHERE COMIS = 1000
SELECT NOME, DEPT, ANOSFROM X.STAFF
WHERE CARGO < > ‘GER’
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 51 -
Exemplos de Where
• Selecionar linhas através de dado numérico
SELECT DEPT, NOME,CARGOFROM X.STAFF
WHERE DEPT = 20
• Selecionar linhas através de dado alfanumérico
SELECT NOME, CARGO, COMISFROM X.STAFF
WHERE NOME = ‘SANTANA’
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 52 -
Seleção de Nulos
• Valor nulo como critério de SELECT
SELECT NOME, CARGO, COMISFROM 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 - 53 -
Seleção de Nulos (cont.)
• Valor não é nulo como critério de SELECT
SELECT NOME, CARGO, COMISFROM X.STAFF
WHERE COMIS IS NOT NULL
Resultado:
NOME CARGO COMIS
ORSINI VENDAS 612.45O’BRIEN VENDAS 846.55SUZUKI VENDAS 650.25ALMEIDA VENDAS 1152.00JAMES ATEND 128.20
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 54 -
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.30ALMEIDA VENDAS 16502.83
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 55 -
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.25O’BRIEN VENDAS 18006.00SUZUKI VENDAS 16808.30ALMEIDA VENDAS 16502.83JAMES ATEND 13504.60
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 56 -
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.70JONES GER 12 -GRAHAM VENDAS 13 1200.30VIEIRA VENDAS 7 1285.00
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 57 -
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.70GRAHAM VENDAS 13 200.30VIE IRA VENDAS 7 1285.00
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 58 -
IN
• Valor deve coincidir com algum elemento da lista
WHERE DEPT IN (38, 20, 42)
equivale a:
Múltiplos ORs para a mesma coluna:
WHERE DEPT = 38 OR DEPT = 20 OR DEPT = 42
NEGAÇÃO: NOT IN
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 59 -
Between
• Para selecionar um intervalo fechado de valores
SELECT NOME, CARGO, ANOSFROM X.STAFFWHERE ANOS BETWEEN 9 AND 11 Extremidades inclusive
equivale a:
SELECT NOME, CARGO, ANOSFROM X.STAFFWHERE ANOS >= 9
AND ANOS <= 11
Resultado: NOME CARGO ANOSSOUZA G E R 10L U G E R 10LEA G E R 9WILSON VENDAS 9PINHO G E R 10
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 60 -
Pesquisas Parciais
Para pesquisar um subconjunto de caracteres: L I KE% = Conjunto de caracteres quaisquer_ = Um caracter qualquer
Exemplos:
1. WHERE NOME LIKE ‘G%’ inclui: GRAHAMGONZALESGAFNEY
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 - 61 -
Negação
• Para negar o teste:
WHERE NOME NOT LIKE ‘G%’
exclui: GRAHAMGONZALESGAFNEY
WHERE ANOS NOT BETWEEN 9 AND 11
exclui ANOS de 9 a 11
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 62 -
Order By
• Para classificar numa sequência especificada:
Lista classificada do pessoal do depto. 84
SELECT NOME, CARGO, ANOSFROM X.STAFFWHERE DEPT = 84ORDER BY NOME
Resultado:NOME CARGO ANOS
DAVIS VENDAS 5GAFNEY VENDAS 7PINHO ATEND 5VIE IRA G E R 10
OBS.:
Primeiro seleciona e depois classifica.
Para pequenos volumes pode ser usado sem problemas.
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 63 -
Order By (cont.)
•Para classificar pelas coluna (s) em ordem ASC endente (default) ou DESC endente
SELECT NOME, CARGO, ANOSFROM X.STAFFWHERE DEPT = 84ORDER BY CARGO, ANOS DESC
Resultado:NOME CARGO ANOSGAFNEY ATEND 5PINHO G E R 10VIE IRA VENDAS 7DAVIS VENDAS 5
ORDER BY ANOS DESC, CARGO
Resultado:NOME CARGO ANOSPINHO GER 10VIE IRA VENDAS 7GAFNEY ATEND 5DAVIS VENDAS 5
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 64 -
Order By (cont.)
• Colunas classif icadas 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 S E L E C T .
• Usar sempre que desejar as linhas segundo uma ordem específica.
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 65 -
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 DEPTFROM X.STAFF 20
203838381510
.
.Para eliminar linhas duplicadas:
SELECT DISTINCT DEPT DEPTFROM X.STAFF 10
152038.
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 66 -
Select Distinct (cont.)
MÚLTIPLAS -COLUNAS
SELECT DISTINCT DEPT, CARGO DEPT CARGO
10 GER15 ATEND15 GER15 VENDAS20 ATEND20 GER20 VENDAS38 ATEND
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 67 -
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.STAFFWHERE DEPT = 20
Resultado:ID SALÁRIO COMIS COL1
10 18357.50 - - (1)20 18171.25 612.45 18783.7080 13504.60 128.20 13632.80190 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 - 68 -
Nomeando a coluna resultado
SELECT ID, SALÁRIO, COMIS, SALÁRIO + COMIS AS RENDIMENTOSFROM X.STAFFWHERE DEPT = 20ORDER BY RENDIMENTOS
Resultado:ID SALÁRIO COMIS RENDIMENTOS
80 13504.60 128.20 13632.80190 14252.75 126.50 14379.2520 18171.25 612.45 18783.70 10 18357.50 - -
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 69 -
Condições com Valor Calculado
Pessoa cujo salário mais comissão excede $20.000
SELECT NOME, SALÁRIO + COMISFROM X.STAFFWHERE SALARIO + COM > 20000
Resultado:
NOME COL1
OLIVEIRA 20094.15GRAHAM 21200.30
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 70 -
‘Order By’ Por Valor Calculado
EXEMPLO 1:
SELECT NOME, SALÁRIO + COMISFROM X.STAFFWHERE SALARIO + COMIS > 20000ORDER BY 2 DESC
Resultado:
NOME COL1
GRAHAM 21200.30OLIVEIRA 20094.15
EXEMPLO 2:
SELECT CARGO, SALÁRIO + COMISFROM X. STAFFORDER BY CARGO, 2
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 71 -
Operador de Concatenação
string1 | | string2 string1string2
‘ABC’ | | ‘XYZ ‘ABCXYZ’
TABELA X (COLUNAS varchar : snome nome)SNOME NOME MIDJONES JOHN PMARQUES FRANCO X
···
···
··
SELECT SNOME || ‘, ‘ || NOME || ‘ ‘ || MID || ‘.‘FROM TABELA X
Resultado :JONES, JONES P .MARQUES, FRANCO X.
··
··
··
·
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 72 -
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 - 73 -
Sum Avg Max Min
EXEMPLO
SELECT SUM(SALÁRIO), MIN(COMIS), MAX(COMIS)FROM X.STAFFWHERE 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 - 74 -
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 - 75 -
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.STAFFWHERE SALARIO>18000
Resultado: C O L 1 COL2 COL3
8 16 19604.190625000
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 76 -
Cuidado com Nulos
SUM(SALARY)+SUM(BONUS)+SUM(COMM)VERSUS
SUM(SALARY+BONUS+COMM)
EMPNO SALARY BONUS COMM SALARY+BONUS+COMM000010 1000 500 100 1600000020 2000 NULL 300 NULL000030 2500 400 NULL NULL000040 1500 100 400 2000------ ------ ----- ---- -----------------Sum: 7000 1000 800 --> 8800 3600
====== ===== ==== ====
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 77 -
Cuidado com Nulos
2-4
53-
A B
SUM (A) = ...SUM (B) = ...
SUM (A) = ...COUNT(*)
SUM (A + B ) = ...
AVG (A) = ...
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 78 -
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 - 79 -
Literais
SELECT AVG(COMIS), SUM(COMIS)FROM X.STAFF
C O L 1 COL2
513.31 12319.45
SELECT ‘MED:’ , AVG(COMIS),‘SOMA: ‘, SUM(COMIS)
FROM X.STAFF
C O L 1 C O L 2 C O L 3 C O L 4
MED: 513.31 SOMA: 12319.45
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 80 -
Group By
SELECT SUM(SALÁRIO),SUM(COMIS)
FROM X.STAFFWHERE CARGO <> ‘GER’GROUP BY DEPT
C O L 1 C O L 2
41269.53 1468.7045928.60 867.1559778.80 1913.30
. .
. .
. .
SELECT SUM(SALÁRIO),SUM(COMIS)
FROM X.STAFFWHERE CARGO <> ‘GER’
C O L 1 C O L 2
146976.93 4249.15
Agrupa um conjunto de linhas.Com GROUP BY, a função de coluna calcula um valor para cada agrupamento.
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 81 -
Group By (cont)
SELECT DEPT, SUM(SALÁRIO), SUM(COMIS)FROM X.STAFFWHERE CARGO <> ‘GER’GROUP BY DEPT
Resultado:
DEPT C O L 1 C O L 2
15 41269.53 1468.7020 45928.60 867.1538 59778.80 1913.30. . .. . .. . .
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 82 -
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 - 83 -
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.STAFFWHERE CARGO <> ‘GER’GROUP BY DEPTORDER BY 3
Resultado:
DEPT COL1 C O L 2
20 45928.60 867.15. . .. . .15 41269.53 1468.70. . .. . .38 59778.80 1913.30
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 84 -
Group By ... Having
CONDIÇÕES SOBRE GRUPOS
SELECT . . . FROM..
WHERE.....
F I LTROS
GROUP BY...
HAVING....
WHERE - escolhe linhasHAVING - escolhe grupos
É executado sempre após GROUP BY
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 85 -
Exemplo de Having
SELECT DEPT, SUM(SALÁRIO)FROM X.STAFFGROUP BY DEPT
DEPT C O L 1
10 83643.4515 61929.3320 64286.1038 77285.5542 58369.05. .. .. .
SELECT DEPT, SUM(SALÁRIO)FROM X.STAFFGROUP BY DEPTHAVING SUM(SALÁRIO) > 65000
DEPT C O L 1
10 83643.4538 77285.55. .. .. .
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 86 -
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 - 87 -
Execução conceitual do Select
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 88 -
Execução conceitual do Select (cont.)
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 89 -
Exemplos de Having (cont.)
Os exemplos mostram que o SELECT e o HAVING podem usar funções diferentes.
Média salarial por departamentoapenas dos não-gerentes dos departamentoscom mais de 3 pessoas.
SELECT DEPT, AVG(SALÁRIO) FROM STAFFWHERE CARGO <> ‘GER’GROUP BY DEPTHAVING COUNT(*) > 3
Média salarial dos não-gerentes por departamento, que tenhamsomente pessoas com no mínimo 5 anos de experiência.Listar em ordem descendente por média.
SELECT DEPT, AVG(SALÁRIO)FROM STAFFWHERE CARGO <> ‘GER’GROUP BY DEPTHAVING MIN(ANOS) >= 5ORDER BY 2 DESC
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 90 -
Sumário Funções de Coluna
• Funções de Coluna só podem ser especificadas em:
SELECT
HAVING
• SELECT pode especif icar 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 - 91 -
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 - 92 -
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 - 93 -
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.
• Se o início + comprimento ultrapassar o final do string teremos erro.
• Substring de nulo é nulo
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 94 -
Substr (string, início, comprimento) (cont.)
SELECT DEPTNOME, SUBSTR(DEPTNOME, 1, 4)FROM X.ORG
Resultado:DEPTNOME C O L 1
MATRIZ MATRCAMPINAS CAMPRIO RIOMINAS MINABAHIA BAHI
SELECT DEPTCOD, DIVISAOFROM X.ORGWHERE SUBSTR(DIVISAO, 3) =‘EAS’
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 95 -
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 - 96 -
Length (argumento) (cont.)
SELECT NOME, LENGTH(NOME), CARGO, LENGTH(CARGO)FROM X.STAFF
Obs: NOME tem tamanho variávelCARGO tem tamanho fixo
Resultado:
NOME C O L 1 CARGO C O L 2
SANTANA 7 G E R 6SILVAl 6 VENDAS 6DANTAS 6 G E R 6
. . . .
. . . .
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 97 -
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 - 98 -
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 C O L 1
10 - - 0.0020 612.45 534.25 612.4530 - 345.89 345.8940 846.55 - 846.55
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 99 -
Funções de Conversão
•Converte um tipo de representação em outro.
DECIMAL, FLOAT, INTEGER : converte número em númeroDIGITS : converte número em alfaH E X : converte alfa / número em hexa
SELECT DECIMAL(SALARIO, 9, 1),INTEGER(SALARIO)FROM.STAFFWHERE ID = 55
se coluna SALARIO é (DEC (7,2)) : 17506.75
Resultado:C O L 1 C O L 2
17506.7 17506
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 100 -
Dados Date/Time
DATE, TIME, TIMESTAMP armazenados como decimal compactado sem sinal.
TIPO DE DADO FORMATO INTERNODATE aaaammddTIME hhmmssTIMESTAMP aaaammddhhmmssnnnnnn
Programas lidam só com FORMATO EXTERNO: string de caracteres
PADRÃO FormatoTIME
TAMANHO FormatoDATE
TAMANHO
ISO hh.mm.ss 8 bytes aaaa-mm-dd 10 bytesUSA hh: mm AM
hh: mm PM8 bytes mm/dd/aaaa 10 bytes
EUR hh.mm.ss 8 bytes dd.mm.aaaa 10 bytesJ IS 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 - 101 -
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 - 102 -
Aritmética de Date/Time (cont)
• Somando/Subtraindo duração
data + ou - duração (data) - - Resulta em dataDATACOL1 + 3 MONTHS
horário +or - duração (tempo) - - Resulta em horárioTEMPCOL1 - 30 MINUTES - 20 SECONDS
timestamp +or - duração (data) - - Resulta em TIMESTAMPtimestamp +or - duração (tempo) TSTCOL + 2 DAYS - 3 HOURSTMSRCOL + 50000 MICROSECONDS
• Subtraindo datas e horas
data - data - - Resulta em duraçãoDATACOL1 - DATACOL2DATACOL1 - ‘1984-12-20’
Horário - Horário - - Resulta em duraçãoTEMPCOL1 - TEMPCOL2‘11:30 PM’- TEMPCOL1
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 103 -
Exemplos Date/Time
SELECT PRJCOD, DATAINI + 1 YEAR, DATAFIM - 2 MONTHS ....
Resultado : PR JCOD C O L 1 C O L 2
AX001 31.01.1991 31.01.2005AX002 28.02.1989 30.06.1988AX003 01.02.1988 01.12.1986
SELECT PRJCOD, DATAFIM - DATAINI, HRFIM - HRINI ....
Resultado: PR JCOD C O L 1 C O L 2
AX001 00150200 153000AX002 00000602 000000AX003 00000000 074159
TABLE DTPRJDOC DATAINI DATAFIM HRINI HRFIM
AX001 19900131 20050331 000000 153000AX002 19880228 19880831 000000 000000AX003 19870201 19870201 160000 234159
TABLE DTPRJDOC DATAINI DATAFIM HRINI HRFIM
AX001 19900131 20050331 000000 153000AX002 19880228 19880831 000000 000000AX003 19870201 19870201 160000 234159
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 104 -
Funções Escalares Date/Time
• CHAR: controla formato externo de dados date/time
SELECT CHAR(HRFIM, ISO), CHAR(HRFIM, USA)FROM DTWHERE PRJCOD = ‘AX001’
Resultado :
COL1 C O L 2
15.30.00 03.30 PM
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 105 -
Funções Escalares Date/Time (cont.)
• DAY, MONTH, YEAR, HOUR, MINUTE, SECOND, MICROSECOND
- EXTRAI parte de uma data, horário ou timestamp- Resulta num inteiro binário
SELECT DAY(DATAINI), MONTH(DATAINI), YEAR (DATAINI)FROM DTWHERE YEAR(DATAINI) > 1988
Resultado:
C O L 1 C O L 2 COL3
31 1 1990
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 106 -
Funções Escalares Date/Time (cont.)
• DAYS
Número de dias desde 01/01/0001
SELECT DATAFIM - DATAINI,DAYS(DATAFIM) - DAYS(DATAINI)FROM DTWHERE PRJCOD = ‘AX001’
Resultado:
COL1 C O L 2
00150200 5538(nº.dias)
• DATE, TIMEExtrai data ou horário de um timestamp
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 107 -
Valores Correntes
•CURRENT DATE
Data de hoje
•CURRENT TIME
Horário corrente
•CURRENT TIMESTAMP
Data e horário corrente convertido para timestamp
SELECT * FROM DTWHERE DATAINI < CURRENT DATE - 90 DAYS
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 108 -
Join de Tabelas
DEPTCOD DEPTONOME GERENTE10 MATRIZ 16015 CAMPINAS 5020 RIO 1038 MINAS 3042 BAHIA 100
ID NOME DEPT10 SANTANA 2020 ORSINI 2030 DANTAS 3840 O’BRIEN 3850 SOUZA 1570 ALMEIDA 1580 JAMES 2090 KOONITZ 42. . .. . .
DEPTCOD DEPTONOME GERENTE10 MATRIZ 16015 CAMPINAS 5020 RIO 1038 MINAS 3042 BAHIA 100
ID NOME DEPT10 SANTANA 2020 ORSINI 2030 DANTAS 3840 O’BRIEN 3850 SOUZA 1570 ALMEIDA 1580 JAMES 2090 KOONITZ 42. . .. . .
ID NOME DEPT10 SANTANA 2020 ORSINI 2030 DANTAS 3840 O’BRIEN 3850 SOUZA 1570 ALMEIDA 1580 JAMES 2090 KOONITZ 42. . .. . .
• Tabelas são relacionadas via dados comuns (domínios)• Jo in é 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 - 109 -
Join de Tabelas - Inner Join
Listar o nome dos departamentos e seus respectivos gerentes
SELECT DEPTNOME, NOMEFROM X.STAFF, X.ORGWHERE GERENTE = ID
DEPTNOME GERENTE DIVISÃORIO 10 .MINAS 30 WESTERNBAHIA 100 .
. . .
ID NOME30 DANTAS10 SANTANA100 PLOTZ
. .
X .STAFF
X.ORG
Resultado:
DEPTNOME NOME
RIO SANTANA
MINAS DANTAS
BAHIA PLOTZ
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 110 -
Join de Tabelas - Inner Join (cont.)
Listar o nome dos departamentos da divisão Western e seus gerentes
SELECT DEPTNOME, NOMEFROM X.STAFF, X.ORGWHERE DIVISÃO = ‘WESTERN’
AND GERENTE = ID
Resultado: DEPTNOME NOMEMINAS DANTAS
Outra maneira de escrever o Inner Join
SELECT DEPTNOME, NOMEFROM X.STAFF INNER JOIN X.ORG
ON GERENTE = IDWHERE DIVISÃO = ‘WESTERN’
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 111 -
Outer Join
DEPTNOME GERENTE DIVISÃOSÃO PAULO . .MINAS 30 WESTERNBAHIA 100 C P CRIO 10 WESTERN
ID NOME10 SANTANA20 ORSINI30 DANTAS40 O’BRIEN100 PLOTZ
SELECT DEPTNOME, NOMEFROM X.STAFF LEFT OUTER JOIN X.ORG
ON GERENTE = ID
Resultado:
DEPTNOME NOME
RIO SANTANA- ORSINIMINAS DANTAS- O’BRIENBAHIA PLOTZ
•OPÇÕES: LEFT JOIN, RIGHT JOIN e FULL JOIN
X. STAFF
X. ORG
Listar todos empregados, e para os gerentes, o depto que eles gerenciamListar todos empregados, e para os gerentes, o depto que eles gerenciam
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 112 -
Join com Mais de Duas Tabelas
SELECT ID, NOME, DEPT, DEPTNOME, CODPEDIDOFROM X.STAFF, X.ORG, X.VENDASWHERE DEPT = DEPTCOD AND ID = COD_RVENDA
Resultado:
ID NOME DEPT DEPTNOME CODPEDIDO
20 ORSINI 20 RIO 345620 ORSINI 20 RIO 666720 ORSINI 20 RIO 358020 ORSINI 20 RIO 701040 O’BRIEN 38 MINAS 4567
Listar os empregados, o nome do departamento aonde trabalham e seus respectivos pedidos de vendas.
Listar os empregados, o nome do departamento aonde trabalham e s eus respectivos pedidos de vendas.
REGRA: o número de predicados join é igual ao número de tabelas menos 1
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 113 -
Qualificadores
X.STAFF
X.ORG
SELECT NOME,DEPTNOME,CODIGOFROM X.STAFF, X.ORGWHERE CARGO = ‘GER’AND DEPT = CODIGO
CODIGO NOME DEPT CARGO20 SANTANA 20 GER20 ORSINI 20 VENDAS. . . .. . . .
CODIGO DEPTNOME GERENTE10 MATRIZ 160
10 RIO 10. . .. . .
Listar o nome dos gerentes, e respectivos nome e código de departamentos
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 114 -
Qualificadores (cont.)
SOLUÇÃO
• Qualificar com nome de tabela
SELECT NOME, X.ORG.CODIGO, DEPTNOMEFROM X.STAFF, X.ORGWHERE CARGO = ‘GER’
AND DEPT = X.ORG.CÓDIGO
• Qualificador correlacionado
SELECT NOME, O.CODIGO, DEPTNOMEFROM X.STAFF, X.ORG OWHERE CARGO = ‘GER’
AND DEPT = O.CODIGO
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 115 -
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 ... DEPT80 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 ... DEPT10 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 - 116 -
Join de uma Tabela com ela mesma (cont.)
SOLUÇÃO:
SELECT E.NOME, E.SALARIO, G.NOME, G.SALARIOFROM STAFF E, ORG D, STAFF GWHERE E.DEPT = D.DEPTCOD AND D.GERENTE = G.IDAND 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 - 117 -
União
UNION faz a união de tabelas resultados
SELECT A1, A4 FROM TBLAWHERE A2 = ‘Z’ Resultado
UNION . .. .
SELECT B1, B4 FROM TBLAWHERE B1 > = ‘N’
Resultado
. .
. .
. .
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 118 -
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 - 119 -
União - Exemplo
A faixa de salários dos atendentes atingiria a faixa de vendasse fosse dado um aumento de 17% e 2% respectivamente?
SELECT CARGO, SALÁRIO * 1.17FROM X.STAFFWHERE CARGO = ‘ATEND’
UNION
SELECT CARGO, SALÁRIO * 1.02FROM X.STAFFWHERE CARGO = ‘VENDAS’ORDER BY 2 DESC
Resultado:
CARGO C O L 1
VENDAS 21420.0000. .VENDAS 17144.4660ATEND 16918.2000VENDAS 16832.8866. .
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 120 -
Union All Vs. Union
UNION ALL UNION
- Não faz classificação - Classifica- Não elimina duplicados - Elimina duplicados
SELECT NOMEFROM X.CANDIDATOSWHERE ENDEREÇO LIKE ‘%SP’
UNION ALL UNION
SELECT SOBRENOMEFROM X.ENTREVISTADOSWHERE SIT = ‘REP’
NOME NOME ==>do primeiro SELECT
JACOBS ARANTESMARQUES JACOBSARANTES MARQUESSILVA SILVAMARQUESJACOBS
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 121 -
Subquery
• É UM SELECT EMBUTIDO DENTRO DE UM S E L E C T
• RESULTADO DE UMA SUBQUERY É USADO PELO SELECT “EXTERNO”
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 122 -
Exemplo de Subquery
• 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.STAFFWHERE SALARIO > (SELECT AVG(SALARIO) FROM X.STAFF)
Resultado:NOME SALARIOSANTANA 18357.50ORSINI 18171.25
Listar os funcionários com salário superior à média da companhia
RESULTADO DA SUBQUERYRETORNADO PARA O NIVELSUPER IOR
RESULTADO DA SUBQUERYRETORNADO PARA O NIVELSUPERIOR
RESULTADO SOMENTEDO SELECT DE NÍVELMAIS ALTO
RESULTADO SOMENTEDO SELECT DE N ÍVELMAIS ALTO
X. STAFFNOME SALARIO
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 123 -
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 - 124 -
Subquery com uma Linha
Mostrar o funcionário com o maior salário da empresa
SELECT NOME, SALARIO FROM X.STAFFWHERE SALARIO =
(SELECT MAX(SALARIO) FROM X.STAFF)
Resultado :
NOME SALARIO
MOLINARI 22959.20
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 125 -
Subquery C/Várias Linhas: ALL
Lista classificada dos funcionários com salário superiora 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.86250000015482.33250000016000.000000000
20865.86250000015482.33250000016000.000000000
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 126 -
Subquery C/Várias Linhas: ALL (cont.)
SELECT NOME, SALÁRIO FROM X.STAFFWHERE SALÁRIO >
ALL (SELECT AVG(SALÁRIO)FROM X.STAFF GROUP BY DEPT)
ORDER BY NOME
Resultado :
NOME SALARIO
FRAYE 21150.00GRHAM 21000.00JONES 21234.00MOLINARE 22959.20
• Compare o salário de cada funcionário com a lista devolvida pela SUBQUERY
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 127 -
Subquery C/Várias Linhas: Any ou Some
20865.86250000015482.332500000
20865.86250000015482.332500000
Lista classificada dos funcionários com salário maior que a média salarial de algum departamento
Lista classificada dos funcionários com salário maior que a média salarial de algum departamento
• Encontrar média salarial para cada departamento .
SELECT AVG (SALÁRIO) FROM X.STAFFGROUP BY DEPT
Resultado:
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 128 -
Subquery C/Várias Linhas: Any ou Some (cont.)
SELECT NOME, SALÁRIO FROM X.STAFFWHERE SALÁRIO > ANY (SELECT AVG (SALÁRIO)
FROM X.STAFFGROUP BY DEPT)
ORDER BY NOME
Resultado:
NOME SALÁRIODANIEL 19260.25DAVIS 15484.50EDWARDS 17844.00. .. .
• Compare o salário de cada funcionário com a lista devolvida pela SUBQUERY
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 129 -
IN
Lista de gerentes da divisão Sul
SELECT DEPT, NOME FROM X.STAFFWHERE CARGO = ‘GER’
AND DEPT IN (SELECT DEPTCODFROM X.ORGWHERE DIVISÃO = ‘SUL’)
• SUBQUERY resulta numa lista de DEPTCODs 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 - 130 -
IN (cont.)
SELECT DEPT, NOME FROM X.STAFFWHERE CARGO = ‘GER’
AND DEPT = ANY (SELECT DEPTCODFROM X.ORGWHERE DIVISÃO = ‘SUL’)
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 131 -
Subquery Num Having
Liste os departamentos cuja média salarial é inferior à media dacompanhia, com as suas respectivas médias. O salário dos gerente s não deve ser considerado. Ordene pela média.
Liste os departamentos cuja média salarial é inferior à media dacompanhia, com as suas respectivas médias. O salário dos gerentes não deve ser considerado. Ordene pela média.
SELECT DEPT, AVG(SALÁRIO) FROM X.STAFFWHERE CARGO <> ‘GER’GROUP BY DEPTHAVING AVG(SALÁRIO) < (SELECT AVG(SALÁRIO)
FROM X.STAFFWHERE CARGO <>‘GER’)
ORDER BY 2 DESC
Resultado: DEPT COL1
66 16880.17500000051 16235.20000000084 15443.00000000020 15309.530000000
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 132 -
Subquery Correlacionado
Listar os empregados com salário superior à média de seus respectivos departamentos.
Listar os empregados com salário superior à média de seus respectivos departamentos.
SELECT NOME, SALÁRIOFROM X.STAFF CVWHERE SALÁRIO > (SELECT AVG(SALÁRIO)
FROM X.STAFFWHERE DEPT = CV.DEPT)
• Um subselect correlacionado é executado a cada linha devolvida aoselect externo.
• Deve ser evitado.
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 133 -
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 - 134 -
Subquery com EXISTS
Liste os gerentes ganhando menos que $18.000 se existir pelos menos um gerente com salário superior a $22.000.
Liste os gerentes ganhando menos que $18.000 se existir pelos menos um gerente com salário superior a $22.000.
SELECT ID,NOME, SALÁRIO, DEPTFROM X.STAFFWHERE CARGO = ‘GER’
AND SALARIO < 18000AND EXISTS (SELECT * FROM X.STAFF
WHERE CARGO = ‘GER’AND SALÁRIO > 22000)
ID NOME SALÁRIO DEPT
30 MARENCHI 17506.75 38
• VERDADEIRO/FALSO NO SELECT INTERNO
Determina se o SELECT externo será executado.
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 135 -
Manutenção
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 136 -
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 19880201OP2012 SUP. APLICAÇÃO E21 000330 001.00 19880101 19880201OP2013 SUP. DB \DC E21 000340 001.00 19880101 19880201............. ................. .... ............ ........... ............. ...............MA2114 B01 ? 19880920 ?
PCOD PNOME DEPT R E S P EQUIPE DATAINI DATAFIM.......... .......... ............. .......................... ................. ....
OP2011 SUP. SISTEMA E21 000320 001.00 19880101 19880201OP2012 SUP. APLICAÇÃO E21 000330 001.00 19880101 19880201OP2013 SUP. DB \DC E21 000340 001.00 19880101 19880201............. ................. .... ............ ........... ............. ...............MA2114 B01 ? 19880920 ?
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 137 -
Insert de Múltiplas Linhas
INSERT INTO TESTPROJSELECT * FROM PROJ
WHERE DEPT LIKE ‘B%’
OR DEPT IN(‘E11’, `E21’, ’E31’)
Resultado:
PCOD PNOME DEPT R E S P EQUIPE DATAINI DATAFIM
PCOD PNOME DEPT R E S P EQUIPE DATAINI DATAFIM
PL2100 ................. B01 000020 001.00 19870101 19870915OP1010 OPERAÇÃO E11 000090 005.00 19860101 19880501OP2010 SUP. SISTEMA E21 000100 004.00 19820101 19880201OP2011 ................... E21 000320 001.00 19820101 19880201OP2012 ................... E21 000330 001.00 19820101 19880201OP2013 ................. E21 000340 001.00 19820101 19880201
PCOD PNOME DEPT R E S P EQUIPE DATAINI DATAFIM
PL2100 ................. B01 000020 001.00 19870101 19870915OP1010 OPERAÇÃO E11 000090 005.00 19860101 19880501OP2010 SUP. SISTEMA E21 000100 004.00 19820101 19880201OP2011 ................... E21 000320 001.00 19820101 19880201OP2012 ................... E21 000330 001.00 19820101 19880201OP2013 ................. E21 000340 001.00 19820101 19880201
TESTPROJ
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 138 -
Update de Colunas
UPDATE RESTPROJSET EQUIPE = EQUIPE * 2, DATAFIM = NULL,
DATAINI = ‘1987-06-01’WHERE DEPT = ‘B01’
ANTES :
PCOD PNOME DEPT R E S P EQUIPE DATAINI DATAFIM.......... .......... ............. .......................... ................. ....
OP2011 SUP. SISTEMA E21 000320 001.00 19880101 19880201OP2012 SUP. APLICAÇÃO E21 000330 001.00 19880101 19880201OP2013 SUP. DB \DC E21 000340 001.00 19880101 19880201............. ................. .... ............ ........... ............. ...............MA2114 B01 19880920 19890201001.00
PCOD PNOME DEPT R E S P EQUIPE DATAINI DATAFIM.......... .......... ............. .......................... ................. ....
OP2011 SUP. SISTEMA E21 000320 001.00 19880101 19880201OP2012 SUP. APLICAÇÃO E21 000330 001.00 19880101 19880201OP2013 SUP. DB \DC E21 000340 001.00 19880101 19880201............. ................. .... ............ ........... ............. ...............MA2114 B01 19880920
PCOD PNOME DEPT R E S P EQUIPE DATAINI DATAFIM.......... .......... ............. .......................... ................. ....
OP2011 SUP. SISTEMA E21 000320 001.00 19880101 19880201OP2012 SUP. APLICAÇÃO E21 000330 001.00 19880101 19880201OP2013 SUP. DB \DC E21 000340 001.00 19880101 19880201............. ................. .... ............ ........... ............. ...............MA2114 B01 19880920 19890201001.00
PCOD PNOME DEPT R E S P EQUIPE DATAINI DATAFIM.......... .......... ............. .......................... ................. ....
OP2011 SUP. SISTEMA E21 000320 001.00 19880101 19880201OP2012 SUP. APLICAÇÃO E21 000330 001.00 19880101 19880201OP2013 SUP. DB \DC E21 000340 001.00 19880101 19880201............. ................. .... ............ ........... ............. ...............MA2114 B01 19870601 ?002.00
PCOD PNOME DEPT R E S P EQUIPE DATAINI DATAFIM.......... .......... ............. .......................... ................. ....
OP2011 SUP. SISTEMA E21 000320 001.00 19880101 19880201OP2012 SUP. APLICAÇÃO E21 000330 001.00 19880101 19880201OP2013 SUP. DB \DC E21 000340 001.00 19880101 19880201............. ................. .... ............ ........... ............. ...............MA2114 B01 19870601 ?
PCOD PNOME DEPT R E S P EQUIPE DATAINI DATAFIM.......... .......... ............. .......................... ................. ....
OP2011 SUP. SISTEMA E21 000320 001.00 19880101 19880201OP2012 SUP. APLICAÇÃO E21 000330 001.00 19880101 19880201OP2013 SUP. DB \DC E21 000340 001.00 19880101 19880201............. ................. .... ............ ........... ............. ...............MA2114 B01 19870601 ?002.00
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 139 -
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 - 140 -
Delete de Linhas
ANTES :
DELETE FROM TESTPROJ
WHERE DEPT = ‘B01’
DEPOIS :
PCOD PNOME DEPT R E S P EQUIPE DATAINI DATAFIM.......... .......... ............. .......................... ................. ....
OP2011 SUP. SISTEMA E21 000320 001.00 19880101 19880201OP2012 SUP. APLICAÇÃO E21 000330 001.00 19880101 19880201OP2013 SUP. DB \DC E21 000340 001.00 19880101 19880201............. ................. .... ............ ........... ............. ...............
PCOD PNOME DEPT R E S P EQUIPE DATAINI DATAFIM.......... .......... ............. .......................... ................. ....
OP2011 SUP. SISTEMA E21 000320 001.00 19880101 19880201OP2012 SUP. APLICAÇÃO E21 000330 001.00 19880101 19880201OP2013 SUP. DB \DC E21 000340 001.00 19880101 19880201............. ................. .... ............ ........... ............. ...............
PCOD PNOME DEPT R E S P EQUIPE DATAINI DATAFIM.......... .......... ............. .......................... ................. ....
OP2011 SUP. SISTEMA E21 000320 001.00 19880101 19880201OP2012 SUP. APLICAÇÃO E21 000330 001.00 19880101 19880201OP2013 SUP. DB \DC E21 000340 001.00 19880101 19880201............. ................. .... ............ ........... ............. ...............MA2114 B01 19880920 19890201001.00
PCOD PNOME DEPT R E S P EQUIPE DATAINI DATAFIM.......... .......... ............. .......................... ................. ....
OP2011 SUP. SISTEMA E21 000320 001.00 19880101 19880201OP2012 SUP. APLICAÇÃO E21 000330 001.00 19880101 19880201OP2013 SUP. DB \DC E21 000340 001.00 19880101 19880201............. ................. .... ............ ........... ............. ...............MA2114 B01 19880920
PCOD PNOME DEPT R E S P EQUIPE DATAINI DATAFIM.......... .......... ............. .......................... ................. ....
OP2011 SUP. SISTEMA E21 000320 001.00 19880101 19880201OP2012 SUP. APLICAÇÃO E21 000330 001.00 19880101 19880201OP2013 SUP. DB \DC E21 000340 001.00 19880101 19880201............. ................. .... ............ ........... ............. ...............MA2114 B01 19880920 19890201001.00
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 141 -
Delete de Todas as Linhas
DELETE FROM TESTPROJDELETE FROM TESTPROJ
Obs.: Cuidado com este tipo de deleção, pois todas as linhas serão afetadas
DEPOIS :
ANTES:
PCOD PNOME DEPT R E S P EQUIPE DATAINI DATAFIM.......... .......... ............. .......................... ................. ....
OP2011 SUP. SISTEMA E21 000320 001.00 19880101 19880201OP2012 SUP. APLICAÇÃO E21 000330 001.00 19880101 19880201OP2013 SUP. DB \DC E21 000340 001.00 19880101 19880201............. ................. .... ............ ........... ............. ...............MA2114 B01 19880920 19890201001.00
PCOD PNOME DEPT R E S P EQUIPE DATAINI DATAFIM.......... .......... ............. .......................... ................. ....
OP2011 SUP. SISTEMA E21 000320 001.00 19880101 19880201OP2012 SUP. APLICAÇÃO E21 000330 001.00 19880101 19880201OP2013 SUP. DB \DC E21 000340 001.00 19880101 19880201............. ................. .... ............ ........... ............. ...............MA2114 B01 19880920
PCOD PNOME DEPT R E S P EQUIPE DATAINI DATAFIM.......... .......... ............. .......................... ................. ....
OP2011 SUP. SISTEMA E21 000320 001.00 19880101 19880201OP2012 SUP. APLICAÇÃO E21 000330 001.00 19880101 19880201OP2013 SUP. DB \DC E21 000340 001.00 19880101 19880201............. ................. .... ............ ........... ............. ...............MA2114 B01 19880920 19890201001.00
PCOD PNOME DEPT R E S P EQUIPE DATAINI DATAFIM
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 142 -
Programação
Parte 2
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 143 -
Programa em Linguagem Tradicional
NÃO RELACIONAL RELACIONAL
COBOLSQL SQLP L I embutidoFORTRAN
A S S E MB L E RC
ARQUIVOSREGISTROS
CURSORVAR.HOST
TABELASLINHAS
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 144 -
Programação
• O SQL trabalha com tabelas e linhas. É uma linguagem desenvolvida para manipular conjuntos.
• Já as linguagens tradicionais trabalham com arquivos e registros e nãoconseguem reconhecer tabelas e linhas.
• Para podermos trabalhar com o SQL dentro de programas emlinguagens 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 oCURSOR do DB2. Assim, o programa pode acessar linhas de umatabela 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 - 145 -
Instrução SQL
END-EXEC.EXEC SQL
DELIMITADORES
COBOL EXEC SQLinstrução SQL END-EXEC.
PL/I EXEC SQLinstrução SQL ;
FORTRAN EXEC SQLX instrução SQL
ASSEMBLER EXEC SQLinstrução SQL X
INSTRUÇÃO SQL entre DELIMITADORES
DELETE FROM DEPT
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 146 -
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 ocaracter de continuação “X” na coluna 6.
• No ASSEMBLER o caracter “X” na coluna 72 indica que a instruçãocontinua na linha seguinte.
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 147 -
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 - 148 -
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 detabelas ou nome de colunas.
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 149 -
Outros Exemplos
PARA FORNECER UM VALOR AO DB2
EXEC SQL INSERT INTO EMPR(MATR, SOBRENOME)VALUES (:MATR, :SNOME) END-EXEC.
MATR SNOMEEXEC SQL
UPDATE EMPRSET SALARIO = SALARIO * :REAJWHERE CARGO = :CARGO
END-EXEC.
REAJCARGO
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 150 -
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 sercompatí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 - 151 -
Variável Host (Cont.)
P A R A R E C E B E R U M VALOR DO DB2
EXEC SQLSELECT MATR, SOBRENOME
INTO :MATR, :SNOME
FROM EMPRWHERE DEPT = :DEP
END-EXEC.
P A R A R E C E B E R U M VALOR DO DB2
EXEC SQLSELECT MATR, SOBRENOME
INTO :MATR, :SNOME
FROM EMPRWHERE 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 - 152 -
Variável Host (Cont.)
E S T R U T U R A
EXEC SQL SNOMESELECT SOBRENOME, DEPTINTO :SNOME, :DEPTFROM EMPR DEPTWHERE MATR = :MATREND-EXEC.
MATR
equivale à:
EXEC SQLSELECT SOBRENOME, DEPTINTO :ESTRUTFROM EMPRWHERE MATR = :MATREND-EXEC.
MATR
SNOMEDEPT
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 153 -
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 - 154 -
Definição de Variável Host
DADOS NUMÉRICOSDADOS NUMÉRICOS
R E A L *8 N5 /DOUBLEPRECISION N5N5 DS D01 N5 COMP - 2.DCL N5 BIN
FLOAT(53)
FLOAT /FLOAT(53) /DOUBLE PRECIS ION
R E A L *4 N4 / REAL N4
N4 DS E01 N4 COMP -1.DCL N4 BINFLOAT(21)
R E A L *8 NEN3 DC
PL5’000.0001 N3 PIC S9(3)V9(2)
COMP -3.DCL N3 DEC
FIXED(5,2)DECIMAL (5,2) / DEC (5,2)
INTEGER*4 N2N2 DS F01 N2 PIC S9(9)
COMP. DCL N2 BIN
FIXED(31)INTEGER/ INT
INTEGER*2/N1N1 DS H01 NI PIC S9(4)COMP.
DCL N1 BIN FIXED(15)SMALLINT
FORTRANASSEMBLERCOBOLPL/ IDB2
R E A L *8 N5 /DOUBLEPRECISION N5N5 DS D01 N5 COMP - 2.DCL N5 BIN
FLOAT(53)
FLOAT /FLOAT(53) /DOUBLE PRECIS ION
R E A L *4 N4 / REAL N4
N4 DS E01 N4 COMP -1.DCL N4 BINFLOAT(21)
R E A L *8 NEN3 DC
PL5’000.0001 N3 PIC S9(3)V9(2)
COMP -3.DCL N3 DEC
FIXED(5,2)DECIMAL (5,2) / DEC (5,2)
INTEGER*4 N2N2 DS F01 N2 PIC S9(9)
COMP. DCL N2 BIN
FIXED(31)INTEGER/ INT
INTEGER*2/N1N1 DS H01 NI PIC S9(4)COMP.
DCL N1 BIN FIXED(15)SMALLINT
FORTRANASSEMBLERCOBOLPL/ IDB2
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 155 -
Definição de Variável Host (cont.)
DB2 PL/ I COBOL ASSEMBLER FORTRAN
DCL STR2 CHAR (80) VAR;
VARCHAR(80)
CHAR(10) 01 STR1 PIC X(10)
01 STR249 STR2L
PIC S9(4) COMP.49 STR2C
PIC X(80).
DCL STR1 CHAR (1);
STR1 DS CL10
STR2 DS H,CL80
CHARACTER*10 S T R 1
CHARACTE*80 S T R 2
DB2 PL/ I COBOL ASSEMBLER FORTRAN
DCL STR2 CHAR (80) VAR;
VARCHAR(80)
CHAR(10) 01 STR1 PIC X(10)
01 STR249 STR2L
PIC S9(4) COMP.49 STR2C
PIC X(80).
DCL STR1 CHAR (1);
STR1 DS CL10
STR2 DS H,CL80
CHARACTER*10 S T R 1
CHARACTE*80 S T R 2
CARACTER STR INGCARACTER STR ING
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 156 -
Definição de Variável Host (cont.)
DATA/HORÁRIO/TIMESTAMP
DOUBLE BYTE CHARACTER STR ING
DB2 PL/ I COBOL ASSEMBLER FORTRAN
DCL TM CHAR(8)TIME
DATE 01 DT PIC X(10)
01 TM PIC X(8)
DCL DT CHAR(10) DT DS CL10
TM DS CL8
CHARACTER*10 DT
CHARACTER*8 TM
TIMESTAMP DCL TS CHAR(26) 01 TS PIC X(26) CHARACTER*26 TSTS DS CL26
DB2 P L I COBOL
DCL DBC2 GRAPHIC(40) VARVARGRAPHIC (40)
GRAPHIC (5) 01 DBC1 PIC G(5) DISPLAY-1.
01 DBC249 DBC2L PIC S9(4) COMP.49 DBC2C PIC G(40) DISPLAY-1.
DCL DBC1 GRAPHIC(5)
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 157 -
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 - 158 -
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 - 159 -
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 - 160 -
Luw
UPDATECONTA
UPDATEPOUPANÇA
COMMIT
500 500 400 500 400 600 400 600
CONTA POUPANÇA CONTA POUPANÇA
100 100
NOVO PONTO DECONSISTÊNCIA
LUW
500 500
ROLLBACK
LUW ABORTADA
t
t
PONTO DE CONSISTÊNCIA
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 161 -
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 - 162 -
Commit/Rollback
COMMIT
TSO/BATCH IMS CICS call ROLL comando ROLLBACK
ROLLBACK call ROLB
Automaticamente ao término ANORMAL DO PROGRAMA
ROLLBACK
TSO/BATCH IMS CICScall CHKP comando SYNCPOINT
COMMIT call sync GU IOPCB
Automaticamente ao término NORMAL DO PROGRAMA
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 163 -
SQLCA
• NECESSÁRIO PARA O PROGRAMA
• FORNECE INFORMAÇÕES SOBRE O SQL EXECUTADO
• EMBUTIDO NO PROGRAMA VIA:
EXEC SQL INCLUDE SQLCA END -EXEC .
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 164 -
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 peloprecompilador se incluirmos a instrução “INCLUDE SQLCA”.
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 165 -
SQLCA (cont.)
CONDIÇÃO SQLCODE
ERRO GRAVE negativo
ADVERTÊNCIA positivodiferente de 100
NÃO ENCONTRADO + 100
OU FIM DO CURSOR
SUCESSO 0
VERIFICARSQLWARN0VERIFICARSQLWARN0
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 166 -
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 - 167 -
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 - 168 -
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 - 169 -
Auxílio à Codificação
• INSTRUÇÃO WHENEVERmanipulação de exceções
• DCLGENgerar declaração de variáveis HOST
• INSTRUÇÃO INCLUDEembutir estrutura de SQLCA/var.HOST no programa
• DSNTIAR/DSNTIRrotina de formatações de mensagens de erro.
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 170 -
Instrução Whenever
EXEC SQL WHENEVER CONDIÇÃO AÇÃO END-EXEC.
CONDIÇÃO
SQLERROR : SQLCODE negativoSQLWARNING : SQLCODE positivo diferente de 100
ou SQLWARN0 = ‘W’NOT FOUND : SQLCODE = +100
AÇÃO
GO TO :XCONTINUE
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 171 -
Instrução Whenever (cont.)
• Esta instrução testa o SQLCODE na SQLCA após cada execução de uma instrução SQL e para uma determinada condição de execução, toma umaaçã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 ONCONDITION 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 - 172 -
DCLGEN
TABELA EMPRMATR CHAR (6)NOME VARCHAR(12)
ME MB 301 DCEMPR.10 MATR PIC X(6).10 NOME.
49 NOME -LEN PIC S9(4) USAGE COMP.49 NOME -TEXT PIC X(12).
DCLGEN
CATÁLOGO
BIBLIOTECA INCLUDE
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 173 -
DCLGEN (cont.)
• O DCLGEN é um programa que gera uma codificação de declaração devariá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áveisHOST 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 - 174 -
Instrução Include
MEMB3
EXEC SQLINCLUDE MEMB3
END-EXEC.. 01 DCLEMPR.. 10....
EXEC SQLINCLUDE SQLCA 01 SQLCA
END-EXEC. 05...
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 175 -
PREPARAÇÃO DE PROGRAMA COM SQL
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 176 -
Preparação de Programa com SQL
PREPARAÇÃO DE PROGRAMA COM SQLPREPARAÇÃO DE PROGRAMA COM SQL
Código fonte com SQL
Biblioteca de Include
PRECOMPILE
Fonte Modificado DBRM (Biblioteca)
COMPILE
LINK EDIT
Módulo Objeto
Load Módulo(Language Interface)
BINDDefinição Table/Column
SYSPACKAGE
Autorizações
Package Plan
EXECUTE
Diretório do DB2 Diretório do DB2
Catálogo do DB2
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 177 -
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 - 178 -
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 - 179 -
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 timestamporiginal é 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 - 180 -
Visão Geral “Bind”
VISÃO GERAL “BIND”VISÃO GERAL “BIND”
D B R Mno PDS
Catálogodo DB2BIND
VALIDAÇÃOTable/col Table/colReferencias descrições
AUTORIZAÇÃOTipo de usuáriossoliticação autorizadosESTRATÉGIA DE ACESSO
Tipo de característicassolicitação físicas
D B R Mna
SYS IBM.SYSPACKSTMTPackage
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 181 -
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 - 182 -
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 - 183 -
PACKAGE
Os packages são armazenados em Collections
DBRM
BIND PACKAGE (online )MEMBER ( dbrma)
BIND PACKAGE (online)MEMBER (dbrma)
Nome do Package =Collection _id.Package_idNome do Package =Collection_id.Package _id
BIND PACKAGE (batch)MEMBER (dbrma)
BIND PACKAGE (batch)MEMBER ( dbrma)
dbrma
online batch
dbrmadbrma
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 184 -
COLLECTION
Uma COLLECTION é um conjunto de Packages
A collection é implicitamente criada no primeiro bind packagese referenciando a ela
Exemplo:
pkg1
online batch
pkg3
BIND PACKAGE ( online) MEMBER (pkg1)BIND PACKAGE (batch) MEMBER (pkg3)BIND PACKAGE (online) MEMBER (pkg1)BIND PACKAGE (batch) MEMBER (pkg3)
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 185 -
TOKEN DE CONSISTÊNCIA - Prep. do Programa
Pre-compilador
Compilador/ Link-edit
prog2
prog2prog3 prog1
prog1prog3
DiretórioLoad Módulo
BIND PACKAGE
dbrm2dbrm1dbrm3
dbrm3 dbrm2dbrm1
: Timestamp da precompilação
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 186 -
Plano - ligação entre o package e o load modulo
dbrm1dbrm1dbrm3dbrm1
dbrm2
Diretório
collycollx
collz
collx.dbrm1, collz.*collx.dbrm1, collz.*
RUN PROGRAM ( Imoda)PLAN ( plana)
BIND PLAN (plana)PKL IST ( collx .dbrm1, collz.*)
plana
.CALL DSNHLI (dbrm1, ,1)..CALL DSNHLI (dbrm1, ,2)..
CALL DSNHLI (dbrm3, ,1).
lmoda
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 187 -
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 ospackages
• O nome do DBRM e o timestamp fornecido no call é usado para localizar o package correto através da package l ist
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 188 -
ERRO DE TIMESTAMP
dbrm1dbrm1
colly collx
colly .*, collx.*
.CALL DSNHLI (dbrm1, ,1).
-80551002
plana
RUN PROGRAM (Imoda)PLAN (plana)
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 189 -
BIND - opção QUALIFIER
.SELECT...FROM TAB1.
.SELECT...FROM TAB1.
BIND PACKAGEQUAL (PROD)
BIND PACKAGEQUAL (PROD)
BIND PACKAGEBIND PACKAGEBIND PACKAGE
QUAL (TEST)BIND PACKAGE
QUAL (TEST)
TEST.TAB1 binder.TAB1 PROD.TAB1
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 190 -
Cursor
215
P R O C E S S A MENTO DE MÚLTIPLAS LINHAS
O P E NMATR SOBRENOME
030 SILVA050 P A R K E R
C L A R K MATR SNOMEFETCH
MATR SOBRENOME030 SILVA050 P A R K E R 030 SILVA215 C L A R K
MATR SNOME
FETCHMATR SOBRENOME
030 SILVA050 P A R K E R 050 P A R K E R215 CLARK MATR SNOME
SELECT MATR,SOBRENOMEFROM EMPRWHERE DEPT=‘D01’
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 191 -
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 - 192 -
Select com Fetch
• DEFINIÇÃO do CURSOR
EXEC SQLDECLARE K9 CURSOR FORSELECT MATR, SOBRENOMEFROM 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 - 193 -
Procure Definir
DECLARE CURSOR: No COBOL antes da PROCEDURENo EASY antes do JOB INPUTOu 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 - 194 -
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 - 195 -
EXEC SQLDECLARE CE CURSOR FORSELECT ... FROM EMPR...
END-EXEC.
EXEC SQL OPEN CE END-EXEC.
EXEC SQL FETCH CE INTO...END-EXEC...
EXEC SQL DELETE FROM EMPRWHERE CURRENT OF CE END-EXEC
.
.
.
.EXEC SQL CLOSE CE END-EXEC
Delete Via Cursor
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 196 -
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 - 197 -
Update Via Cursor
EXEC SQLDECLARE CX CURSOR FORSELECT ... MATR, SOBRENOMEFROM EMPRWHERE DEPT = : DPTFOR UPDATE OF SOBRENOME
END-EXEC.
EXEC SQL OPEN CE END-EXEC..
EXEC SQL FETCH CX INTO :MATR,:SNOME END..
EXEC SQL UPDATE EMPRSET SOBRENOME = :NOVOSN
WHERE CURRENT OF CX END-EXEC..
EXEC SQL CLOSE CX END-EXEC
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 198 -
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 - 199 -
Manipulação de Cursor
POSICIONAMENTOOPEN
FETCH ... FETCH ... FETCH...
CLOSE
REUTILIZAÇÃO do CURSORO P E N
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 200 -
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 unitof 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 - 201 -
Variável Indicadora
colunaCARGO
EXEC SQL
SELECT CARGO DEPT, FONE, NOMEINTO :CC:CCI, :DPT, :FON:NFON, :NOMFROM EMPRWHERE MATR = :ID
END-EXEC.
Var.HOST:CC
Var.IND:CC I
S E L E C T /FETCH
“ANALISTA”NULO
“ANALISTA”inalterado
0-1
UPDATE/INSERT
“GERENTE”NULO
“GERENTE”ignorado
0-1
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 202 -
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 - 203 -
Vetor de Var. Indicadoras
EXEC SQL
SELECT CARGO, DEPT, FONE, NOMEINTO :EST:VETORFROM EMPRWHERE MATR = :ID
END-EXEC.
ID E S T VETOR
01 EST. 01 VETOR.10 CC PIC... 10 ARRAY PIC S9(4) COMP10 DPT PIC... OCCURS 3 TIMES 10 FON PIC...10 NOM PIC...
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 204 -
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 últimavariá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 - 205 -
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 overflow.
• “n” indica que uma variável HOST é pequena demais para conter umstring 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 - 206 -
Erros de Aritmética e Conversão - Exemplo
01 MV1 PIC S9(9) COMP VALUE 0.01 MV2 PIC S9(9) COMP.01 MV3 PIC S9(9) COMP.01 I-VARIABLES.
05 IV1 PIC S9(4) COMP.05 IV2 PIC S9(4) COMP.05 IV3 PIC S9(4) COMP.
EXEC SQLSELECT SMI1, SMI1*INT1, SMI1/SMI2INTO :MV1:IV1, :MV2:IV2, :MV3:IV3 FROM TABLEA
END-EXEC.
04
3456782111111111
24
SMI2INT1SMI104
3456782111111111
24
SMI2INT1SMI1
1. Primeira linha:
2. Segunda linha:
MV1 = 1 IV1 = 0MV2 = 691356 IV2 = 0MV3 = 0 IV3 = -2SQL CODE = +802
MV1 = 4 IV1 = 0MV2 = 691356 IV2 = -2MV3 = 1 IV3 = 0SQL CODE = +304
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 207 -
Uso da Variável Indicadora - Resumo
var.IND INTERPRETAÇÃO
0 var. HOST contém valor não nulo
-1 coluna com valor nulovar. HOST inalterada
-2 resultado nulo devido a uma erroaritmético ou de conversão
n (>0) s tring de “n”caracteres truncadono assinalamento à variável HOST
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 208 -
Estratégia de Acesso
SELECT * FROM EMPRWHERE 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 - 209 -
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 - 210 -
Execução do Programa
CICS, IMS, TSO DB2
C A L L
RELATÓRIO VSAM TABELASDB2
MÓDULODECARGA
PLANO
PACKAGE
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 211 -
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 detimestamp diferente é emitido
SQLCODE= - 818 (PLANO com DBRM)
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 212 -
Considerações Sobre Programação
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 213 -
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 - 214 -
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 - 215 -
Recomendações DML (cont.)
• EVITE o subquery correlacionado.
SELECT MATR, SOBRENOMEFROM EMPR E, PROJETO PWHERE E.DEPT = P.DEPTAND E.MATR = P.RESP
é mais eficiente que
SELECT MATR,SOBRENOMEFROM EMPR EWHERE DEPT = (SELECT DEPT
FROM PROJETOWHERE RESP = E.MATR)
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 216 -
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 - 217 -
Uso do Índice
COLUNA INDEXADA INDEX SORTCANDIDATO CANDIDATO
IN SIML IKE NOTA 1BETWEEN SIM>,>=,<,<=,¬>,¬<,= SIM¬=,<> NÃONOT NOTA 2OR NOTA 3O R D E R B Y SIM SIMGROUP BY SIM SIMDISTINCT SIM SIMCOMPARED TO:LONGER L I TERAL NÃOARITIMETIC EXP. NÃODIFF. DATA TYPE NÃOUSED 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 índiceNOTA 3: Sim se possível converter em IN.
USO DO ÍNDICEUSO DO ÍNDICE
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 218 -
Expressões Aritméticas
EXEC SQLSELECT LASTNAME, SALARYFROM TEMPLWHERE SALARY <= :SAL + 1000
END-EXEC
SAL = SAL + 1000EXEC SQL
SELECT LASTNAME, SALARYFROM TEMPLWHERE SALARY <=: SAL
END-EXEC
EXPRESSÕES AR I TMÉTICASEXPRESSÕES ARITMÉTICAS
• MATCHING INDEX EM SALARY NÃO UTILIZADO
• MATCHING INDEX EM SALARY CONSIDERADO
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 219 -
Condições Not
CONDIÇÕES NOTCONDIÇÕES NOT
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
WHERE DEPTNO ¬> ‘D17’WHERE NOT DEPTNO < ‘D28’
Evitar a utilização do comando NOT
• MATCHING INDEX EM DEPTNO CONSIDERADO
• MATCHING INDEX EM DEPTNO NÃO UTILIZADO
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 220 -
Uso do “Like”
USO DO “LIKE”USO DO “LIKE”
WHERE LASTNAME LIKE ‘%SON’WHERE LASTNAME LIKE ‘_SON’WHERE SUBSTR(LASTNAME ,3,3) = ‘SON’
WHERE LASTNAME LIKE ‘B_S%’
Evitar a utilização do comando LIKE
• MATCHING INDEX EM LASTNAME NÃO UTILIZADO
• MATCHING INDEX EM LASTNAME CONSIDERADO
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 221 -
Subqueries
SUBQUERIESSUBQUERIES
WHERE DEPTNO =(SELECT WORKDEPT FROM EMPLWHERE EMPNO = ‘123456’)
WHERE DEPTNO= ANY (SELECT WORKDEPTFROM EMPL WHERE LASTNAME=‘SMITH’)
SELECT LASTNAME, FIRSTNAME FROM EMPL MYWHERE SALARY> (SELECT AVG(SALARY)
FROM EMPLWHERE WORKDEPT = MY.WORKDEPT)
• MATCHING INDEX EM DEPTNO CONSIDERADO:
• MATCHING INDEX EM DEPTNO NÃO UTILIZADO
- SUBQUERY NÃO-CORRELATA- VALOR ÚNICO DA SUBQUERY
- L ISTA DE VALORES DA SUBQUERY
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 222 -
Explain
EXPLAINEXPLAIN
SELECT MATR, SOBRENOME FROM EMPRWHERE ......AND......AND......SELECT MATR, SOBRENOME FROM EMPRWHERE ......AND......AND......
Instrução ou opção do BIND
PLAN-T A B L E
• 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
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 223 -
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 - 224 -
Explain (cont.)
PLAN - T A B L E
EXPLAINEXPLAIN
EXPLAINEXPLAINComandoSQL
• EXPLAIN ALL
SET QUERY = nFOR sql-statement
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 225 -
Plan_table
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 226 -
Plan_table (cont.)
EDIT – DB2. DISCOVER.EXPLAIN(GOLD) -01.03 ----------COMMAND===> ; ; ;****** ************** TOP OF DATA ****************000100 EXPLAIN ALL SET QUERYNO = 1 FOR000200 SELECT LASTNAME , FIRSTNAME , SALARY000300 FROM EMP000400 WHERE EMPNO = ‘ 000280 ’ ;000500 - - -000600 SELECT *000700 FROM PLAN_TABLE000800 WHERE QUERYNO = 1 ;****** ************* BOTTOM OF DATA **************
PF3
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 227 -
Plan_table (cont.)
PLAN_TABLEPLAN_TABLE
• ACCESSTYPE :
− R = TABLESPACE SCAN (TABLE SCAN IF SEGMENTED TS)− 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 ACCESSTYPE = 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 - 228 -
Tópicos Adicionais
Parte 3
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 229 -
LOCKING
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 230 -
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 - 231 -
Granularidade - Locksize Tablespace
WAITING
WAITING
WAITING
S E L E C T
S E L E C TUPDATE
UPDATE
LOCKS IZE TABLESPACELOCKS IZE TABLESPACE
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 232 -
Granularidade - Locksize Table
S E L E C T
S E L E C TUPDATE
UPDATE
WAITING WAITING
LOCKS IZE TABLELOCKS IZE TABLE
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 233 -
Granularidade - Locksize Page/any
LOCKSIZE PAGE/ANYLOCKSIZE PAGE/ANY
S E L E C T
S E L E C TUPDATE
UPDATE
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 234 -
Granularidade - Locksize Row
LOCKSIZE ROWLOCKSIZE ROW
S E L E C T
S E L E C TUPDATE
UPDATE
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 235 -
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á uma 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 dotablespace
• 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 - 236 -
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 - 237 -
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 Os 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 - 238 -
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.
• UR Uncommited Read NENHUMlock é 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 - 239 -
Autorizações
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 240 -
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 - 241 -
Itens Protegidos
DATABASE CATALOG
TABLESPACE UTILITIES
TABLE COMMANDS
INDEX BIND
VIEW EXECUTE
STORAGE GROUP GRANT
BUFFER POOL
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 242 -
Identificação do Usuário do DB2
T S O 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
T S O 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:BATCH - o Control-M ONLINE - usuário de signon do CICS
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 243 -
Comando Grant/Revoke
GRANT Lista de privilégiosON Lista de recursosTO Lista de USER-IDS
[WITH GRANT OPTION]
• GRANT ... ON ... TO PUBLIC
(Essa autorização vale para qualquer USER-ID)
REVOKE Lista de privilégiosON Lista de recursos
FROM Lista de USER-IDS
• REVOKE ... ON ... FROM user1
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 244 -
Utilitários
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 245 -
Utilitários DB2
QUALQUER TIPODELETA INFORMAÇÕES SOBRE UMA COPIA DA TABELA DO CATÁLOGO ‘SYSIBM.SYSCOPY’ E DO DIRETÓRIO ’SYSIBM.SYSLGRNG’
MODIFY
QUALQUER TIPOJUNTA CÓPIAS INCREMENTAIS E/OU TOTAIS E CRIA UMA NOVA CÓPIA INCREMENTAL E/OU TOTAL
MERGECOPY
NENHUM NO TABLESPACE OU
PARTIÇÃO SENDO CARREGADO
CARREGA DADOS DE UM ARQUIVO SEQUENCIAL P AR A UMA OU MAIS TABELAS NO MESMO TABLESPACE
LOAD
QUALQUER TIPOCRIA UMA CÓPIA (BACKUP) DE UM TABLESPACECOPY
LEITURATESTA INTEGRIDADE REFERÊNCIAL E AS CONTRAINTS
CHECK DATA
LEITURATESTA SE OS INDÍCES ESTÃO CONSISTENTES COM OS DADOS
CHECK INDEX
PROCESSAMENTOCONCORRENTEFUNÇÃO/DESCRIÇÃOUTILITÁRIO
QUALQUER TIPODELETA INFORMAÇÕES SOBRE UMA COPIA DA TABELA DO CATÁLOGO ‘SYSIBM.SYSCOPY’ E DO DIRETÓRIO ’SYSIBM.SYSLGRNG’
MODIFY
QUALQUER TIPOJUNTA CÓPIAS INCREMENTAIS E/OU TOTAIS E CRIA UMA NOVA CÓPIA INCREMENTAL E/OU TOTAL
MERGECOPY
NENHUM NO TABLESPACE OU
PARTIÇÃO SENDO CARREGADO
CARREGA DADOS DE UM ARQUIVO SEQUENCIAL P AR A UMA OU MAIS TABELAS NO MESMO TABLESPACE
LOAD
QUALQUER TIPOCRIA UMA CÓPIA (BACKUP) DE UM TABLESPACECOPY
LEITURATESTA INTEGRIDADE REFERÊNCIAL E AS CONTRAINTS
CHECK DATA
LEITURATESTA SE OS INDÍCES ESTÃO CONSISTENTES COM OS DADOS
CHECK INDEX
PROCESSAMENTOCONCORRENTEFUNÇÃO/DESCRIÇÃOUTILITÁRIO
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 246 -
Utilitários DB2 (cont.)
LE I TURAESTABELECE UM ‘QUIESCE POINT’ NO CATÁLOGO PARA O(S) TABLESPACE(S)
QUIESCE
QUALQUER TIPOATUALIZA TABELAS CATÁLOGO COM ESTATÍSTICAS SOBRE UTILIZAÇÃO DE ESPAÇO DE “STORAGE GROUP”
STOSPACE
QUALQUER TIPOATUALIZA TABELAS CATÁLOGO COM ESTATÍSTICAS SOBRE UTILIZAÇÃO DE TABLESPACES EFICIÊNCIA DE ÍNDICES
RUNSTATS
QUALQUER TIPOLISTA INFORMAÇÕES DE TABLESPACESREPORT
PROCESSING
READY-ONLY DURANTE
UNLOAD; NEHUM DURANTE RELOAD
REORGANIZA UM TABLESPACE OU UM INDICEREORG
NENHUMRECUPERA O TABLESPACE, UMA PÁGINA, PARTIÇÃO OU “ERRORANGE”
RECOVER
PROCESSAMENTOCONCORRENTEFUNÇÃO/DESCRIÇÃOUTILITÁRIO
LE I TURAESTABELECE UM ‘QUIESCE POINT’ NO CATÁLOGO PARA O(S) TABLESPACE(S)
QUIESCE
QUALQUER TIPOATUALIZA TABELAS CATÁLOGO COM ESTATÍSTICAS SOBRE UTILIZAÇÃO DE ESPAÇO DE “STORAGE GROUP”
STOSPACE
QUALQUER TIPOATUALIZA TABELAS CATÁLOGO COM ESTATÍSTICAS SOBRE UTILIZAÇÃO DE TABLESPACES EFICIÊNCIA DE ÍNDICES
RUNSTATS
QUALQUER TIPOLISTA INFORMAÇÕES DE TABLESPACESREPORT
PROCESSING
READY-ONLY DURANTE
UNLOAD; NEHUM DURANTE RELOAD
REORGANIZA UM TABLESPACE OU UM INDICEREORG
NENHUMRECUPERA O TABLESPACE, UMA PÁGINA, PARTIÇÃO OU “ERRORANGE”
RECOVER
PROCESSAMENTOCONCORRENTEFUNÇÃO/DESCRIÇÃOUTILITÁRIO
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 247 -
Utilitário ''Load''
CARREGA DADOS SEQUENCIALMENTE PARA UMA OU MAIS TABELAS EM UM ''TABLESPACE'' OU PARTIÇÃO
ARQUIVO SEQUENCIALDE ENTRADA
ARQUIVO SEQUENCIALDE ENTRADA
UTILITÁRIO LOAD
UTILITÁRIO LOAD
UMA OU MAIS TABELASDE SAÍDA
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 248 -
Executando o Utilitário ''Load''
VISÃO BÁSICA DAS FASES DE EXECUÇÃO DO ''LOAD''
SEQINPUT
PHASE 1LOAD
TABLETABLEDFSORTDFSORT
REGISTROS SORTEADOS
TAB ELATAB ELA
TODOS INDICESTODOS INDICES
PHASE 2SORT
SYSUT1
SYSMAP
ERROS DE DUPLICADOS NO SYSERR
SYSREC
RID MAP DA TABELA
CARREGADA
REGISTROS DO INDICE E FOREIGN
KEY
ERROS DE CONVERSÃO NO SYSERR
INDICESDUPLICADOS
PHASE 4
INDEXVAL
SYSERR
AS DUAS LINHAS DUPLICADAS SÃO REMOVIDAS DA TABELA.
PHASE 3BUILD
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 249 -
Executando o Utilitário ''Load'' (cont.)
SEQUENCIALINPUT
PHASE 5
VIOLAÇÕES DE INTEGRIDADE REFERENCIAL
PHASE 6
SYSERR
SYSMAP
PHASE 7
TABELA PARENT TABELAFOREIGN KEY INVÁLIDAS REMOVIDAS
RID MAP DA TABELA
CARREGADA
DISCARD
SYSUT1 SYSDISC
DATA SET DE DISCARD
COMPLETO
RID MAP DA TABELA
CARREGADA
TODAS VIOLAÇÕES ACUMULADAS
REPORT
ENFORCE
SYSERR
ERROR SUMMARY
ERROR SUMMARY
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 250 -
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).
S O R T 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 àschaves primárias da(s) tabela(s) pai. As linhas encontradas com erro são fisicamente removidas e os registros de erro são gravados noarquivo ‘SYSERR’ .
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 251 -
LOAD - Fases de Execução (cont.)
DISCARD Usa o arquivo 'SYSERR' para saber quais linhas tiveram erros e oarquivo '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.
R E P O R T Usa 'SYSERR' para listar todas as linhas que não foram carregadas. 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 - 252 -
LOAD - Cartões de Controle
LOAD DATA INTO TABLE TAB_EMPR
WHEN (1:1)= ‘*’
(MATR POSITION (2:6),NOME POSITION (8:16),.. )
NOME DA COLUNA DESTINO
LOCALIZAÇÃO E TAMANHO DO CAMPO DE INPUT
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 253 -
Opções Resume e Replace
• LOAD INICIAL:- Tablespace vazio (Este é o default)
LOAD DATAR E S U ME NOINTO 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 DATAR E S U ME YESINTO TABLE EMP
• Sobrepor dados antigos:- Esvazia o tablespace e os índices antes do load
LOAD DATAR E P L A C E INTO TABLE EMP
Uma maneira fácil de fazer um refresh dos dados.
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 254 -
Exercício - Load
T1,T2 E T2 CONTÉM DADOS
ADICIONAR DADOS NA T2 DE UMARQUIVO SEQUENCIAL ?
FAZER REPLACE DOS DADOS DA T2POR UM ARQUIVO SEQUENCIAL ?
COMO VOCÊ FARIA PARA
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 255 -
Opção Log (Yes/No)
Com esta opção é possível carregar os dados mais rápido, porém pode
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 - 256 -
Utilitário '‘Check Data''
CHECA OS DADOS PARA VERIFICAR SE EXISTEM VIOLAÇÕES DE INTEGRIDADE REFERENCIAL E DE TABLE CHECK CONSTRAINT.
UTILITÁRIO CHECK DATA
UTILITÁRIO CHECK DATA
UM OU MAIS TABLESPACESUSER TABELA A
USER TABELA B
ERROR SUMMARY
ERROR SUMMARY
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 257 -
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.
CHECKDAT 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 - 258 -
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
- A L L
Checa todas as linhas de todas as tabelas existentes no tablespaceespecificado
• EXCEPTIONS nTermina o utilitário após n+ 1erros
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 259 -
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 SERUSADAS PELO DBA PARA AVALIAR A NECESSIDADE DE REORGANIZAÇÃO DOS DADOS
NÚMERO DE LINHAS NA TABELA ?CLUSTER OK ?NÍVEL DOS ÍNDICES ?NÚMERO DE VALORES DISTINTOS DE UMA COLUNA?
REORGANIZAR ?
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 260 -
Runstats - Fase de Execução
RUNSTATS Faz 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 - 261 -
Opções do Runstats
• REPORT NO | Y E S
Produz um relatório com as estatísticas obtidas pelo Runstats
• UPDATE ALL | NONE | SPACE | ACCESSPATH
ALL - inclui ambas opções SPACE e ACCESSPATH
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 - 262 -
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 - 263 -
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 - 264 -
Utilitário '‘COPY''
CRIA UM BACKUP DE UM TABLESPACE OU DE UMA PARTIÇÃO.
UTILITÁRIO C O P Y
UTILITÁRIO COPY
TABLESPACEUSER TABELA A
USER TABELA B
IMAGE COPY
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 265 -
COPY - Fases de Execução
R E P O R T Produz um relatório quando a opção CHANGELIMIT é utilizada
COPY Cópia do objeto
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 266 -
Opções do Copy
• F U L L
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 - 267 -
Copy Incremental e Mergecopy
T E MPO
DADOS CÓPIA CÓPIA CÓPIA
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 268 -
Recover
RECUPERA OS DADOS USANDO UMA CÓPIA E APLICANDO OS REGISTROS DA LOG
T E M P O
DADO RECUPERADO
DADO NÃO ACESS ÍVEL
DADOSALTERAÇÕESNOS DADOS
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 269 -
RECOVER - Fases de Execução
R E S T O R E Localiza e faz um merge das cópias disponíveis e recupera o
tablespace para o nível do backup
LOGAPPLY Aplica os registros da log no tablespace recuperado
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 270 -
RECOVER - Agilização do processo
TEMPO
DADO RECUPERADO
DADO NÃO ACESS ÍVEL
DADOSCÓPIA CÓPIACÓPIA
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 271 -
RECOVER - Para um ponto no tempo
TEMPO
DADOS
DADO RECUPERADO
ALTERAÇÕESNOS DADOS DADO DANIFICADO
LOGICAMENTE
PROCESSOSPERDIDOS
PONTO DEQUIESCE
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 272 -
RECOVER - Para um ponto no tempo
• T O R B A
É usado para especificar um ponto na log para a recuperação FULL
• TOCOPY
Especifica qual a cópia o DB2 deve usar para recuperar os dados.
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 273 -
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.
UMA
OU
MAIS
TABELASDE
SAÍDA
DSNTIAULDSNTIAUL
ARQUIVOSEQUENCIALDE OUTPUT
UMA OU MAIS TABELASDE ENTRADA
USER TABELA A
USER TABELA B
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 274 -
DSNTIAUL - DATA SETS e PARÂMETRO
Data Set Description
SYSIN Datasetde input.
SYSPR INT Datasetde output. DSNTIAUL escreve erros e mensagens informativas neste dataset.
SYSPUNCH Dataset de output. DSNTIAUL escreve os cartões de controle para o LOAD neste dataset.
SYSRECnn 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. Cadadataset 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 - 275 -
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.EMPWHERE WORKDEPT LIKE 'D%'ORDER BY EMPNO;
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 276 -
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 - 277 -
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 - 278 -
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 - 279 -
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 - 280 -
Para cada ocorrencia de SQLVAR 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 - 281 -
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 - 282 -
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 - 283 -
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 - 284 -
PROGRAMAÇÃO DE SP
Anotações: Domini Treinamento – DB2 para Desenvolvedores - 285 -
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 - 286 -
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 - 287 -
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.