Translate

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

segunda-feira, 19 de janeiro de 2026

💥 LAB: Db2 na prática — do TSO ao Batch

 

Bellacosa Mainframe Laboratio DB2

💥 LAB: Db2 na prática — do TSO ao Batch

Trabalharemos com o IBM Db2 13 for z/OS usando duas abordagens:

👉 Online (TSO/ISPF + SPUFI)
👉 Batch (JCL + DSNTEP2)


🧪 PARTE 1 — SPUFI (modo interativo)

🔹 O que é SPUFI?

👉 SPUFI = SQL Processor Using File Input

Ferramenta dentro do DB2I (ISPF) para rodar SQL rapidamente.


🚀 Passo a passo

1. Entrar no DB2I

No ISPF:

===> DB2I

2. Selecionar SPUFI

Option ===> 1

3. Criar dataset de entrada

Exemplo:

VAGNER.SQL.INPUT

4. Escrever o SQL

CREATE TABLE VAGNER.CLIENTES (
ID INTEGER,
NOME VARCHAR(50),
CIDADE VARCHAR(50)
);

INSERT INTO VAGNER.CLIENTES VALUES (1, 'ANA', 'SAO PAULO');
INSERT INTO VAGNER.CLIENTES VALUES (2, 'JOAO', 'CAMPINAS');

SELECT * FROM VAGNER.CLIENTES;

5. Executar (PF8)

👉 Resultado vai para o dataset de saída


💡 O que você aprendeu aqui

✔ Criar tabela
✔ Inserir dados
✔ Consultar
✔ Usar ambiente interativo


⚙️ PARTE 2 — DSNTEP2 (modo batch raiz)

Agora vem o modo produção de verdade 😎


🔹 O que é DSNTEP2?

👉 Programa utilitário que executa SQL via JCL

💡 Tradução Bellacosa:

SPUFI é treino… DSNTEP2 é jogo oficial ⚔️


📜 JCL COMPLETO

//DB2JOB JOB (ACCT),'DB2 LAB',CLASS=A,MSGCLASS=X,NOTIFY=&SYSUID
//*
//STEP01 EXEC PGM=IKJEFT01
//STEPLIB DD DISP=SHR,DSN=DSN!!0.SDSNLOAD
//SYSTSPRT DD SYSOUT=*
//SYSPRINT DD SYSOUT=*
//SYSUDUMP DD SYSOUT=*
//SYSTSIN DD *
DSN SYSTEM(DB2P)
RUN PROGRAM(DSNTEP2) PLAN(DSNTEP71) -
LIB('DSN!!0.SDSNLOAD')
END
/*
//SYSIN DD *
SELECT * FROM VAGNER.CLIENTES;
/*

🔍 Explicando (nível especialista)

🔹 IKJEFT01

👉 Interface TSO em batch


🔹 DSN SYSTEM(DB2P)

👉 Conecta no subsistema Db2


🔹 DSNTEP2

👉 Executa comandos SQL


🔹 PLAN(DSNTEP71)

👉 Plano necessário para execução


🔹 SYSIN

👉 Onde está o SQL


🧠 Resultado esperado

Você verá:

ID NOME CIDADE
----------------------
1 ANA SAO PAULO
2 JOAO CAMPINAS

💣 PEGADINHAS DE PRODUÇÃO

⚠️ 1. Falha de autorização

👉 Verifique permissões no RACF


⚠️ 2. PLAN não encontrado

👉 DSNTEP71 pode variar no ambiente


⚠️ 3. SQLCODE negativo

Exemplo:

  • -104 → erro de sintaxe
  • -204 → objeto não existe
  • -911 → deadlock

🔥 EVOLUÇÃO DO LAB

Quer subir o nível? Tenta isso:

💡 Desafio 1

Criar índice:

CREATE INDEX IDX1 ON VAGNER.CLIENTES (ID);

💡 Desafio 2

Update:

UPDATE VAGNER.CLIENTES
SET CIDADE = 'RIO DE JANEIRO'
WHERE ID = 1;

💡 Desafio 3

Delete:

DELETE FROM VAGNER.CLIENTES WHERE ID = 2;

🚀 VISÃO DE MAINFRAME RAIZ

👉 SPUFI → exploração / debug
👉 DSNTEP2 → automação / batch / produção

Se você domina isso, você já está acima de 80% dos devs Db2 💥


terça-feira, 20 de setembro de 2022

Os 50 Comandos do Subsistema Db2 sem Mistérios

 

Bellacosa Mainframe e uma lista de 50 comandos do subsistema db2 sem misterios

☕ Um Café no Bellacosa Mainframe

Os 50 Comandos do Subsistema Db2 sem Mistérios

O guia operacional para o programador COBOL padawan conversar com o coração do Db2 for z/OS

Imagine o seguinte cenário: você terminou seu programa COBOL, passou pelo pré-compilador, compilou, linkeditou, executou o BIND e finalmente colocou o módulo em produção.

Então chega uma mensagem:

DSNT500I RESOURCE UNAVAILABLE

O programa está correto. O SQL está correto. A tabela existe. Mas o tablespace está parado.

Em outro momento, o programa fica esperando durante vários minutos. Não há abend, não há SQLCODE negativo e ninguém sabe exatamente o que está acontecendo. Depois de alguma investigação, descobre-se que uma thread está segurando um lock e bloqueando dezenas de transações.

É nesse ponto que entramos no mundo dos comandos do subsistema Db2.

Esses comandos não são comandos SQL. Eles são ordens operacionais enviadas diretamente ao mecanismo do Db2 for z/OS para consultar, iniciar, parar, alterar, recuperar ou controlar componentes do subsistema.

A IBM define esses comandos como recursos usados para controlar grande parte do ambiente operacional do Db2. Eles podem ser emitidos pelo console do z/OS, pelo SDSF, por uma sessão DSN no TSO, pelo painel DB2 Commands do DB2I e, dependendo da configuração, por terminais IMS, CICS ou aplicações autorizadas. A exceção mais importante é -START DB2, que normalmente precisa ser emitido pelo console do z/OS ou pelo TSO/SDSF. (IBM)


Bellacosa Mainframe e o DB2 na intimidade

1. Antes de começar: SQL não é comando Db2

Um iniciante frequentemente mistura quatro coisas diferentes:

SELECT * FROM CLIENTES;

Isso é uma instrução SQL.

RUNSTATS TABLESPACE DBVENDAS.TSVENDAS;

Isso é uma utility control statement, normalmente executada pelo utilitário DSNUTILB.

BIND PACKAGE(COLLID) MEMBER(PROGRAMA);

Isso é um subcomando do processador DSN.

-DISPLAY DATABASE(DBVENDAS)

Isso é um comando operacional do subsistema Db2.

O hífen inicial é uma pista fundamental:

-DISPLAY
-START
-STOP
-ALTER
-CANCEL
-SET
-RECOVER

Nos exemplos deste artigo, considere que o subsistema se chama DB2P, embora o prefixo usado no console dependa da instalação.

No console, você poderá encontrar algo como:

-DB2P DISPLAY DATABASE(DBVENDAS)

No painel DB2 Commands do DB2I, normalmente será digitado apenas:

-DISPLAY DATABASE(DBVENDAS)

2. Regra de ouro do operador Jedi

Antes de executar qualquer comando que modifique o ambiente:

  1. Execute um DISPLAY.

  2. Leia todas as mensagens retornadas.

  3. Confirme o nome do subsistema.

  4. Confirme o nome do objeto.

  5. Verifique se está em desenvolvimento, homologação ou produção.

  6. Registre o motivo da intervenção.

  7. Tenha um comando de retorno preparado.

  8. Nunca copie comandos cegamente de outra instalação.

O Db2 costuma retornar DSN9022I quando o processamento do comando termina normalmente e DSN9023I quando termina de forma anormal. Porém, não basta procurar apenas a última mensagem: as mensagens anteriores explicam o que realmente aconteceu. (IBM)


Parte I — Comandos de diagnóstico e observação

1. -DISPLAY DATABASE

Para que serve

Exibe o estado de databases, tablespaces, indexspaces e partições.

É provavelmente o comando operacional mais importante para o programador COBOL.

Exemplo

-DISPLAY DATABASE(DBVENDAS)

Para um tablespace específico:

-DISPLAY DATABASE(DBVENDAS) SPACENAM(TSVENDAS)

Para obter informações adicionais:

-DISPLAY DATABASE(DBVENDAS) SPACENAM(TSVENDAS) RESTRICT

Passo a passo

  1. Identifique o database.

  2. Informe opcionalmente o nome do espaço.

  3. Execute o comando.

  4. Procure estados restritivos.

  5. Investigue situações como STOP, COPY, RECP, REORP, RBDP, UTRO ou UTRW.

Vantagem

Permite verificar rapidamente por que uma aplicação não consegue acessar um objeto.

Perigo

Usar curingas muito abrangentes pode produzir uma enorme quantidade de mensagens no console.

-DISPLAY DATABASE(*) SPACENAM(*)

Em produção, isso pode transformar o console em uma cachoeira de mensagens.

A IBM documenta que o comando apresenta informações de status sobre databases Db2 e possui escopo de grupo em ambientes data sharing. (IBM)


2. -DISPLAY THREAD

Para que serve

Mostra as threads que estão conectadas ao Db2.

Uma thread representa o contexto de uma conexão ou unidade de trabalho de uma aplicação. Pode ser uma aplicação TSO, CICS, IMS, batch, stored procedure ou uma conexão distribuída.

Exemplos

-DISPLAY THREAD(*)
-DISPLAY THREAD(*) TYPE(ACTIVE)
-DISPLAY THREAD(*) DETAIL

O que observar

  • authorization ID;

  • plan;

  • correlation ID;

  • connection name;

  • token;

  • status;

  • LUWID;

  • atividade local ou distribuída.

Dica COBOL

Em um job batch, o correlation ID frequentemente ajuda a relacionar a thread ao job ou à aplicação.

Perigo

Não confunda uma thread aparentemente parada com uma thread inútil. Ela pode estar esperando I/O, lock, resposta de rede ou trabalho de outra região.

O comando mostra informações sobre allied threads, database access threads e tarefas paralelas, que podem estar ativas, inativas, indoubt ou postponed. (IBM)


3. -DISPLAY BLOCKERS

Para que serve

Mostra locks e claims mantidos por threads que estão bloqueando determinados objetos.

Exemplo

-DISPLAY BLOCKERS DATABASE(DBVENDAS)
-DISPLAY BLOCKERS DATABASE(DBVENDAS) SPACENAM(TSVENDAS)

Quando usar

  • jobs esperando recursos;

  • SQLCODE -911 ou -913;

  • utility sem conseguir realizar drain;

  • transações CICS acumulando;

  • tablespace que não consegue parar.

Vantagem

Reduz o tempo de investigação de contenção.

Ponto de atenção

O bloqueador nem sempre é o culpado. Pode ser apenas uma aplicação legítima executando uma longa unidade de trabalho.

O comando mostra locks e claims mantidos por threads ativas contra databases, tabelas, índices ou espaços especificados. (IBM)


4. -DISPLAY DDF

Para que serve

Exibe o estado da Distributed Data Facility, responsável pelas conexões distribuídas com o Db2.

Exemplo

-DISPLAY DDF
-DISPLAY DDF DETAIL

Pode mostrar

  • status do DDF;

  • endereço TCP/IP;

  • porta DRDA;

  • número de conexões;

  • número de DBATs;

  • parâmetros de conexão;

  • filas relacionadas a limites.

Uso típico

Uma aplicação Java, API, ferramenta externa ou outro Db2 não consegue conectar-se ao subsistema.

Atenção

DDF ativo não significa que toda conexão funcionará. Ainda podem existir problemas de TCP/IP, RACF, certificados, AT-TLS, location, package ou autorização.

A IBM descreve -DISPLAY DDF como o comando que mostra configuração, status e estatísticas das conexões e threads controladas pelo DDF. (IBM)


5. -DISPLAY GROUP

Para que serve

Exibe informações sobre o data sharing group ou, mesmo fora de um grupo ativo, dados importantes sobre níveis do Db2.

Exemplo

-DISPLAY GROUP
-DISPLAY GROUP DETAIL

Mostra informações como

  • membros;

  • status dos membros;

  • code level;

  • catalog level;

  • function level;

  • coexistência e compatibilidade.

Curiosidade

É um dos primeiros comandos que um especialista executa para descobrir “em que Db2 estou pisando”.

O Db2 pode ter código em um nível, catálogo em outro e function level em outro. A versão comercial isoladamente não conta toda a história.


6. -DISPLAY BUFFERPOOL

Para que serve

Mostra status e características dos buffer pools.

Exemplo

-DISPLAY BUFFERPOOL(BP0)
-DISPLAY BUFFERPOOL(*)
-DISPLAY BUFFERPOOL(BP8K0) DETAIL

O que investigar

  • tamanho atual;

  • page size;

  • thresholds;

  • parâmetros de escrita;

  • situação ativa ou inativa;

  • frames alocados.

Vantagem

Ajuda a verificar se uma alteração de buffer pool foi realmente aplicada.

Desvantagem

O comando não substitui RMF, Statistics Trace ou ferramentas de performance. Ele mostra estado operacional, não toda a história de desempenho.


7. -DISPLAY GROUPBUFFERPOOL

Para que serve

Mostra o estado dos group buffer pools em data sharing.

Exemplo

-DISPLAY GROUPBUFFERPOOL(GBP0)
-DISPLAY GROUPBUFFERPOOL(*) TYPE(GCONN)

Quando é importante

  • problemas de data sharing;

  • falhas de coupling facility;

  • rebuild de GBP;

  • objetos em GBP-dependent;

  • inconsistências entre membros.

Atenção

Este comando pertence ao reino do sysprog e do DBA de infraestrutura. Um programador deve conhecê-lo, mas não alterar um GBP sem um procedimento formal.


8. -DISPLAY LOG

Para que serve

Mostra informações sobre active logs, offload, checkpoints e situação do processo de logging.

Exemplo

-DISPLAY LOG

Pode ajudar a identificar

  • active log corrente;

  • progresso de offload;

  • parâmetros de checkpoint;

  • ocupação ou indisponibilidade de logs;

  • risco de aplicações pararem por falta de espaço de log.

Easter egg operacional

O log é a máquina do tempo do Db2. Sem ele, rollback, restart e recuperação deixam de ser operações confiáveis.

A IBM explica que, quando o Db2 preenche um active log, precisa descarregá-lo para um archive log. Se as aplicações alcançarem o processo de offload, elas podem ser suspensas até que haja espaço disponível. (IBM)


9. -DISPLAY ARCHIVE

Para que serve

Mostra informações sobre archive logs usados como entrada e sobre a atividade de arquivamento.

Exemplo

-DISPLAY ARCHIVE

Ponto de atenção em data sharing

O comando mostra informações do membro no qual foi executado. Para visualizar todos os membros, pode ser necessário executá-lo individualmente em cada um. (IBM)


10. -DISPLAY UTILITY

Para que serve

Mostra o estado das utilities registradas no Db2.

Exemplos

-DISPLAY UTILITY(*)
-DISPLAY UTILITY(UTIL1234)

Pode revelar

  • utility ID;

  • nome da utility;

  • fase atual;

  • objeto processado;

  • contagem de registros;

  • situação parada ou ativa;

  • membro do data sharing group.

Uso típico

Um REORG aparentemente não avança. Antes de cancelar o job, execute DISPLAY UTILITY.

Perigo

A utility pode estar em uma fase crítica ou aguardando drain. Interrompê-la sem entender o estado pode deixar o objeto restrito.


11. -DISPLAY TRACE

Para que serve

Lista traces ativos no Db2.

Exemplo

-DISPLAY TRACE(*)
-DISPLAY TRACE(P)

Tipos comuns

  • statistics;

  • accounting;

  • audit;

  • performance;

  • monitor;

  • global.

Atenção

Tracing custa recursos. Um trace excessivamente detalhado pode aumentar CPU, geração de SMF e volume de dados.


12. -DISPLAY STATS

Para que serve

Exibe estatísticas de uso de determinados recursos e processos internos do Db2.

Exemplo

-DISPLAY STATS

Utilidade

É usado em diagnósticos operacionais específicos, geralmente por DBAs e suporte.

Limitação

Não deve ser confundido com RUNSTATS. DISPLAY STATS consulta estatísticas operacionais; RUNSTATS coleta estatísticas de objetos para catálogo e otimizador.


13. -DISPLAY LOCATION

Para que serve

Mostra informações sobre locations remotas conhecidas pelo Db2.

Exemplo

-DISPLAY LOCATION(*)
-DISPLAY LOCATION(DSNREM01)

Quando usar

  • falha em conexão remota;

  • aplicações DRDA;

  • aliases e locations incorretas;

  • investigação de comunicação entre subsistemas.


14. -DISPLAY PROFILE

Para que serve

Mostra se a função de profiles está ativa.

Exemplo

-DISPLAY PROFILE

O que são profiles

As profile tables permitem aplicar controles e comportamentos a conexões e threads, incluindo limites e regras para aplicações distribuídas.

Atenção

Uma aplicação pode funcionar em homologação e ser limitada em produção por causa de um profile específico.


15. -DISPLAY RLIMIT

Para que serve

Mostra o estado do Resource Limit Facility, tradicionalmente conhecido como governor.

Exemplo

-DISPLAY RLIMIT

Para que serve o governor

Pode limitar ou controlar o consumo estimado de recursos por instruções SQL dinâmicas.

Pegadinha

Um SQL pode estar sintaticamente correto e ter um bom access path, mas ser bloqueado por política de resource limit.


16. -DISPLAY PROCEDURE

Para que serve

Mostra informações e estatísticas sobre stored procedures externas acessadas pelas aplicações.

Exemplo

-DISPLAY PROCEDURE(*)
-DISPLAY PROCEDURE(MEU_SCHEMA.MINHA_PROC)

Uso típico

  • stored procedure não inicia;

  • excesso de chamadas;

  • procedure parada;

  • comportamento inesperado no WLM application environment.


17. -DISPLAY FUNCTION SPECIFIC

Para que serve

Mostra estatísticas sobre funções externas definidas pelo usuário.

Exemplo conceitual

-DISPLAY FUNCTION SPECIFIC(MEU_SCHEMA.MINHA_FUNCAO)

Atenção

O nome específico pode ser diferente do nome SQL usado para chamar a função.


18. -DISPLAY RESTSVC

Para que serve

Mostra o estado dos serviços REST definidos no Db2.

Exemplo

-DISPLAY RESTSVC(*)

Curiosidade

O mesmo Db2 tradicionalmente acessado por COBOL, CICS e batch pode expor operações como serviços REST.

É a velha fortaleza do mainframe abrindo portões controlados para o mundo das APIs.


19. -DISPLAY ACCEL

Para que serve

Mostra informações sobre servidores aceleradores associados ao Db2, como ambientes IBM Db2 Analytics Accelerator.

Exemplo

-DISPLAY ACCEL(*)

Ponto de atenção

Uma query elegível para aceleração pode deixar de ser executada no accelerator quando o servidor está indisponível, dependendo da configuração e do comportamento definido.


20. -DISPLAY ML

Para que serve

Mostra o estado de funções relacionadas ao IBM Db2 AI for z/OS ou ao IBM Z Database Assistant.

Exemplo

-DISPLAY ML

Curiosidade

É um exemplo de como a lista de comandos do Db2 evolui. O velho painel verde agora também conversa com recursos de inteligência artificial.


21. -DISPLAY OTEL

Para que serve

Exibe o estado da integração OpenTelemetry do Db2.

Exemplo

-DISPLAY OTEL

Ponto de atenção

Esse comando depende do nível de código, manutenção e function level aplicáveis ao ambiente. Ele pode não existir em instalações mais antigas.

O catálogo atual do Db2 13 inclui comandos para exibir, iniciar e parar funções OpenTelemetry. (IBM)


22. -DISPLAY DYNQUERYCAPTURE

Para que serve

Mostra monitores ativos de captura de queries dinâmicas.

Exemplo

-DISPLAY DYNQUERYCAPTURE

Utilidade

Ajuda em processos de estabilização de access paths para SQL dinâmico.

Atenção

Isso não é a mesma coisa que olhar o dynamic statement cache. O comando está relacionado aos monitores de captura configurados.


Parte II — Comandos para iniciar componentes

23. -START DB2

Para que serve

Inicializa o subsistema Db2.

Exemplo no console

-DB2P START DB2

Passo a passo simplificado

  1. O z/OS inicia as started tasks do Db2.

  2. O Db2 conecta-se ao IRLM.

  3. Abre BSDS e logs.

  4. Executa restart processing quando necessário.

  5. Recupera unidades de trabalho.

  6. Disponibiliza serviços internos.

  7. Permite conexões de TSO e subsistemas anexados.

Perigo

Não é um simples “ligar banco de dados”. Um restart pode envolver recuperação, backout e resolução de unidades de trabalho.


24. -START DATABASE

Para que serve

Torna um database ou espaço novamente disponível.

Exemplos

-START DATABASE(DBVENDAS)
-START DATABASE(DBVENDAS) SPACENAM(TSVENDAS)
-START DATABASE(DBVENDAS) SPACENAM(TSVENDAS) ACCESS(RW)

Modos de acesso comuns

  • RW: leitura e escrita;

  • RO: somente leitura;

  • UT: acesso para utilities;

  • modos específicos dependem da situação e da sintaxe suportada.

Atenção

Dar START não remove magicamente todos os estados restritivos. Um objeto em RECP, RBDP ou COPY pode exigir uma utility apropriada.

A IBM define esse comando como a forma de tornar o database especificado disponível para uso. (IBM)


25. -START DDF

Para que serve

Inicia a Distributed Data Facility.

Exemplo

-START DDF

Antes de usar

  1. Execute -DISPLAY DDF.

  2. Confirme que o DDF está parado.

  3. Verifique TCP/IP e segurança.

  4. Inicie.

  5. Execute outro -DISPLAY DDF.

Perigo

Iniciar o DDF pode reabrir imediatamente o acesso de centenas de clientes externos.


26. -START TRACE

Para que serve

Inicia traces do Db2.

Exemplo conceitual

-START TRACE(P) CLASS(1,2,3) DEST(SMF)

Atenção máxima

Classes de trace devem ser escolhidas conscientemente. Ativar classes em excesso pode gerar alto volume de SMF e overhead.

Boa prática

Defina antecipadamente:

  • por que o trace será iniciado;

  • qual classe é necessária;

  • qual destino será utilizado;

  • quanto tempo ficará ativo;

  • quem irá pará-lo;

  • como os registros serão analisados.


27. -START PROFILE

Para que serve

Carrega ou recarrega as profile tables para a memória do Db2.

Exemplo

-START PROFILE

Pegadinha

Alterar as tabelas de profile não significa necessariamente que o Db2 já esteja usando a nova configuração. O reload pode ser necessário.


28. -START RLIMIT

Para que serve

Inicia o Resource Limit Facility.

Exemplo conceitual

-START RLIMIT ID=RLST01

Atenção

A sintaxe exata e a tabela utilizada dependem da configuração da instalação.


29. -START PROCEDURE

Para que serve

Ativa ou atualiza a definição de uma stored procedure no cache.

Exemplo

-START PROCEDURE(MEU_SCHEMA.MINHA_PROC)

Uso interessante

Depois de uma alteração autorizada na definição ou no programa externo, o DBA pode usar o comando para atualizar o estado da procedure.


30. -START FUNCTION SPECIFIC

Para que serve

Inicia uma função externa que foi anteriormente parada.

Exemplo conceitual

-START FUNCTION SPECIFIC(MEU_SCHEMA.FUNCAO01)

Limitação

Aplica-se a funções externas suportadas pelo comando, não a qualquer função built-in do Db2.


31. -START RESTSVC

Para que serve

Inicia um serviço REST que estava parado.

Exemplo

-START RESTSVC(COLLECTION.SERVICO)

Ponto de atenção

Iniciar o serviço não corrige problemas de package, autorização, endpoint, certificado ou SQL interno.


32. -START ACCEL

Para que serve

Notifica o Db2 para utilizar determinado servidor acelerador.

Exemplo conceitual

-START ACCEL(*)

Atenção

Deve fazer parte de um procedimento de administração do accelerator, não de uma tentativa aleatória de “fazer query correr mais rápido”.


33. -START ML

Para que serve

Inicia funções ligadas ao Db2 AI for z/OS ou IBM Z Database Assistant.

Exemplo

-START ML

Dependências

O produto correspondente precisa estar instalado e corretamente configurado.


34. -START OTEL

Para que serve

Inicia as funções OpenTelemetry do Db2.

Exemplo

-START OTEL

Uso

Pode fazer parte de uma estratégia moderna de observabilidade distribuída, correlacionando aplicações externas com processamento dentro do Db2.


35. -START DYNQUERYCAPTURE

Para que serve

Inicia captura e monitoramento de SQL dinâmico qualificado para estabilização de access paths.

Exemplo conceitual

-START DYNQUERYCAPTURE

Vantagem

Ajuda a tornar determinados comportamentos de SQL dinâmico mais previsíveis.

Desvantagem

Introduz administração adicional e exige entendimento sobre quais queries estão sendo capturadas.


Parte III — Comandos para parar componentes

36. -STOP DATABASE

Para que serve

Torna databases ou espaços indisponíveis e fecha seus data sets.

Exemplos

-STOP DATABASE(DBVENDAS)
-STOP DATABASE(DBVENDAS) SPACENAM(TSVENDAS)
-STOP DATABASE(DBVENDAS) SPACENAM(TSVENDAS) MODE(QUIESCE)

Passo a passo seguro

  1. Execute DISPLAY DATABASE.

  2. Identifique aplicações usando o objeto.

  3. Verifique blockers e claims.

  4. Escolha o modo adequado.

  5. Execute o STOP.

  6. Confirme o estado.

  7. Execute a manutenção planejada.

  8. Use START DATABASE para restaurar o acesso.

Perigo

Parar um objeto em produção pode causar:

  • SQLCODE -904;

  • transações CICS falhando;

  • jobs batch interrompidos;

  • filas e reprocessamentos;

  • indisponibilidade de APIs.

Nunca use MODE(FORCE) apenas porque MODE(QUIESCE) está demorando.


37. -STOP DB2

Para que serve

Encerra o subsistema Db2.

Exemplo

-STOP DB2 MODE(QUIESCE)

Modos importantes

MODE(QUIESCE) tenta realizar uma parada organizada.

MODE(FORCE) força o encerramento e pode exigir maior processamento de restart posteriormente.

Regra Jedi

FORCE não significa “mais rápido e melhor”. Significa “aceito as consequências operacionais de não esperar”.


38. -STOP DDF

Para que serve

Interrompe a interface distribuída do Db2 com TCP/IP ou VTAM.

Exemplo

-STOP DDF

Efeito

As aplicações locais podem continuar funcionando, mas novas conexões distribuídas serão afetadas e conexões existentes dependerão do modo usado.

Perigo

Pode derrubar acesso de APIs, servidores Java, ferramentas de dados e outros subsistemas.


39. -STOP TRACE

Para que serve

Interrompe traces.

Exemplo conceitual

-STOP TRACE(P) TNO(03)

Boa prática

Sempre guarde o identificador do trace retornado no START TRACE.

O erro clássico é começar um trace e depois ninguém saber qual trace deve ser encerrado.


40. -STOP PROFILE

Para que serve

Desativa a função de profiles.

Exemplo

-STOP PROFILE

Atenção

Desativar profiles pode remover proteções, limites ou comportamentos definidos para várias conexões. Não é apenas uma ação técnica neutra.


41. -STOP RLIMIT

Para que serve

Interrompe o Resource Limit Facility.

Exemplo

-STOP RLIMIT

Risco

SQLs que antes eram controlados pelo governor podem passar a executar sem aquela limitação.


42. -STOP PROCEDURE

Para que serve

Impede que o Db2 aceite novas chamadas para uma ou mais stored procedures.

Exemplo

-STOP PROCEDURE(MEU_SCHEMA.MINHA_PROC)

Uso típico

  • manutenção;

  • correção emergencial;

  • stored procedure causando falhas;

  • preparação para atualização do módulo.


43. -STOP RESTSVC

Para que serve

Impede novas solicitações de descoberta ou invocação de um serviço REST.

Exemplo

-STOP RESTSVC(COLLECTION.SERVICO)

Vantagem

Permite isolar uma API sem necessariamente parar todo o DDF.


Parte IV — Comandos de alteração e controle

44. -ALTER BUFFERPOOL

Para que serve

Altera atributos de buffer pools ativos ou inativos.

Exemplo conceitual

-ALTER BUFFERPOOL(BP8K0) VPSIZE(20000)

Passos recomendados

  1. Execute DISPLAY BUFFERPOOL.

  2. Analise a necessidade.

  3. Avalie memória real e impacto.

  4. Aplique a alteração.

  5. Execute novo DISPLAY.

  6. Monitore paging, hit ratio, I/O e desempenho.

Vantagem

Certos parâmetros podem ser ajustados dinamicamente.

Desvantagem

Aumentar buffer pool indiscriminadamente pode pressionar a memória do sistema e prejudicar o conjunto, mesmo que um objeto isolado pareça melhorar.


45. -ALTER GROUPBUFFERPOOL

Para que serve

Altera atributos de group buffer pools em data sharing.

Exemplo conceitual

-ALTER GROUPBUFFERPOOL(GBP0) ...

Atenção máxima

Mudanças em GBP podem afetar todos os membros e milhares de objetos compartilhados. É território de change control, capacity planning e especialistas em Parallel Sysplex.


46. -ALTER UTILITY

Para que serve

Altera certos parâmetros de uma utility que já está em execução.

Pode ser usado em algumas execuções de:

  • REORG SHRLEVEL REFERENCE;

  • REORG SHRLEVEL CHANGE;

  • REBUILD SHRLEVEL CHANGE.

Exemplo conceitual

-ALTER UTILITY(UTIL1234) ...

Vantagem

Permite ajustar determinados comportamentos sem terminar e reiniciar toda a utility.

Limitação

Não é possível alterar qualquer parâmetro. Somente opções explicitamente suportadas pela utility e pela fase atual.


47. -MODIFY DDF

Para que serve

Modifica configurações e comportamentos operacionais do DDF.

Exemplo conceitual

-MODIFY DDF PKGREL(BNDOPT)

Possíveis usos

  • ajustar comportamento de packages;

  • controlar determinadas características das conexões;

  • resetar estatísticas;

  • modificar parâmetros suportados dinamicamente.

Perigo

Uma alteração aparentemente pequena pode afetar milhares de conexões distribuídas.


48. -SET SYSPARM

Para que serve

Altera parâmetros do subsistema que podem ser atualizados online.

Exemplo conceitual

-SET SYSPARM ...

Importante

Nem todo ZPARM é dinâmico.

Alguns parâmetros:

  • aceitam alteração online;

  • exigem restart;

  • dependem de function level;

  • possuem relacionamentos com outros parâmetros.

Boa prática

Registre tanto a mudança dinâmica quanto a atualização permanente nos parâmetros de instalação. Caso contrário, o valor pode retornar ao anterior no próximo restart.


49. -SET LOG

Para que serve

Controla aspectos críticos do logging.

Pode ser usado para:

  • alterar frequência de checkpoint;

  • suspender logging;

  • retomar logging;

  • adicionar active log;

  • remover active log.

A IBM confirma essas funções na documentação do comando. (IBM)

Exemplos conceituais

-SET LOG LOGLOAD(500000)
-SET LOG SUSPEND
-SET LOG RESUME

Perigo extremo

SET LOG SUSPEND não é um botão de pausa casual. Ele participa de procedimentos específicos, frequentemente relacionados a cópias consistentes e operações de storage.

Uma suspensão indevida pode paralisar atualizações e causar um incidente de grandes proporções.


Parte V — Comandos de intervenção, emergência e recuperação

50. -CANCEL THREAD

Para que serve

Cancela o processamento de uma thread local ou distribuída específica.

Procedimento correto

Primeiro localize a thread:

-DISPLAY THREAD(*) TYPE(ACTIVE) DETAIL

Identifique o token.

Depois, somente com autorização:

-CANCEL THREAD(token)

Para determinados casos distribuídos, pode ser usado:

-CANCEL DDF THREAD(token)

A IBM recomenda usar o DISPLAY THREAD DETAIL para identificar uma thread distribuída problemática antes do cancelamento. (IBM)

O que pode acontecer

  • rollback da unidade de trabalho;

  • liberação de locks;

  • abend ou erro na aplicação;

  • mensagens para CICS, IMS ou cliente remoto;

  • recuperação de recursos;

  • aumento temporário de logging pelo backout.

Perigo

Cancelar a thread errada pode derrubar:

  • fechamento contábil;

  • processamento de folha;

  • transferência financeira;

  • utility;

  • stored procedure;

  • transação crítica;

  • aplicação de outro usuário.

Regra de ouro

CANCEL THREAD não é ferramenta de performance. É uma intervenção operacional.


Seis comandos extras que você precisa conhecer

Embora a lista principal tenha cinquenta comandos, existem comandos que não podem ficar fora do seu radar.

-ARCHIVE LOG

Fecha o active log atual, passa para o próximo e inicia o processo de offload conforme a configuração.

-ARCHIVE LOG

Com quiesce:

-ARCHIVE LOG MODE(QUIESCE)

MODE(QUIESCE) tenta fazer com que as unidades de atualização alcancem commit, criando um ponto consistente antes do arquivamento. Isso pode suspender temporariamente atividades de atualização e deve ser utilizado com planejamento. (IBM)


-TERM UTILITY

Termina uma utility registrada e libera os recursos associados.

-TERM UTILITY(UTIL1234)

Antes:

-DISPLAY UTILITY(UTIL1234)

Perigo

O job pode ter terminado no JES, mas a utility continuar registrada no Db2. Por outro lado, terminar uma utility no momento errado pode deixar objetos em estados restritivos.


-RECOVER INDOUBT

Resolve threads que ficaram indoubt porque Db2 e o coordenador da transação não conseguiram determinar automaticamente se a unidade deveria receber commit ou rollback.

-RECOVER INDOUBT ...

Perigo extremo

Escolher incorretamente entre commit e abort pode gerar inconsistência lógica entre sistemas participantes.

Esse comando exige evidência, coordenação e procedimento de recuperação.


-RECOVER POSTPONED

Completa backout de unidades de recuperação que ficaram como postponed abort durante um restart anterior.

-RECOVER POSTPONED

É um comando de recuperação do subsistema, não um substituto da utility RECOVER.


-RECOVER BSDS

Reestabelece o dual BSDS quando uma das cópias foi desabilitada por erro de data set.

-RECOVER BSDS

O BSDS contém informações vitais sobre logs, checkpoints e restart. Mexer nele sem conhecimento especializado equivale a abrir o painel de navegação da nave durante uma tempestade hyperspace.


-ACCESS DATABASE

Pode forçar a abertura física de espaços, remover certos estados relacionados a GBP ou externalizar informações mantidas em memória, dependendo do MODE.

-ACCESS DATABASE(DBVENDAS) SPACENAM(TSVENDAS) MODE(OPEN)

A sintaxe e os modos devem ser confirmados para o nível específico do Db2.


Um roteiro prático para investigar “RESOURCE UNAVAILABLE”

Considere o erro:

DSNT500I
RESOURCE UNAVAILABLE
REASON 00C90081
TYPE 00000200
NAME DBVENDAS.TSVENDAS

Passo 1 — Não chute

Leia:

  • reason code;

  • resource type;

  • resource name;

  • horário;

  • job ou transação afetada.

Passo 2 — Verifique o objeto

-DISPLAY DATABASE(DBVENDAS) SPACENAM(TSVENDAS) RESTRICT

Passo 3 — Procure utility

-DISPLAY UTILITY(*)

Passo 4 — Procure bloqueadores

-DISPLAY BLOCKERS DATABASE(DBVENDAS) SPACENAM(TSVENDAS)

Passo 5 — Verifique threads

-DISPLAY THREAD(*) TYPE(ACTIVE) DETAIL

Passo 6 — Descubra a causa

O objeto pode estar:

  • parado administrativamente;

  • aguardando recovery;

  • esperando COPY;

  • esperando REORG;

  • em uso por utility;

  • bloqueado por aplicação;

  • restrito por falha anterior.

Passo 7 — Aplique a solução correta

Somente se o objeto estiver apenas parado e houver autorização:

-START DATABASE(DBVENDAS) SPACENAM(TSVENDAS) ACCESS(RW)

Se estiver em RECP, por exemplo, dar START não substitui a recuperação necessária.


Exemplo de execução por JCL

Comandos Db2 podem ser enviados em batch por meio do processador DSN, dependendo das autorizações e da configuração da instalação.

//DB2CMD  JOB (ACCT),'DB2 COMMAND',
//             CLASS=A,
//             MSGCLASS=X,
//             NOTIFY=&SYSUID
//*
//CMDSTEP  EXEC PGM=IKJEFT01,DYNAMNBR=20
//STEPLIB  DD DISP=SHR,DSN=DB2P.SDSNLOAD
//SYSTSPRT DD SYSOUT=*
//SYSPRINT DD SYSOUT=*
//SYSUDUMP DD SYSOUT=*
//SYSTSIN  DD *
  DSN SYSTEM(DB2P)
  -DISPLAY DATABASE(DBVENDAS) SPACENAM(TSVENDAS)
  -DISPLAY DDF
  -DISPLAY LOG
  END
/*

Explicação linha por linha

PGM=IKJEFT01

Executa o Terminal Monitor Program do TSO em batch.

DYNAMNBR=20

Reserva alocações dinâmicas para a execução.

STEPLIB

Aponta para a biblioteca de load modules do Db2. O nome varia em cada instalação.

SYSTSPRT

Recebe a saída produzida pela sessão TSO e pelo processador DSN.

SYSPRINT

Recebe mensagens adicionais de programas executados.

SYSUDUMP

Recebe dump em caso de abend.

SYSTSIN

Contém os comandos de entrada para a sessão TSO batch.

DSN SYSTEM(DB2P)

Abre uma sessão com o subsistema indicado.

-DISPLAY ...

Envia o comando operacional ao Db2.

END

Encerra a sessão DSN.

Atenção

Não coloque comandos destrutivos em um JCL genérico deixado em uma biblioteca compartilhada. Um simples submit acidental pode transformar um exemplo didático em incidente.


Tabela de bolso do programador COBOL padawan

SintomaPrimeiro comando
Objeto indisponível-DISPLAY DATABASE
Programa esperando-DISPLAY THREAD
Suspeita de lock-DISPLAY BLOCKERS
API não conecta-DISPLAY DDF
Utility travada-DISPLAY UTILITY
Problema de logging-DISPLAY LOG
Dúvida sobre nível do Db2-DISPLAY GROUP
Stored procedure parada-DISPLAY PROCEDURE
Serviço REST indisponível-DISPLAY RESTSVC
Suspeita de trace esquecido-DISPLAY TRACE

Erros clássicos de iniciantes

1. Executar START DATABASE para qualquer estado restritivo

Nem todo estado é resolvido por START. Alguns exigem COPY, RECOVER, REORG, REBUILD INDEX, CHECK DATA ou outra utility.

2. Usar CANCEL THREAD sem identificar o dono

O token é apenas o identificador técnico. Você também precisa saber:

  • qual aplicação;

  • qual unidade de negócio;

  • qual transação;

  • qual impacto;

  • qual rollback será provocado.

3. Confundir job cancelado com utility terminada

Cancelar o job no JES não garante que todos os recursos e registros da utility foram eliminados do Db2.

4. Usar STOP DATABASE(*)

Curingas são poderosos. Em produção, poder sem escopo é perigo.

5. Usar MODE(FORCE) por impaciência

Se o quiesce não termina, existe uma razão: claims, threads, units of work ou aplicações ainda estão utilizando o recurso.

6. Olhar apenas DSN9022I

O comando pode ter terminado normalmente, mas cada objeto solicitado pode apresentar estado diferente. Leia a resposta completa.

7. Copiar sintaxe de outra versão

Comandos, opções e comportamentos podem variar conforme:

  • versão;

  • function level;

  • APARs e PTFs;

  • modo data sharing;

  • parâmetros locais;

  • produtos adicionais instalados.

O Db2 13 recebe capacidades por function levels e manutenção contínua; portanto, “é Db2 13” não define sozinho todas as funções disponíveis. (IBM)


Vantagens dos comandos do subsistema

  • resposta operacional imediata;

  • integração com console e automação;

  • grande capacidade de diagnóstico;

  • controle granular de componentes;

  • suporte a ambientes data sharing;

  • possibilidade de operação por TSO, SDSF, DB2I e batch;

  • manutenção sem restart para diversas configurações;

  • visibilidade sobre threads, locks, logs e utilities.

Desvantagens e riscos

  • exigem autoridade elevada;

  • alguns comandos têm impacto sistêmico;

  • mensagens podem ser complexas;

  • sintaxe muda conforme o comando;

  • curingas podem ampliar demais o escopo;

  • ações forçadas podem gerar longos rollbacks;

  • alterações dinâmicas podem ser perdidas após restart;

  • um comando correto no subsistema errado continua sendo um comando perigoso;

  • data sharing exige atenção ao escopo de membro ou grupo.


O easter egg final: o hífen que separa dois mundos

Para o programador COBOL, o Db2 costuma parecer uma caixa onde entram instruções SQL:

EXEC SQL
   SELECT SALDO
     INTO :WS-SALDO
     FROM CONTA
    WHERE NUM_CONTA = :WS-CONTA
END-EXEC.

Mas, por trás dessa consulta, existe uma cidade inteira:

  • threads sendo criadas;

  • locks sendo negociados;

  • pages entrando em buffer pools;

  • logs registrando mudanças;

  • checkpoints delimitando recuperação;

  • utilities reorganizando objetos;

  • DDF conversando com clientes externos;

  • IRLM controlando concorrência;

  • data sharing coordenando membros;

  • stored procedures executando em ambientes WLM;

  • traces registrando o caminho percorrido.

Os comandos do subsistema são as janelas da torre de controle dessa cidade.

O programador iniciante não precisa ter autoridade para executar todos eles. Precisa, porém, saber que existem, compreender suas respostas e conversar com operadores, DBAs e sysprogs usando a linguagem correta.

Quando alguém disser:

“A aplicação está travada, vamos cancelar o job.”

O padawan treinado perguntará:

“Já verificamos a thread, o blocker, o estado do tablespace e a utility registrada?”

Nesse instante, ele deixa de ser apenas alguém que escreve EXEC SQL.

Ele começa a compreender o Db2 como subsistema operacional — e dá seu primeiro passo para se tornar um verdadeiro Jedi do mainframe.

A lista segue a referência atual do Db2 13 for z/OS, mas exemplos que alteram o ambiente devem ser ajustados às autorizações, function level e padrões operacionais da instalação. (IBM)

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.


Vagner Renato Bellacosa, IBM Champion e especialista em IBM Mainframe
IBM Z17 SYSTEM ONLINE
Sobre o autor

Vagner Renato Bellacosa

IBM Champion 2026 • Especialista em IBM Mainframe

Vagner Renato Bellacosa trabalha com IBM Mainframe desde 1988 , é IBM Champion e especialista em COBOL, CICS, Db2, z/OS e IBM Z. Compartilha experiências profissionais, conhecimento técnico, história da computação e práticas do universo mainframe para aproximar novas gerações das tecnologias que sustentam empresas, bancos e governos ao redor do mundo.

IBM Champion IBM Z COBOL CICS Db2 z/OS Mainframe desde 1988
GitHub LinkedIn
Inicializando conteúdo...