Translate

Mostrar mensagens com a etiqueta REBIND. Mostrar todas as mensagens
Mostrar mensagens com a etiqueta REBIND. Mostrar todas as mensagens

quinta-feira, 23 de junho de 2022

DB2I sem Mistérios: o Portal Clássico que Leva o Programador COBOL Padawan do Primeiro SELECT ao BIND de Produção

 

Bellacosa Mainframe apresenta o db2i

☕ Um Café no Bellacosa Mainframe

DB2I sem Mistérios: o Portal Clássico que Leva o Programador COBOL Padawan do Primeiro SELECT ao BIND de Produção

Imagine a seguinte cena.

Você acabou de entrar no TSO. A tela preta surgiu diante de seus olhos como a entrada de uma antiga fortaleza digital. Depois de informar seu usuário, sua senha e atravessar os corredores do ISPF, você finalmente executa o comando que abre uma das áreas mais tradicionais do universo IBM Z.

Na tela aparece:

DB2I PRIMARY OPTION MENU

No canto superior direito:

SSID: DB9G

E logo abaixo, um conjunto de opções aparentemente simples:

1  SPUFI
2  DCLGEN
3  PROGRAM PREPARATION
4  PRECOMPILE
5  BIND/REBIND/FREE
6  RUN
7  DB2 COMMANDS
8  UTILITIES
D  DB2I DEFAULTS
X  EXIT

Para um iniciante, isso pode parecer apenas mais um menu antigo em modo texto.

Mas não se engane, jovem padawan.

Essa tela é uma verdadeira central de comando para o desenvolvimento de aplicações COBOL com Db2 no mainframe. Ela reúne, em um único lugar, grande parte da jornada que transforma uma instrução SQL escrita dentro de um programa COBOL em uma operação real, autorizada, otimizada e executada contra um banco de dados corporativo.

Estamos diante do DB2I, sigla para Db2 Interactive.

Ele é um dos portais clássicos do desenvolvimento no IBM Z.

Neste café, vamos atravessar cada porta desse menu, entender sua história, observar como ele funciona, descobrir o que acontece nos bastidores e acompanhar, passo a passo, o nascimento de um programa COBOL com SQL embutido.

Prepare sua caneca.

O Db2 está acordado.


Bellacosa Mainframe e o db2i no emulador 3270

1. O que é o DB2I?

O DB2I é uma interface interativa integrada ao ISPF que permite acessar diversas funções relacionadas ao Db2 for z/OS.

Ele não é o banco de dados propriamente dito.

Também não é o compilador COBOL.

Ele funciona como um grande painel de controle que organiza diferentes ferramentas, processos e utilitários do ecossistema Db2.

Por meio dele, o usuário pode:

  • executar comandos SQL;

  • gerar declarações de tabelas;

  • preparar programas para execução;

  • realizar precompile;

  • executar BIND e REBIND;

  • rodar programas;

  • emitir comandos administrativos;

  • executar utilitários;

  • configurar parâmetros pessoais.

Sua grande virtude é a integração.

Em vez de o programador precisar decorar vários comandos, jobs e programas utilitários, o DB2I apresenta painéis que solicitam os parâmetros necessários e, em muitos casos, gera ou submete o JCL correspondente.

É importante entender que o DB2I não eliminou o JCL.

Ele apenas oferece uma interface mais amigável para preparar ou executar processos que, por baixo da superfície, continuam dependendo de datasets, procedimentos catalogados, módulos de carga, bibliotecas, parâmetros, planos e packages.

O DB2I é, portanto, uma espécie de ponte entre o usuário e a complexidade da infraestrutura.


2. Em que ambiente estamos trabalhando?

A tela mostrada é acessada por meio de um emulador TN3270.

A arquitetura normalmente segue este caminho:

Computador do usuário
        |
        v
Emulador TN3270
        |
        v
TSO/E
        |
        v
ISPF
        |
        v
DB2I
        |
        v
Subsistema Db2

Cada camada possui uma função.

O TN3270 permite que o computador moderno se comporte como um terminal IBM 3270.

O TSO/E oferece a sessão interativa no z/OS.

O ISPF fornece os painéis, menus, editores e serviços de produtividade.

O DB2I organiza as funções relacionadas ao Db2.

Finalmente, o subsistema Db2 executa o trabalho real de gerenciamento de dados, SQL, locks, buffer pools, logs, recuperação, autorização e otimização.

O programador enxerga uma tela.

O sistema enxerga uma cadeia inteira de componentes.


3. O significado de SSID

No canto superior direito aparece:

SSID: DB9G

SSID significa:

Subsystem Identifier

É o identificador do subsistema Db2 ao qual a sessão está associada.

Em um mesmo ambiente z/OS podem existir vários subsistemas Db2.

Por exemplo:

DB2D = desenvolvimento
DB2T = testes
DB2H = homologação
DB2P = produção

Também podem existir subsistemas diferentes por aplicação, unidade de negócio, versão, data sharing group ou finalidade técnica.

O nome não precisa obrigatoriamente indicar o ambiente. Cada empresa define sua convenção.

O ponto essencial é este:

Sempre confirme em qual SSID você está trabalhando antes de executar comandos.

Essa é uma regra de ouro.

Um SELECT executado no ambiente errado pode causar apenas confusão.

Um DELETE executado no ambiente errado pode causar uma reunião de emergência com vinte pessoas, três gerentes, dois DBAs e um café que já perdeu a temperatura.


4. Opção 1 — SPUFI

A primeira opção é:

1 SPUFI

SPUFI significa:

SQL Processor Using File Input

Em muitas documentações antigas, também é descrito como uma interface para processar SQL armazenado em um dataset de entrada.

Na prática, ele permite escrever instruções SQL em um arquivo, executá-las e armazenar os resultados em outro arquivo.

É uma das ferramentas mais tradicionais do Db2 for z/OS.


4.1 Como o SPUFI funciona?

O fluxo básico é:

Dataset de entrada
       |
       v
Instruções SQL
       |
       v
SPUFI
       |
       v
Db2
       |
       v
Dataset de saída

O usuário informa:

  • o dataset que contém o SQL;

  • o dataset em que deseja receber o resultado;

  • parâmetros de execução;

  • formato da saída;

  • número máximo de linhas;

  • opções de commit;

  • isolamento.

Um exemplo de dataset de entrada:

SELECT EMPNO,
       FIRSTNME,
       LASTNAME,
       SALARY
FROM DSN8C10.EMP
ORDER BY LASTNAME;

O SPUFI envia a instrução ao Db2 e grava a resposta no dataset de saída.


4.2 Primeiro passo a passo com SPUFI

Suponha que você queira consultar uma tabela chamada CLIENTE.

Entre na opção 1.

Informe um dataset de entrada, por exemplo:

VAGNER.SQL.CONSULTA

Caso o dataset não exista, o DB2I poderá permitir sua alocação, dependendo das configurações.

No editor ISPF, escreva:

SELECT ID_CLIENTE,
       NOME_CLIENTE,
       LIMITE_CREDITO
FROM APP.CLIENTE
FETCH FIRST 20 ROWS ONLY;

Salve o membro ou dataset.

Retorne ao painel do SPUFI.

Informe o dataset de saída:

VAGNER.SQL.RESULTADO

Execute.

Depois, abra o resultado.

Você poderá ver algo semelhante a:

---------+---------+---------+---------+
ID_CLIENTE NOME_CLIENTE          LIMITE_CREDITO
---------+---------+---------+---------+
000001     ANA SILVA                    5000.00
000002     JOAO SOUZA                   3500.00
000003     MARIA COSTA                  8000.00
DSNE610I NUMBER OF ROWS DISPLAYED IS 3
DSNE616I STATEMENT EXECUTION WAS SUCCESSFUL

O formato real varia conforme parâmetros, versão e configuração do ambiente.


4.3 Cuidados com SPUFI

O SPUFI não é apenas uma ferramenta de consulta.

Ele também pode executar:

INSERT
UPDATE
DELETE
CREATE
ALTER
DROP
GRANT
REVOKE

Portanto, trate-o com respeito.

Antes de executar:

DELETE FROM APP.CLIENTE;

verifique se faltou uma cláusula WHERE.

Uma pequena ausência pode transformar uma manutenção de um registro em uma limpeza completa da tabela.

Uma boa prática é primeiro executar:

SELECT COUNT(*)
FROM APP.CLIENTE
WHERE STATUS = 'I';

Depois:

SELECT *
FROM APP.CLIENTE
WHERE STATUS = 'I'
FETCH FIRST 50 ROWS ONLY;

Somente após validar os dados, executar:

DELETE FROM APP.CLIENTE
WHERE STATUS = 'I';

O padawan prudente consulta antes de alterar.


5. Opção 2 — DCLGEN

A segunda opção é:

2 DCLGEN

DCLGEN significa:

Declarations Generator

Sua finalidade é gerar declarações de tabela e estruturas de host variables para linguagens como COBOL.

Suponha que exista a tabela:

CREATE TABLE APP.CLIENTE
(
    ID_CLIENTE      INTEGER       NOT NULL,
    NOME_CLIENTE    VARCHAR(80)   NOT NULL,
    LIMITE_CREDITO  DECIMAL(11,2),
    DATA_CADASTRO   DATE,
    STATUS          CHAR(1)
);

O programa COBOL precisa conhecer a estrutura dos campos que serão usados nas instruções SQL.

O DCLGEN pode gerar algo semelhante a:

       EXEC SQL DECLARE APP.CLIENTE TABLE
       ( ID_CLIENTE      INTEGER NOT NULL,
         NOME_CLIENTE    VARCHAR(80) NOT NULL,
         LIMITE_CREDITO  DECIMAL(11,2),
         DATA_CADASTRO   DATE,
         STATUS          CHAR(1)
       ) END-EXEC.

Também gera a estrutura COBOL:

       01  DCLCLIENTE.
           10  ID-CLIENTE          PIC S9(9) COMP.
           10  NOME-CLIENTE.
               49 NOME-CLIENTE-LEN PIC S9(4) COMP.
               49 NOME-CLIENTE-TEXT PIC X(80).
           10  LIMITE-CREDITO      PIC S9(9)V99 COMP-3.
           10  DATA-CADASTRO       PIC X(10).
           10  STATUS-CLIENTE      PIC X(1).

Os nomes e formatos podem variar de acordo com as opções escolhidas.


5.1 Por que o DCLGEN é tão importante?

Sem ele, o programador teria que converter manualmente cada tipo SQL em um formato COBOL.

Exemplos:

INTEGER       -> PIC S9(9) COMP
SMALLINT      -> PIC S9(4) COMP
DECIMAL(9,2)  -> PIC S9(7)V99 COMP-3
CHAR(10)      -> PIC X(10)
DATE          -> PIC X(10)
VARCHAR       -> campo de tamanho + texto

Essa conversão manual pode gerar erros.

Um campo definido incorretamente pode resultar em:

  • truncamento;

  • dados corrompidos;

  • SQLCODE negativo;

  • valores numéricos inválidos;

  • ABEND S0C7;

  • comportamento imprevisível.

O DCLGEN reduz essa possibilidade.


5.2 DCLGEN não substitui governança

Há um detalhe importante.

Gerar o DCLGEN é apenas o começo.

A empresa precisa controlar:

  • onde o copybook será armazenado;

  • qual versão está em produção;

  • quais programas usam aquela estrutura;

  • o que acontece quando a tabela muda;

  • se os programas precisam ser recompilados;

  • se o BIND precisa ser renovado.

Em ambientes maduros, alterações de tabela seguem processos rigorosos.

Não basta alterar uma coluna e esperar que todos os programas se adaptem magicamente.

No mainframe, magia sem controle costuma receber outro nome: incidente.


6. Opção 3 — Program Preparation

A opção 3 é:

3 PROGRAM PREPARATION

Ela reúne etapas necessárias para preparar uma aplicação Db2 para execução.

Um programa COBOL com SQL embutido precisa passar por várias fases:

Fonte COBOL com EXEC SQL
          |
          v
Precompile
          |
          +----> DBRM
          |
          v
Fonte COBOL transformado
          |
          v
Compilação
          |
          v
Objeto
          |
          v
Link-edit
          |
          v
Load module
          |
          v
BIND
          |
          v
Package ou plan

A opção Program Preparation tenta coordenar essas etapas.

É excelente para laboratórios, ambientes educacionais e processos padronizados.

Em grandes empresas, porém, muitas dessas fases são executadas por pipelines, ferramentas de change management ou JCLs corporativos.

Entre as ferramentas modernas ou tradicionais podem aparecer:

  • Endevor;

  • ISPW;

  • Changeman;

  • DBB;

  • Jenkins;

  • GitLab;

  • GitHub Actions;

  • IBM Developer for z/OS;

  • zBuilder.

Mesmo assim, o conceito permanece exatamente o mesmo.


7. Opção 4 — Precompile

A opção 4 chama o precompiler do Db2.

Essa é uma das etapas mais fascinantes.

O compilador COBOL não compreende diretamente uma instrução como:

       EXEC SQL
           SELECT NOME_CLIENTE,
                  LIMITE_CREDITO
             INTO :WS-NOME,
                  :WS-LIMITE
             FROM APP.CLIENTE
            WHERE ID_CLIENTE = :WS-ID
       END-EXEC.

O SQL embutido precisa ser tratado antes da compilação COBOL.

O precompiler percorre o fonte e identifica blocos entre:

EXEC SQL

e:

END-EXEC

Ele separa as instruções SQL e gera dois resultados principais:

  1. Um fonte COBOL modificado.

  2. Um DBRM.


7.1 O que é o DBRM?

DBRM significa:

Database Request Module

Ele contém representações das instruções SQL extraídas do programa.

O DBRM não é o executável.

Ele também não é uma tabela.

Ele é um artefato intermediário utilizado posteriormente no BIND.

Pense nele como um dossiê contendo os pedidos de acesso ao banco feitos pelo programa.

Exemplo conceitual:

Programa: PGMCAD01

SQL 1:
SELECT NOME_CLIENTE
FROM APP.CLIENTE
WHERE ID_CLIENTE = ?

SQL 2:
UPDATE APP.CLIENTE
SET STATUS = ?
WHERE ID_CLIENTE = ?

Esse conjunto de solicitações será analisado pelo Db2 durante o BIND.


7.2 O que acontece com o fonte COBOL?

O SQL é substituído ou acompanhado por chamadas apropriadas à interface do Db2.

O fonte resultante pode conter referências a módulos e estruturas necessárias para a comunicação com o banco.

Depois disso, o compilador COBOL consegue processar o programa.

O fluxo é:

COBOL + SQL
    |
    v
Precompiler Db2
    |
    +----> DBRM
    |
    v
COBOL sem SQL nativo
    |
    v
Compiler

8. SQLCA: o mensageiro do Db2

Quase todo programa COBOL com Db2 possui:

       EXEC SQL
           INCLUDE SQLCA
       END-EXEC.

SQLCA significa:

SQL Communication Area

É uma estrutura usada para receber informações sobre a execução da instrução SQL.

O campo mais famoso é:

SQLCODE

Exemplos:

SQLCODE = 0      sucesso
SQLCODE = 100    nenhuma linha encontrada
SQLCODE = -811   mais de uma linha retornada
SQLCODE = -904   recurso indisponível
SQLCODE = -911   deadlock ou timeout com rollback
SQLCODE = -913   deadlock ou timeout
SQLCODE = -805   package não encontrado
SQLCODE = -818   timestamp inconsistente

Um programa sério deve testar o SQLCODE após cada operação relevante.

Exemplo:

       EXEC SQL
           SELECT NOME_CLIENTE
             INTO :WS-NOME
             FROM APP.CLIENTE
            WHERE ID_CLIENTE = :WS-ID
       END-EXEC.

       EVALUATE SQLCODE
           WHEN 0
               DISPLAY 'CLIENTE ENCONTRADO: ' WS-NOME
           WHEN 100
               DISPLAY 'CLIENTE NAO ENCONTRADO'
           WHEN OTHER
               DISPLAY 'ERRO SQLCODE: ' SQLCODE
       END-EVALUATE.

Ignorar o SQLCODE é como pilotar uma nave sem olhar o painel.

Talvez ela continue voando.

Talvez o motor já esteja em chamas.


9. Opção 5 — BIND, REBIND e FREE

A opção 5 é uma das mais importantes do menu:

5 BIND/REBIND/FREE

Esses três comandos controlam packages e plans.


10. O que é BIND?

O BIND pega o DBRM e cria uma estrutura executável pelo Db2, geralmente um package.

Durante o BIND, o Db2:

  • valida as instruções SQL;

  • verifica objetos referenciados;

  • avalia autorizações;

  • analisa estatísticas;

  • escolhe caminhos de acesso;

  • registra dependências;

  • cria o package;

  • armazena informações no catálogo.

O otimizador decide como acessar os dados.

Ele pode escolher:

  • table space scan;

  • index scan;

  • index-only access;

  • nested loop join;

  • merge scan join;

  • hybrid join;

  • acesso por particionamento;

  • paralelismo.

Duas instruções SQL textualmente iguais podem receber caminhos de acesso diferentes dependendo de:

  • índices;

  • cardinalidade;

  • distribuição de dados;

  • estatísticas;

  • parâmetros de BIND;

  • versão do Db2;

  • nível de função;

  • configuração do subsistema.


10.1 Package e plan

Um package contém a forma preparada das instruções SQL de um programa ou unidade lógica.

Um plan organiza a execução e pode referenciar collections e packages.

No modelo moderno, é comum trabalhar principalmente com packages.

Fluxo simplificado:

Programa COBOL
      |
      v
Package
      |
      v
Collection
      |
      v
Plan
      |
      v
Db2

Nem todas as empresas usam exatamente a mesma convenção, mas o conceito geral permanece.


11. O que é REBIND?

O REBIND recria o package ou plan sem precisar gerar um novo DBRM.

Ele é útil quando:

  • estatísticas foram atualizadas;

  • índices foram criados;

  • índices foram removidos;

  • o volume de dados mudou;

  • houve alteração de parâmetros;

  • o Db2 foi atualizado;

  • deseja-se obter um novo access path.

Exemplo clássico:

RUNSTATS
   |
   v
Novas estatísticas
   |
   v
REBIND
   |
   v
Novo caminho de acesso

O programa COBOL pode permanecer o mesmo.

O executável pode permanecer o mesmo.

Mas o Db2 pode escolher uma estratégia diferente para acessar os dados.

Esse desacoplamento é uma das maiores forças da arquitetura Db2.


12. O que é FREE?

FREE remove packages ou plans do catálogo.

É uma operação poderosa e potencialmente perigosa.

Se você remover um package necessário, o programa poderá falhar com erro semelhante ao:

SQLCODE -805

Esse erro normalmente indica que o package esperado não foi encontrado, não está disponível na collection correta ou não corresponde ao que o programa está tentando usar.

Nunca execute FREE por curiosidade em ambiente corporativo.

Curiosidade é excelente para estudar.

Em produção, curiosidade sem mudança aprovada pode virar RCA.


13. Opção 6 — RUN

A opção 6 permite executar um programa SQL.

Dependendo da instalação, o painel solicita:

  • nome do programa;

  • plan;

  • parâmetros;

  • bibliotecas de carga;

  • datasets;

  • ambiente;

  • opções de execução.

Essa função é bastante útil para testes.

Em ambientes reais, programas batch normalmente são executados por JCL.

Um exemplo conceitual:

//RUNDB2   JOB ...
//STEP01   EXEC PGM=IKJEFT01
//STEPLIB  DD DISP=SHR,DSN=APP.LOADLIB
//SYSTSPRT DD SYSOUT=*
//SYSPRINT DD SYSOUT=*
//SYSTSIN  DD *
  DSN SYSTEM(DB9G)
  RUN PROGRAM(PGMCAD01) PLAN(PLANAPP) -
      LIB('APP.LOADLIB')
  END
/*

O exemplo exato varia conforme o ambiente.

O programa pode também ser executado em:

  • CICS;

  • IMS;

  • stored procedure;

  • WLM;

  • batch;

  • TSO;

  • z/OS Unix;

  • aplicações distribuídas.


14. Opção 7 — Db2 Commands

A opção 7 permite emitir comandos administrativos do Db2.

Exemplos:

-DISPLAY DATABASE
-DISPLAY THREAD
-DISPLAY UTILITY
-DISPLAY BUFFERPOOL
-START DATABASE
-STOP DATABASE
-RECOVER INDOUBT

Esses comandos não são SQL.

Eles são comandos do subsistema Db2.

Por exemplo:

-DISPLAY DATABASE(APPDB)

Pode mostrar o estado dos objetos relacionados ao banco.

Outro exemplo:

-DISPLAY THREAD(*)

Pode exibir threads conectadas.

Essas funções geralmente são controladas por autorização.

Um programador comum talvez possa executar alguns comandos de consulta, mas não terá autoridade para iniciar, parar ou alterar recursos críticos.

E isso é saudável.

Segurança não é um obstáculo.

É o cinto de segurança da operação.


15. Opção 8 — Utilities

Os utilitários do Db2 são responsáveis por diversas tarefas essenciais de manutenção.

Entre os principais:

LOAD
UNLOAD
REORG
RUNSTATS
COPY
RECOVER
CHECK DATA
CHECK INDEX
REBUILD INDEX
QUIESCE
MODIFY RECOVERY

15.1 RUNSTATS

Coleta estatísticas sobre:

  • quantidade de linhas;

  • cardinalidade;

  • distribuição;

  • frequência;

  • índices;

  • colunas;

  • partições.

O otimizador usa essas informações para escolher access paths.

Estatística desatualizada pode levar a decisões ruins.

É como usar um mapa de uma cidade de 1995 para dirigir em 2026.

Algumas ruas ainda existem.

Outras viraram avenidas, túneis, condomínios e rotatórias criadas por alguém que parecia gostar muito de rotatórias.


15.2 REORG

Reorganiza os dados fisicamente.

Pode ajudar a:

  • reduzir fragmentação;

  • recuperar espaço;

  • melhorar clustering;

  • restaurar organização física;

  • tratar estados pendentes;

  • melhorar acesso.


15.3 COPY

Cria cópias de imagem para recuperação.

Sem cópias adequadas, uma falha pode se tornar uma tragédia operacional.


15.4 RECOVER

Restaura objetos após falhas ou perda de dados.

Pode utilizar:

  • image copies;

  • logs;

  • pontos de recuperação;

  • informações do catálogo.


15.5 LOAD

Carrega grandes volumes de dados com eficiência.

É muito mais apropriado para cargas massivas do que executar milhões de INSERTs individuais.


16. Opção D — DB2I Defaults

A opção D permite configurar padrões utilizados pelo DB2I.

Podem existir parâmetros para:

  • nomes de datasets;

  • classes de job;

  • opções de saída;

  • SQL terminator;

  • parâmetros de execução;

  • bibliotecas;

  • identificadores;

  • formato dos resultados.

Esses defaults economizam tempo.

Em vez de digitar os mesmos valores em todos os painéis, o usuário configura uma vez e reaproveita.

Porém, sempre revise os parâmetros antes de executar.

Um default antigo pode apontar para:

  • SSID incorreto;

  • biblioteca obsoleta;

  • plan antigo;

  • collection inadequada;

  • dataset inexistente.

Automação ajuda.

Automação desatualizada ajuda a errar mais rápido.


17. Passo a passo completo: criando um programa COBOL com Db2

Agora vamos juntar tudo.

Imagine um programa que consulta o nome de um cliente.


Passo 1 — Criar o DCLGEN

Use a opção 2.

Informe:

TABLE OWNER: APP
TABLE NAME: CLIENTE

Defina o dataset de saída:

VAGNER.COBOL.COPYLIB(DCLCLI)

O DCLGEN será gerado.


Passo 2 — Escrever o programa COBOL

Exemplo simplificado:

       IDENTIFICATION DIVISION.
       PROGRAM-ID. PGCLI001.

       DATA DIVISION.
       WORKING-STORAGE SECTION.

       EXEC SQL
           INCLUDE SQLCA
       END-EXEC.

       EXEC SQL
           INCLUDE DCLCLI
       END-EXEC.

       01  WS-ID-CLIENTE      PIC S9(9) COMP VALUE 100.
       01  WS-NOME-CLIENTE    PIC X(80).

       PROCEDURE DIVISION.

           EXEC SQL
               SELECT NOME_CLIENTE
                 INTO :WS-NOME-CLIENTE
                 FROM APP.CLIENTE
                WHERE ID_CLIENTE = :WS-ID-CLIENTE
           END-EXEC

           EVALUATE SQLCODE
               WHEN 0
                   DISPLAY 'CLIENTE: ' WS-NOME-CLIENTE
               WHEN 100
                   DISPLAY 'CLIENTE NAO ENCONTRADO'
               WHEN OTHER
                   DISPLAY 'ERRO SQL: ' SQLCODE
           END-EVALUATE

           GOBACK.

Passo 3 — Precompile

Use a opção 4 ou Program Preparation.

Entradas:

Fonte COBOL
DBRM library
Copy library
Parâmetros SQL

Saídas:

Fonte COBOL modificado
DBRM
Listing
Mensagens

Verifique erros de sintaxe SQL.


Passo 4 — Compilar

O fonte modificado segue para o Enterprise COBOL.

O compilador gera:

Object deck
Compiler listing
Mensagens

Corrija qualquer erro COBOL.


Passo 5 — Link-edit

O objeto é transformado em load module ou program object.

Ele será armazenado em uma biblioteca de carga.

Exemplo:

VAGNER.APP.LOADLIB

Passo 6 — BIND PACKAGE

Use a opção 5.

Informe:

DBRM: PGCLI001
COLLECTION: APPDEV
PACKAGE: PGCLI001
OWNER: VAGNER
QUALIFIER: APP

Parâmetros comuns podem incluir:

ACTION(REPLACE)
ISOLATION(CS)
VALIDATE(BIND)
RELEASE(COMMIT)
CURRENTDATA(NO)

Os parâmetros exatos dependem dos padrões da empresa.


Passo 7 — BIND PLAN

Caso o ambiente utilize plan explícito para a execução, associe a package list ou collection.

Exemplo conceitual:

PLAN: PLANAPP
PKLIST: APPDEV.*

Passo 8 — Executar

Use a opção 6 ou submeta o JCL.

Observe:

  • retorno do job;

  • SQLCODE;

  • mensagens;

  • dumps;

  • saídas;

  • tempo de CPU;

  • quantidade de linhas.


18. Erros clássicos do padawan

SQLCODE -805

Package não encontrado.

Possíveis causas:

  • BIND não executado;

  • collection errada;

  • plan incorreto;

  • package removido;

  • versão incompatível.


SQLCODE -818

Incompatibilidade de timestamp entre programa e package.

Pode acontecer quando o programa foi recompilado, mas o package não foi gerado de forma correspondente.

A solução geralmente envolve sincronizar:

Precompile
Compile
Link-edit
Bind

SQLCODE -811

Um SELECT INTO retornou mais de uma linha.

Exemplo perigoso:

SELECT NOME_CLIENTE
INTO :WS-NOME
FROM APP.CLIENTE
WHERE STATUS = 'A';

Se existem mil clientes ativos, o Db2 não sabe qual retornar.

Use chave única, agregação ou cursor.


SQLCODE +100

Nenhuma linha encontrada.

Não é necessariamente erro.

Pode ser uma condição normal de negócio.


SQLCODE -911

Deadlock ou timeout com rollback.

O programa perdeu uma disputa por recurso e a unidade de trabalho foi desfeita.

É necessário avaliar:

  • ordem de acesso;

  • tempo entre commits;

  • índices;

  • isolamento;

  • concorrência;

  • volume de processamento.


19. Curiosidades históricas

O DB2I carrega a filosofia de uma época em que memória, largura de banda e espaço de tela eram recursos valiosos.

Por isso, seus painéis são diretos.

Não existem animações.

Não existem botões brilhantes.

Não existem notificações perguntando se você gostaria de conhecer cinco novidades.

Existe uma linha de comando, campos objetivos e uma tecla Enter.

Essa simplicidade ajudou o ambiente a permanecer produtivo por décadas.

Outra curiosidade é que muitos profissionais que começaram no Db2 em versões antigas ainda reconhecem imediatamente o menu.

Os detalhes evoluíram.

O banco ganhou novos tipos, novos níveis de função, novas capacidades e otimizações.

Mas a lógica fundamental continua familiar.

Isso é compatibilidade cultural.

Não apenas compatibilidade técnica.


20. Easter egg Bellacosa Mainframe

Vamos transformar a jornada em uma aventura galáctica.

O programa COBOL é um jovem Jedi.

O DCLGEN entrega o mapa da estrutura do planeta-tabela.

O precompiler é C-3PO, traduzindo SQL para uma linguagem compreendida pela infraestrutura.

O DBRM é o pergaminho contendo todas as missões de acesso ao banco.

O compilador COBOL treina o guerreiro.

O link-editor entrega o sabre de luz.

O BIND apresenta a missão ao Conselho Jedi.

O otimizador decide a rota: índice, scan, join, paralelismo.

O package é a autorização oficial.

O plan é o plano de batalha.

O SQLCA é o comunicador preso ao cinto.

E o SQLCODE informa se a missão foi cumprida ou se o grupo acabou preso em um compactador de lixo da Estrela da Morte.

O mais importante é compreender que nenhuma etapa existe por acaso.

O mainframe não gosta de improviso.

Ele gosta de processos repetíveis, auditáveis e previsíveis.

Essa disciplina é uma das razões pelas quais sistemas IBM Z sustentam bancos, governos, seguradoras, companhias aéreas, indústrias e cadeias globais de negócios.


Conclusão

A tela do DB2I pode parecer modesta, mas ela concentra uma quantidade impressionante de conhecimento.

Por trás de suas opções existem:

  • linguagens;

  • compiladores;

  • catálogos;

  • packages;

  • plans;

  • access paths;

  • estatísticas;

  • segurança;

  • recuperação;

  • concorrência;

  • utilitários;

  • JCL;

  • datasets;

  • décadas de engenharia.

Dominar o DB2I não significa apenas aprender a navegar em um menu.

Significa compreender o ciclo de vida de uma aplicação Db2 no z/OS.

O programador COBOL padawan que aprende apenas a escrever SELECT conhece a superfície.

O profissional que compreende precompile, DBRM, BIND, package, plan, SQLCA, utilitários e access path começa a enxergar o sistema inteiro.

E é nesse momento que a velha tela preta deixa de parecer antiga.

Ela passa a parecer aquilo que realmente é:

Um painel de controle compacto para uma das plataformas de dados mais robustas já construídas pela indústria da computação.

Portanto, na próxima vez que você entrar no DB2I e enxergar suas opções em ciano, não veja apenas números.

Veja uma linha de produção.

Veja o SQL sendo extraído.

Veja o DBRM sendo criado.

Veja o compilador trabalhando.

Veja o otimizador avaliando caminhos.

Veja o package sendo autorizado.

Veja o programa entrando em execução.

Porque, no IBM Z, quase sempre existe muito mais acontecendo por trás da tela do que o terminal permite enxergar.

E essa, jovem padawan, é parte da beleza do mainframe.