Upload
gabriel-pessine
View
240
Download
1
Embed Size (px)
Citation preview
8/19/2019 Db2 Mainframes
1/12
DB2 para Mainframe DB2 para Mainframe
DB2 -TodosdireitosreservadosparaMainframeSchoolTreinamentosLtdaDB2 -TodosdireitosreservadosparaMainframeSchoolTreinamentosLtda
Índice Página
Alterandoatributosdeumatabell 9Alterandooconteúdodeumacolunaemumatabela 9Atributosdascolunas 7ConceitodeLUW-LogicalUnitofWork 3ConceitodeVariáveisHOST 16
Contandolinhasdeumatabela12Contandolinhasdistintamentedeumatabela 12Criandoíndicenãoúnicoemumatabela 8Criandoíndiceúnicoemumatabela 8Criandoumatabela 7DB2IDEFAULTSPANEL1 5DB2IPRYMARYOPTIONMENU 4Desfazendoasalteraçõesnastabelas 3Efetivandoasalteraçõesnastabelas 3Excluindolinhasdeumatabela 10Excluindoumatabela 8Inserindodadosemumatabela 9Juntandoduastabelasondea1ªtabelaéamandatória 13Juntandoduastabelasondea2ªtabelaéamandatória 14Juntandoduastabelasondeaambastabelassãomandatórias 15Juntandoduastabelas 13OqueéoDB2 1Pesquisandotabelaporpartedeumacoluna – LIKE 15Pesquisandotabelaporpartedeumacoluna – SUBSTR 16Processodeexecução 2SelecionadooMenor,Maior,SomatóriaeMédiaaritmética 2Selecionandolinhasdeumatabelaentrevaloresdeterminados 11Selecionandolinhasdeumatabelaentrevaloresespecíficos 11
Selecionandolinhasdeumatabela 10Selecionandolinhasdistintasdeumatabela 11SPUFI-SQLProcessorUsingFileInput 4SPUFIXCOBOL 17SQLCODE – PrincipaiscódigosderetornodoacessoaoDB2 21UtilizaçãodoSPUFI 4
DB2
DataBase2
Student Guide
8/19/2019 Db2 Mainframes
2/12
DB2 para Mainframe DB2 para Mainframe
DB2 -TodosdireitosreservadosparaMainframeSchoolTreinamentosLtdaDB2 -TodosdireitosreservadosparaMainframeSchoolTreinamentosLtda
1 2
O que é o DB2
ODB2éumbancodedadosqueutilizaummódulodeacesso,eumdispositivofísico dearmazenagemdosdados.NoDB2existeoconceitodeDATA BASE,TABLE SPACE,TABELAS, LINHAS e COLUNASonde:DATABASE-Áreaqueconterá(ão)os)table(s)space(s). TABLESPACE-Áreaqueconterá(ão)a(s)tabela(s).TABELA-Arquivodedados.
LINHA-Registrodedados.COLUNAS-Camposondeconterãoasinformaçõesdedados.
Processo de execução
Quando compilamos um fonte SQL, temos quatro fases distintas:Pré-compilação,compilação,linkediçãoeBINDPré-Compilação
VerificaasintaxedoSQLIncluiasdeclaraçõesdastabelasSQLevariáveisHOSTIncluiSQLCACriaoDBRMcomoscomandoSQLcopiadosCompilaçãoGeraoexecutávelapartirdofontetraduzidopelopré-compiladorOTIMESTAMPécopiadoparaomódulogeradoparafuturascomparaçõescomamanipulaçãodatabela.Linkedição
GeraosmódulosdecargaapartirdosexecutáveisGeraosmódulosdeacessoaoDB2Bind
GeraoplanoapartirdaDBRMemódulosdecargaapartirdosexecutáveis
OTIMESTAMPécopiadoparaaDBRMOplanocontémaestratégiadeacessoaoDB2,quesão:Validação:Checagemdereferênciasdastabelasecolunas;Autorização:Acessosrequeridos,usuáriosautorizados;Estratégia de acesso: Índices utilizados, estratégia de locking, estratégia deresoluçãodoscomandosJOIN,UNION,etc.Nota
DBRM -DATABASEREQUESTMODULE,contémtodasasinstruçõesSQLdoprograma fonte, é deste módulo queo BIND faz uso paracriar o plano deacesso.TIMESTAMP – Armazena um valor combinado entre DATA e HORA emcentésimosdesegundo,paraverificaçãodaestruturamontadanatabela.LOCKING – Monitora egerenciaomecanismoqueo DB2usaparachecaraintegridadedaDatabase .
TABLE SPACE 1
TABELA1
TABELA2
TABLE SPACE 2
TABELA3
DBRM1
Módulo
Acesso2
Módulo
Acesso1
Aplicativo1
Aplicativo2
DBRM2
Linha
Coluna
Índices
DATA BASE
8/19/2019 Db2 Mainframes
3/12
DB2 para Mainframe DB2 para Mainframe
DB2 -TodosdireitosreservadosparaMainframeSchoolTreinamentosLtdaDB2 -TodosdireitosreservadosparaMainframeSchoolTreinamentosLtda
3 4
Conceito de LUW - Logical Unit of WorkA LUW é um conceito onde todosos comandos de manutenção de dados nastabelas(INSERT,UPDATE,DELETE)espelhamaimagemdaslinhasantesdessasmanutenções,detalformaquesehouverumABEND,oDB2faráusodamesmapara desfazer (RECOVERY) essasmanutenções atéo momento doABEND,oscomandos COMMIT WORK e ROLLBACK WORK influenciam na CRIAÇÃO eRECOVERYdaLUW,sendoseuusomuitoimportanteedeveráserbemestudadoparacadaaplicação.
Efetivando as alterações nas tabelas
OcomandoCOMMITWORKefetiva,atéomomento desuaexecução, todasasalterações feitas nas tabelas envolvidas em uma aplicação, efetivando asmanutenções e limpandoaLUWda aplicação,apóseste comando não teremosmaiscomodesfazerasalteraçõesdastabelasenvolvidas.O término normal do apl icativo será executado um COMMIT WORKautomaticamente.Desfazendo as alterações nas tabelas
OcomandoROLLBACKWORKnãoefetivaasmanutençõesfeitasnastabelasaté
o momento de sua execução, os dados contidos na LUW da aplicação serãorestauradosnastabelasenvolvidas.O término anormal do aplicativo será executado um ROLLBACK WORKautomaticamente.
SPUFI - SQL Processor Using File Input
OSPUFIfazpartedoDB2z/OSevemjuntonoDB2 Interactive Panel.BasicamenteSPUFIéapenasumamaneirarápidadeexecutarSQLsatravésdeumarquivodeentradaesaídacomalgumaspoucasopções,porémconsideroamaneiramaisrápidaepráticaparaexecutarSQLsurgentesequevocêprecisadoresultadosomentenaqueledeterminadomomentoenãoprecisaformatarumrelatórioouguardarestesdadospormuitotempo.
DB2I PRYMARY OPTION MENU
Menu principal onde serámostrado as opçõesde navegação noDB2. Nestemenuasprincipaisopçõessão:1:Utilização do SPUFI,queéumutilitáriointerativodoDB22:DCLGEN, serve para gerarbook’s das bases dedadospara utilização emprogramas.D:Configurações do DB2,serveparaindicaroSSID,(Sub-SystemIdentification).
8/19/2019 Db2 Mainframes
4/12
DB2 para Mainframe DB2 para Mainframe
DB2 -TodosdireitosreservadosparaMainframeSchoolTreinamentosLtdaDB2 -TodosdireitosreservadosparaMainframeSchoolTreinamentosLtda
5 6
NomenuDB2I DEFAULTS PANEL 1,bastainformaronomeDSN1noparâmetroDB2NAMEparaconectarmosoDB2ativonozOS.
Para entrarmos nesteopçãoselecionamosa opção1nomenuanterior (DB2IPrimary Option Menu) e informando o arquivo particionado que conterá oscomandos SQL(Opção 1) e o arquivo particionado de saída do resultado daexecuçãodocomando(Opção4),asopções5,6,7,8,e9sãooscomandosqueserãoexecutadosacadasolicitaçãodeexecuçãodoSPUFI.
8/19/2019 Db2 Mainframes
5/12
DB2 para Mainframe DB2 para Mainframe
DB2 -TodosdireitosreservadosparaMainframeSchoolTreinamentosLtdaDB2 -TodosdireitosreservadosparaMainframeSchoolTreinamentosLtda
7 8
Criando uma tabela
1 1 2 2 2 3 3 4 4 4 5 5 6 6 6 7 7
1...5....1...2...6...0...4...0...2...6...0...4...0...2...6...0...4...0.2
CREATE TABLE MFS.TBALUNOS
MATRICULA DECIMAL (07) NOT NULL,
NOME CHAR (35) NOT NULL,
NASCIMENTO DATE,
IDADE INTEGER NOT NULL)
IN MSFBASE.MFSTABLE;
CREATE TABLE - Criaçãodatabela,estecomandorequerosparâmetros:MFS - Proprietário (OWNER) da tabela, pois somente o mesmo pode fazermanutençõesnatabela.TBALUNOS - Tabelaondeascolunasserãoinformadas.MATRICULA, NOME, NASCIMENTO e IDADE:Colunasdatabela,vejaabaixoosatributosdascolunas.NOT NULL - Coluna comconteúdoobrigatório, significa que deverá haver umconteúdonamesmaquandoforfeitaumainclusãodedados,naausênciadesteparâmetrooDB2assume“NULL”(Conteúdoopcional).
MFSTABLE -TABLESPACEqueconteráatabela.MFSBASE - DATABASEondeconteráaTABLESPACE.
Atributos das colunas
DECIMAL:Defineumacolunadeconteúdonumériconatabela,comousemcasasdecimais,idealparacálculos.SMALLINT:Defineumacolunadeconteúdonuméricocujoomaiorvalorparaarmazenamentoéde32768.INTEGER:Defineumacoluna deconteúdonuméricocujoo maior valor paraarmazenamentoéde65536.CHAR: Define uma coluna cujo conteúdo será um conjunto de caracteres
(string),nãosendoutilizadoparacálculosnuméricos.VARCHAR : Coluna para conjunto de caracteres que obterá um tamanhovariado,dependendodoconteúdoarmazenado.DATE: Coluna que conterá uma data no formato adequado ao DB2(‘AAAA-MM-DD’).
TIME:Colunaqueconteráhoranoformatode(‘HH:MM:SS’).TIMESTAMP:Dataehoramedidaemcentésimosdesegundo.
Excluindo uma tabela
1 1 2 2 2 3 3 4 4 4 5 5 6 6 6 7 7
1...5....1...2...6...0...4...0...2...6...0...4...0...2...6...0...4...0.2
DROP TABLE MFS.TBALUNOS;
DROP TABLE - Comandodedeleçãodatabela
Criando índice único em uma tabela
1 1 2 2 2 3 3 4 4 4 5 5 6 6 6 7 71...5....1...2...6...0...4...0...2...6...0...4...0...2...6...0...4...0.2
CREATE UNIQUE INDEX
MFS.TBALUNOS_I1 ON MFS.TBALUNOS
(MATRICULA ASC);
1 1 2 2 2 3 3 4 4 4 5 5 6 6 6 7 7
1...5....1...2...6...0...4...0...2...6...0...4...0...2...6...0...4...0.2
CREATE INDEX
MFS.TBALUNOS_I2 ON MFS.TBALUNOS
(NOME ASC);
Criando índice não único em uma tabela
CREATE UNIQUE INDEX - Comandode criaçãodeíndice,aclausulaUNIQUEindicaqueascolunasreferenciadasnocomandonãopoderãotervaloresiguaisdentrodamesmatabela.ASC - Indica que a ordenação do índice será ascendente (do menor paraomaior), tambémpodemos usar a clausulaDESC indica que a ordenação serádescendente(domaiorparaomenor).
CREATE INDEX - Comandodecriaçãodeíndice,aclausulaomissãodaclausulaUNIQUE indica que as colunasreferenciadas nocomando poderão ter valoresiguaisdentrodamesmatabela.
Excluindo um índice da tabela
1 1 2 2 2 3 3 4 4 4 5 5 6 6 6 7 7
1...5....1...2...6...0...4...0...2...6...0...4...0...2...6...0...4...0.2
DROP INDEX MFS.TBALUNOS_I1;
DROP INDEX - Comandodedeleçãodoíndicedatabela
8/19/2019 Db2 Mainframes
6/12
DB2 para Mainframe DB2 para Mainframe
DB2 -TodosdireitosreservadosparaMainframeSchoolTreinamentosLtdaDB2 -TodosdireitosreservadosparaMainframeSchoolTreinamentosLtda
9 10
Alterando atributos de uma tabela
1 1 2 2 2 3 3 4 4 4 5 5 6 6 6 7 7
1...5....1...2...6...0...4...0...2...6...0...4...0...2...6...0...4...0.2
ALTER TABLE MFS.TBALUNOS
ADD PRIMARY KEY(MATRICULA)
ALTER COLUMN IDADE SET DATA TYPE DECIMAL(3,0);
ALTER – Comandousadoparafazerasseguintesmanutençõesnatabela,
ADD PRIMARY KEY -CriaíndiceprimárioparaacolunaMATRICULA.ALTER COLUMN – Altera o atributoda coluna IDADE passando de INTEGER(originalmentedefinido)paraDECIMAL(3).
AcláusulaWHEREpoderáassumirosformatos:Comparações Simples
WHERE COLUNA ARGUMENTO
WHERE COLUNA > ARGUMENTO
WHERE COLUNA ARGUMENTO2OU
WHERE COLUNA = ARGUMENTO1
OR COLUNA2
8/19/2019 Db2 Mainframes
7/12
DB2 para Mainframe DB2 para Mainframe
DB2 -TodosdireitosreservadosparaMainframeSchoolTreinamentosLtdaDB2 -TodosdireitosreservadosparaMainframeSchoolTreinamentosLtda
11 12
Selecionando linhas de uma tabela entre valores específicos
1 1 2 2 2 3 3 4 4 4 5 5 6 6 6 7 7
1...5....1...2...6...0...4...0...2...6...0...4...0...2...6...0...4...0.2
SELECT NOME
FROM MFS.TBALUNOS
WHERE NOME BETWEEN 'ANTONIO' AND 'JOAO‘
ORDER BY NOME DESC;
BETWEEN-Clausulaparaobtercoluna(s)databelacujovaloresestãoentre asconstantesouáreadedados,tambémpodemosusaraclausulaNOTBETWEEN.
Selecionando linhas de uma tabela entre valores determinados
1 1 2 2 2 3 3 4 4 4 5 5 6 6 6 7 7
1...5....1...2...6...0...4...0...2...6...0...4...0...2...6...0...4...0.2
SELECT NOME
FROM MFS.TBALUNOS
WHERE NOME IN ('ANTONIO‘, ‘JOAO‘)
ORDER BY NOME;
IN :Usadoparaselecionarlinhascomváriosvaloresdeumadeterminadacoluna,a sintaxedo INé equivalenteao OR,podemosusar o parâmetroNOTIN queselecionará todas as linhas cujo o conteúdo seja diferente do argumento depesquisa.ORDER BY:AslinhasselecionadasserãoordenadaspelacolunaNOMEemordemascendenteodefaultdestaclausulaéascendente(ASC).ASC:Ordemascendente(domenorparaomaior)DESC:Ordemdesendente(domaiorparaomenor)
Selecionando linhas distintas de uma tabela
1 1 2 2 2 3 3 4 4 4 5 5 6 6 6 7 7
1...5....1...2...6...0...4...0...2...6...0...4...0...2...6...0...4...0.2
SELECT DISTINCT NOME FROM MFS.TBALUNOS;
DISTINCT - Selecionaapenasumalinhacujooconteúdosejarepetitivo,acolunacomconteúdorepetidosóapareçaumavez.
1 1 2 2 2 3 3 4 4 4 5 5 6 6 6 7 7
1...5....1...2...6...0...4...0...2...6...0...4...0...2...6...0...4...0.2
SELECT COUNT (*)
FROM MFS.TBALUNOS
WHERE NOME = 'ANA';
Contando linhas de uma tabela
COUNT - Conta quantas linhas existem em uma tabela que satisfaça a(s)
condição(ões)doWHERE.
1 1 2 2 2 3 3 4 4 4 5 5 6 6 6 7 7
1...5....1...2...6...0...4...0...2...6...0...4...0...2...6...0...4...0.2
SELECT COUNT (DISTINCT NOME)
FROM MFS.TBALUNOS;
Contando linhas distintamente de uma tabela
DISTINCT -SomentecontaráaslinhasqueacondiçãoWHEREnãoserepita.
1 1 2 2 2 3 3 4 4 4 5 5 6 6 6 7 7
1...5....1...2...6...0...4...0...2...6...0...4...0...2...6...0...4...0.2SELECT MIN (IDADE),
MAX (IDADE),
SUM (IDADE),
AVG (IDADE)
FROM MFS.TBALUNOS;
Selecionado o Menor, Maior, Somatória e Média aritmética de uma coluna
MIN - Menor idade
MAX - Maior idadeSUM - Somatória das idades
AVG - Média aritmética das idades
8/19/2019 Db2 Mainframes
8/12
DB2 para Mainframe DB2 para Mainframe
DB2 -TodosdireitosreservadosparaMainframeSchoolTreinamentosLtdaDB2 -TodosdireitosreservadosparaMainframeSchoolTreinamentosLtda
13 14
Juntando duas tabelas
1 1 2 2 2 3 3 4 4 4 5 5 6 6 6 7 7
1...5....1...2...6...0...4...0...2...6...0...4...0...2...6...0...4...0.2
SELECT T1.MATRICULA,T1.NOME,T2.CURSO,T2.VALOR
FROM MFS.TBALUNOS T1,
MFS.TBCURSOS T2
WHERE T1.MATRICULA = T2.MATRICULA;
Para juntarmos em uma pesquisa duas ou mais tabelas usamos o comandoSELECT/WHEREouONINNERJOIN,somenteserãoselecionadasaslinhasquetiveremcorrespondentesentreastabelaspelo(s)campo(s)dacláusulaWHERE.OsufixoT1eT2sãoosalias(apelidos)queastabelaspoderãoter,oaliaspode
assumirqualquervaloralfanumérico.
LEFT OUTER JOIN - Afunçãodestaclausulaparâmetroéjuntarastabelascujaa
matrículatenhacorrespondenteentreTBALUNOSeTBCURSOS,masdatabelaTBALUNOSvirãotodasaslinhasedatabelaTBCURSOSsomentevirãoaslinhasquetiveremcorrespondentesnatabelaTBALUNOS.As colunas com conteúdos “----------” são colunas nulas, no COBOLdevemosassinalarasvariáveisindicadorasparacadaumadelas.
1 1 2 2 2 3 3 4 4 4 5 5 6 6 6 7 7
1...5....1...2...6...0...4...0...2...6...0...4...0...2...6...0...4...0.2
SELECT T1.MATRICULA,T1.NOME,T2.CURSO,T2.VALOR
FROM MFS.TBALUNOS T1
INNER JOIN MFS.TBCURSOS T2
ON T1.MATRICULA = T2.MATRICULA;
Ou
1 1 2 2 2 3 3 4 4 4 5 5 6 6 6 7 7
1...5....1...2...6...0...4...0...2...6...0...4...0...2...6...0...4...0.2
SELECT T1.MATRICULA,T1.NOME,T2.CURSO,T2.VALOR
FROM MFS.TBALUNOS T1
LEFT OUTER JOIN MFS.TBCURSOS T2
ON T1.MATRICULA = T2.MATRICULA;
Juntando duas tabelas onde a 1ª tabela é a mandatória
1 1 2 2 2 3 3 4 4 4 5 5 6 6 6 7 7
1...5....1...2...6...0...4...0...2...6...0...4...0...2...6...0...4...0.2
SELECT T1.MATRICULA,T1.NOME,T2.CURSO,T2.VALOR
FROM MFS.TBALUNOS T1
RIGHT OUTER JOIN MFS.TBCURSOS T2
ON T1.MATRICULA = T2.MATRICULA;
Juntando duas tabelas onde a 2ª tabela é a mandatória
RIGHT OUTER JOIN - Afunçãodestaclausulaéjuntarastabelascujaamatriculatenha correspondente entre TBCURSOS e TBALUNOS, mas da tabelaTBCURSOSvirãotodasaslinhasedatabelaTBALUNOSsomentevirãoaslinhasquetiveremcorrespondentesnatabelaTBCURSOS.
1 1 2 2 2 3 3 4 4 4 5 5 6 6 6 7 7
1...5....1...2...6...0...4...0...2...6...0...4...0...2...6...0...4...0.2
SELECT T1.MATRICULA,T1.NOME,T2.CURSO,T2.VALOR
FROM MFS.TBALUNOS T1
FULL OUTER JOIN MFS.TBCURSOS T2
ON T1.MATRICULA = T2.MATRICULA;
Juntando duas tabelas onde a ambas tabelas são mandatórias
FULL OUTER JOIN - A função deste parâmetro é juntar as tabelas cuja amatrícula tenha correspondente entre as tabelas TBALUNOS eTBCURSOS , mas as matrículas da tabela TBCURSOS que não tenhamcorrespondentenatabelaTBALUNOSserãolistadas comascolunas comconteúdosnulos.
1 1 2 2 2 3 3 4 4 4 5 5 6 6 6 7 7
1...5....1...2...6...0...4...0...2...6...0...4...0...2...6...0...4...0.2
SELECT DESCRICAO, VALOR
FROM MFS.TBCURSOS
WHERE DESCRICAO LIKE 'C%‘;
Pesquisando tabela por parte de uma coluna - LIKE
LIKE - TemafinalidadedepesquisartodososnomesdatabelaTBCURSOS cujo nome inicie com “ ”, podem também assumir asseguintesformas:NOT LIKE ‘ ’ -TodososnomesqueNÃOcomecemcomJOLIKE
“_
_SE
”-Todosnomesquena3a.e 4a.posiçãosejaSENOT LIKE “_ _SE ”-Todosnomesquena3a.e 4a.posiçãoNÃOsejaSE
8/19/2019 Db2 Mainframes
9/12
DB2 para Mainframe DB2 para Mainframe
DB2 -TodosdireitosreservadosparaMainframeSchoolTreinamentosLtdaDB2 -TodosdireitosreservadosparaMainframeSchoolTreinamentosLtda
15 16
Pesquisando tabela por parte de uma coluna - SUBSTR
1 1 2 2 2 3 3 4 4 4 5 5 6 6 6 7 7
1...5....1...2...6...0...4...0...2...6...0...4...0...2...6...0...4...0.2
SELECT DESCRICAO, VALOR
FROM MFS.TBCURSOS
WHERE SUBSTR (DESCRICAO,1,2) = 'CI';
SUBSTR - Indicaquecampo serápesquisadoporumapartedo textoqueserá
informadonacláusulaWHERE.Nota
Noexemploacimaserãoselecionadasaslinhascujaasduasprimeirasposiçõesdocampodescriçãoforiguala “CI”.
Conceito de Variáveis HOST
São variáveis definidas conforme a linguagem usada, e nas instruções SQL,
essas variáveis devem ser compatíveis com os atributos das colunas definidas
na tabela a qual elas fazem referências.
Campos Numéricos
DB2 COBOL PL1VAR SMALLINT 01 VAR PIC S9(04) COMP. DCL VAR BIN FIXED(15)
VAR INTEGER 01 VAR PIC S9(09) COMP. DCL VAR BIN FIXED(31)
VAR FLOAT(21) 01 VAR COMP-1. DCL VAR BIN
VAR FLOAT(53) 01 VAR COMP-2. DCL VAR BIN FLOAT(53)
VAR DECIMAL(03) 01 VAR PIC S9(03)V COMP-3. DCL VAR DEC FIXED(03)
VAR DECIMAL(3,2) 01 VAR PIC S9(01)V99 COMP-3. DCL VAR DECFIXED (3,2)
Campos Alfanuméricos
DB2 COBOL PL1VAR CHAR (20) 01 VAR PIC X(20) DCL VAR CHAR (20)
VAR VARCHAR(20) 01 VAR. DCL VAR CHAR (20) VAR
05 VAR-LEN PIC S9(04) COMP.
05 VAR-TEXT PIC X(20).
Campos Data / Hora / Timestamp
DB2 COBOL PL1VAR DATE 01 VAR PIC X(10). DCL VAR CHAR(10)
VAR TIME 01 VAR PIC X(08). DCL VAR CHAR (08)
VAR TIMESTAMP 01 VAR PIC X(26). DCL VAR CHAR (26)
OBS - VAR,simbolizaonomedascolunasnatabelaquefuturamenteserãoutilizadascomovariáveisqueserãoutilizadasnosprogramas
SPUFI x COBOL
COBOL
*---------------------------------------*
WORKING-STORAGE SECTION.
*---------------------------------------*
* DECLARACOES DAS VARIAVEIS DE AMBIENTE *
*---------------------------------------*
EXEC SQL
INLUDE SQLCA
END-EXEC.
*---------------------------------------*
* DECLARACOES DA TABELA – TBALUNOS *
*---------------------------------------*
EXEC SQL
INCLUDE TBALUNOS
END-EXEC
INCLUDE
SPUFI
Não tem
OincludenoCOBOLnãoobtémosdadosdatabelaemquestãoesimtrazparaaworkdoprogramaaestruturadatabela(colunas,atributos).
COBOL
*---------------------------------------*
PROCEDURE DIVISION.
*---------------------------------------*
MOVE 10 TO MATRICULA
MOVE ‘JOSE’ TO NOME
MOVE ‘1988-05-15’ TO NASCIMENTO
EXEC SQL
INSERT INTO MFS.TBALUNOS
(MATRICULA,
NOME,
NASCIMENTO)
VALUES (:MATRICULA,
:NOME,:NASCIMENTO)
END-EXEC
INSERT
SPUFI
INSERT INTO MFS.TBALUNOS
(MATRICULA,
NOME,
NASCIMENTO)
VALUES (10,
’ JOSE’ ,
’ 1988-05-15’ );
NotequenoCOBOLasasvariáveisHOSTsãoalimentadasantesdainclusãonatabelaenacláusulaVALUESessasvariáveisestãoprecedidaspelos “:”
8/19/2019 Db2 Mainframes
10/12
DB2 para Mainframe DB2 para Mainframe
DB2 -TodosdireitosreservadosparaMainframeSchoolTreinamentosLtdaDB2 -TodosdireitosreservadosparaMainframeSchoolTreinamentosLtda
17 18
SPUFI x COBOL
COBOL
MOVE 10 TO MATRICULA
EXEC SQL SELECT MATRICULA,
NOME,
NASCIMENTO
INTO :MATRICULA,
:NOME,:NASCIMENTO
FROM MFS.TBALUNOS
WHERE MATRICULA = :MATRICULA
END-EXEC.
SELECT
–
Acesso direto
SPUFI
SELECT MATRICULA,
NOME,
NASCIMENTO
FROM MFS.TBALUNOS
WHERE MATRICULA = 10;
Para fazer umacesso indexado (por uma determinadachave)em uma tabelabastaalimentaravariávelHOSTquerepresentaoíndiceecompará-lonacláusulaWHERE.
SPUFI x COBOL
COBOL
*---------------------------------------*
PROCEDURE DIVISION.
*---------------------------------------*
MOVE 10 TO MATRICULA
MOVE ‘JOAO’ TO NOME
MOVE ‘1980-02-10’ TO NASCIMENTO
EXEC SQL
UPDATE MFS.TBALUNOS
SET NOME = :NOME,
NASCIMENTO = :NASCIMENTO
WHERE MATRICULA = :MATRICULA
END-EXEC
UPDATE
SPUFI
UPDATE MFS.TBALUNOS
SET NOME = ‘JOAO’,
NASCIMENTO = ‘1980-02-10’
WHERE MATRICULA = 10;
No comando UPDATE também alimentamos as variáveis HOST antes daalteração.
COBOL*---------------------------------------*
PROCEDURE DIVISION.
*---------------------------------------*
MOVE 10 TO MATRICULA
EXEC SQL DELETE
FROM MFS.TBALUNOS
WHERE MATRICULA = :MATRICULA
END-EXEC
DELETE
SPUFIDELETE FROM MFS.TBALUNOS
WHERE MATRICULA = 10;
Para fazer umacesso indexado (por uma determinada chave) emuma tabela,bastaalimentaravariávelHOSTquerepresentaoíndiceecompará-lonacláusulaWHERE.
8/19/2019 Db2 Mainframes
11/12
DB2 para Mainframe DB2 para Mainframe
DB2 -TodosdireitosreservadosparaMainframeSchoolTreinamentosLtdaDB2 -TodosdireitosreservadosparaMainframeSchoolTreinamentosLtda
19 20
SPUFI x COBOL
COBOL
EXEC SQL DECLARE CURSOR01
CURSOR FOR SELECT
T1.MATRICULA,
T1.NOME,
T2.CURSO,
T2.VALOR
FROM MFS.TBALUNOSS T1,
MFS.TBCURSOS T2
WHERE T1.MATRICULA =
T2.MATRICULA
END-EXEC.
*--------------------------------------*
PROCEDURE DIVISION.
*--------------------------------------*
* ABRINDO O CURSOR *
*--------------------------------------*
EXEC SQL
OPEN CURSOR01
END-EXEC.
*--------------------------------------** LENDO O CURSOR
*--------------------------------------*
EXEC SQL
FETCH CURSOR01
INTO :MATRICULA,
:NOME :VI-NOME,
:DESCRICAO :VI-DESC,
:VALOR :VI-VALOR
END-EXEC.
*--------------------------------------*
* FECHANDO O CURSOR
*--------------------------------------*
EXEC SQL
CLOSE CURSOR01END-EXEC.
JOIN – Acesso relacional
SPUFI
SELECT
T1.MATRICULA,
T1.NOME,
T2.CURSO,
T2.VALOR
FROM MFS.TBALUNOS T1,
MFS.TBCURSOS T2
WHERE T1.MATRICULA =
T2.MATRICULA;
Para fazer um acesso entretabelasJOIN,devemoscriarumCURSOR, que acesse as 2tabelas com isso estaremosinformando ao DB2 que linhasde conteúdo da tabela,retornarãoaoprograma.
OBS - Na definição do cursorpara o JOIN, criamos asvariáveiscomoprefixo“VI”,elasindicam se a tabela possuicolunasnulas.Umacolunanulaé uma coluna que não possuiconteúdo, as variáveis “VI” sãodefinidas na WORKING comouma HALF-WORD binária(S9(04) COMP), se seu valorapósocomandoseretornar-1avariávelemquestãoseránula. Para fazerumacesso sequencialemuma tabela, devemoscriarumCURSOR,
comissoestaremosinformandoaoDB2queváriaslinhasdeconteúdodatabela,retornarãoaoprograma.OBS - A instrução de definição do CURSOR deve ser feita na WORKING-STORAGE SECTION do COBOL, já o comando de abertura (OPEN), leitura(FETCH)efechamento(CLOSE)databela,devemserfeitosemrotinasdiferentesdoprograma,localizadasnaPROCEDUREDIVISION.
SPUFI x COBOL
COBOL
*---------------------------------------*
WORKING-STORAGE SECTION.
*---------------------------------------*
* DECLARANDO O CURSOR
*---------------------------------------*
EXEC SQL DECLARE CURSOR01
CURSOR FOR
SELECT MATRICULA,
NOME,
NASCIMENTO
FROM MFS.TBALUNOS
ORDER BY MATRICULA
END-EXEC.
*---------------------------------------*
PROCEDURE DIVISION.
*---------------------------------------*
* ABRINDO O CURSOR *
*---------------------------------------*
EXEC SQL
OPEN CURSOR01END-EXEC.
*---------------------------------------*
* LENDO O CURSOR
*---------------------------------------*
EXEC SQL FETCH CURSOR01
INTO :MATRICULA,
:NOME,
:NASCIMENTO
END-EXEC.
*---------------------------------------*
* FECHANDO O CURSOR
*---------------------------------------*
EXEC SQL CLOSE CURSOR01 END-EXEC.
SELECT – Acesso sequencial
SPUFI
SELECT MATRICULA, NOME,
NASCIMENTO
FROM MFS.TBALUNOS;
8/19/2019 Db2 Mainframes
12/12
DB2 para Mainframe DB2 para Mainframe
DB2 -TodosdireitosreservadosparaMainframeSchoolTreinamentosLtdaDB2 -TodosdireitosreservadosparaMainframeSchoolTreinamentosLtda
21 21
SQLCODE – Principais códigos de retorno do acesso ao DB2
Os códigosderetornodo DB2são informadosna variávelSQLCODE,vejaabaixoalgunsvaloresmaisusuais:
CÓD. DESCRIÇÃO+100 Rownotfoundorendofcursor-102 Stringconstantistoolong-117 Thenumber of values youare tryingto INSERT does not matchthe
number ofcolumns-180 Bad data in Date/Time/Timestamp String representation of DATE, TIME,TIMESTAMPisinvalid-181 Bad data in Date/Time/Timestamp Value for DATE, TIME, TIMESTAMPis invalid-199 Illegaluseofthespecifiedkeyword.-204 ObjectnotdefinedtoDB2-205 Columnnamenotinspecifiedtable-206 ColumndoesnotexistinanytableintheSELECT-224 FETCHcannotmakeanINSENSITIVEcursorSENSITIVE-229 ThelocalespecifiedinaSETLOCALEstatementwasnotfound.
+231 FETCHbutyoudidaBEFOREorAFTERandyouarenotonavalidrow+304 Value cannot be assigned to this host variable because it is out of range-305 Nullindicatorneeded-311 Varchar,insertorupdate.Youdidn’tsetthe-LENfieldwiththerightdata length-501 CursornotopenonFETCH-502 Openingcursorthatisalreadyopen-503 UpdatingcolumnwhichneedstobespecifiedinFORUPDATEOF-530 ReferentialintegritypreventstheINSERT/UPDATE-545 CheckconstraintpreventstheINSERT/UPDATE-803 Duplicatekeyoninsertorupdate
-805 DBRMorpackagenotfoundinplanIsplannamecorrect?-811 MorethanonerowretrievedinSELECTINTO-818 Planandprogram:timestampmismatch-911 Deadlockortimeout.Rollbackhasbeendone.913Yourprogramwasthevictimofadeadlockortimeout.NOrollbackhasbeendone.YoushoulddoaROLLBACK.-922 Authorizationneeded-927 Thelanguageinterfacewascalledbutnoconnectionhadbeen.