Translate

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

segunda-feira, 4 de maio de 2026

🔥☕ O SUBMUNDO DO Db2 z/OS — LOGS, RECOVERY E O QUE ACONTECE QUANDO O BANCO “MORRE” ☕🔥

 

Bellacosa Mainframe em uma visão sobre o LOG do DB2

🔥☕ O SUBMUNDO DO Db2 z/OS — LOGS, RECOVERY E O QUE ACONTECE QUANDO O BANCO “MORRE” ☕🔥

Existe um momento na vida de todo programador COBOL/Db2 em que ele descobre uma verdade assustadora:

O Db2 nunca esquece nada.

Cada:

  • INSERT,
  • UPDATE,
  • DELETE,
  • COMMIT,
  • ROLLBACK,
  • ALTER,
  • REORG,

deixa rastros.

E esses rastros vivem dentro de uma das estruturas mais importantes do ecossistema mainframe:

🔥 O LOG DO Db2.

Se você é programador COBOL pleno e acha que recovery é “coisa de DBA”, cuidado.

Porque no dia em que um:

-904
-911
-803
00C90084
RESOURCE UNAVAILABLE

explodir produção às 3h da manhã…

você vai descobrir que entender o log do Db2 muda completamente sua carreira.


☕ O QUE É O LOG DO Db2?

O log do Db2 é o “diário transacional” do banco.

Tudo que altera dados gera registros de log.

O Db2 escreve:

  • before image,
  • after image,
  • controle transacional,
  • checkpoints,
  • unidades de recuperação.

Basicamente:

ALTERAÇÃO → LOG → DISCO

Antes mesmo da página ser gravada no tablespace.


🔥 ACTIVE LOGS vs ARCHIVE LOGS

Aqui começa uma das maiores confusões dos iniciantes.

🔹 Active Logs

São os logs online e ativos.

Ficam sendo usados continuamente.

Eles armazenam:

  • alterações recentes,
  • transações em andamento,
  • recovery imediato.

São críticos.

Perder active log é pesadelo nível apocalipse.


🔹 Archive Logs

Quando active logs ficam cheios:

  • Db2 descarrega,
  • copia,
  • arquiva.

Esses logs históricos viram:

ARCHIVE LOGS

Eles são usados para:

  • PIT recovery,
  • auditoria,
  • rollback histórico,
  • disaster recovery.

☕ COMO O Db2 ESCREVE NO LOG?

Muita gente acha que Db2 grava direto no disco.

Não.

Primeiro ele grava em:

🔥 LOG BUFFERS

na memória.

Depois:

  • COMMIT,
  • checkpoint,
  • buffer cheio,
  • sync I/O,

forçam gravação nos:

ACTIVE LOG DATASETS

🔥 WRITE AHEAD LOGGING (WAL)

Aqui está o segredo do recovery moderno.

O Db2 segue:

🔥 WAL — Write Ahead Logging

Regra:

“O log precisa ser gravado ANTES da página do banco.”

Isso garante:

  • rollback,
  • redo,
  • recuperação consistente.

Sem isso:
💀 corrupção.


☕ O QUE ACONTECE NUM COMMIT?

Quando o programa COBOL faz:

EXEC SQL COMMIT END-EXEC

o Db2:

  1. sincroniza logs,
  2. confirma UOW,
  3. libera locks,
  4. torna alterações permanentes.

O COMMIT é basicamente:

🔥 “Agora isso virou verdade oficial.”


☕ E NUM ABEND?

Aqui entra o terror psicológico do DBA.

Se ocorre:

  • S0C7,
  • S878,
  • timeout,
  • deadlock,
  • cancel,
  • crash,
  • queda de LPAR,

o Db2 usa os logs para:

🔥 ROLLBACK

Ele desfaz tudo desde o último COMMIT.


🔥 TIPOS DE ERRO MAIS COMUNS


⚠️ SQLCODE -911 / -913

Deadlock ou timeout

Dois programas querem recursos incompatíveis.

Exemplo clássico:

  • batch segurando tabela,
  • online tentando atualizar.

DBA/Sysprog:

  • analisar locking,
  • IFCID,
  • traces,
  • IRLM,
  • timeout values.

Programador COBOL:

  • reduzir tempo entre commits,
  • melhorar SQL,
  • evitar scan gigante.

⚠️ SQLCODE -904

Resource unavailable

Tablespace parado.
Utility rodando.
Objeto indisponível.

DBA:

  • verificar STOP status,
  • utilities,
  • claim/drain,
  • locks.

Sysprog:

  • investigar subsystem,
  • storage,
  • I/O,
  • coupling facility.

⚠️ SQLCODE -803

Duplicate key

Programador tentou inserir chave já existente.

Programador:

  • validar lógica,
  • tratar concorrência,
  • revisar sequence/identity.

DBA:

  • verificar índice,
  • constraints,
  • integridade.

⚠️ SQLCODE -805

Package não encontrado

Clássico inferno de deploy.

DBA:

  • verificar BIND,
  • PLAN/PACKAGE,
  • consistency token.

Sysprog:

  • SDSNLOAD,
  • STEPLIB,
  • DBRM libraries.

Programador:

  • garantir promote correto.

⚠️ 00C90084

Log full

Aqui o DBA começa a envelhecer rapidamente.

O active log lotou.

Possíveis causas:

  • UOW gigante,
  • commit inexistente,
  • archive parado.

DBA:

  • verificar ARCHIVE process,
  • aumentar logs,
  • cancelar job problemático.

Programador:

  • COMMIT frequente,
  • evitar transação monstruosa.

☕ COMO FUNCIONA O RECOVERY?

Aqui mora a mágica do Db2.


🔥 FORWARD RECOVERY

Db2:

  1. restaura image copy,
  2. reaplica logs.

Resultado:
✅ banco volta até ponto desejado.


🔥 BACKOUT / ROLLBACK

Db2 usa:

  • before images,
  • undo records.

E desfaz alterações.


🔥 RESTART RECOVERY

Após crash do subsystem:

Db2:

  • lê logs,
  • identifica UOW incompletas,
  • faz undo/redo automático.

Muitas vezes o usuário nem percebe.


☕ O PAPEL DO DBA

O DBA é o “cirurgião do banco”.

Ele:

  • monitora logs,
  • executa RECOVER,
  • controla utilities,
  • administra image copies,
  • resolve locking,
  • acompanha catalog,
  • analisa performance.

Ferramentas clássicas:

  • DSN1LOGP,
  • RECOVER,
  • COPY,
  • REORG,
  • DISPLAY DATABASE,
  • DISPLAY LOG.

☕ O PAPEL DO SYSPROG

O Sysprog atua na infraestrutura pesada.

Ele cuida:

  • do subsystem Db2,
  • IRLM,
  • z/OS,
  • JES,
  • storage,
  • coupling facility,
  • datasets de log,
  • BSDS,
  • bootstrap datasets.

Se o DBA é cirurgião…
o Sysprog é engenheiro nuclear.


☕ O QUE O PROGRAMADOR COBOL PRECISA ENTENDER?

Muito mais do que imaginam.

Porque SQL ruim gera:

  • lock,
  • timeout,
  • log storm,
  • escalation,
  • crash recovery lento.

🔥 Um bom programador Db2:

✅ faz commit racional
✅ evita cursor infinito
✅ reduz scans
✅ trata SQLCODE corretamente
✅ entende UOW
✅ sabe impacto do rollback
✅ evita transações gigantes


☕ O MAIOR ERRO DOS INICIANTES

Achar que:

COMMIT é só “salvar”.

Não.

COMMIT é:

  • sincronização,
  • liberação de lock,
  • persistência,
  • checkpoint lógico,
  • controle de recovery.

É o coração do Db2 transacional.


🔥 CONCLUSÃO

O log do Db2 é praticamente:

🔥 a memória do banco.

Sem ele:

  • não existe rollback,
  • recovery,
  • integridade,
  • restart,
  • consistência.

Quando você entende:

  • active log,
  • archive log,
  • WAL,
  • UOW,
  • rollback,
  • recovery,

você deixa de ser apenas “quem escreve SELECT”.

E começa a pensar como:

  • DBA,
  • sysprog,
  • arquiteto transacional.

E no universo mainframe…

isso muda tudo. ☕🔥

segunda-feira, 28 de setembro de 2020

🔥☕ LABORATÓRIO DB2 z/OS — 20 PROBLEMAS REAIS DE PRODUÇÃO COM SOLUÇÕES ☕🔥

 

Bellacosa Mainframe te coloca a prova no uso do DB2 com labs praticos


🔥☕ LABORATÓRIO DB2 z/OS — 20 PROBLEMAS REAIS DE PRODUÇÃO COM SOLUÇÕES ☕🔥

“O DIA EM QUE O OPERADOR VIROU DETETIVE DO DB2”

Este laboratório foi inspirado no menu DB2 COMMANDS da sua tela SDSF/DB2I.

A ideia aqui é simular:

  • incidentes reais,
  • troubleshooting,
  • crises de produção,
  • panes de batch,
  • locks,
  • bufferpool,
  • utilities,
  • recovery,
  • gargalos,
  • runaway SQL.

Cada cenário possui:

  • 🚨 Problema
  • 🔍 Investigação
  • 💣 Diagnóstico
  • ✅ Solução
  • 🧠 Explicação técnica

🔥 LAB 01 — TABLESPACE PAROU

🚨 Problema

Aplicação CICS começou a falhar:

SQLCODE -904
RESOURCE UNAVAILABLE

🔍 Investigação

-DIS DATABASE(ESCOLA)

💣 Resultado

SPACENAM ALUNOS
STATUS STOP

✅ Solução

-START DATABASE(ESCOLA) SPACENAM(ALUNOS)

🧠 Explicação

O tablespace estava parado.

Pode ocorrer após:

  • utility abortada
  • falha de recovery
  • intervenção operacional

🔥 LAB 02 — LOCK GIGANTE

🚨 Problema

Usuários reclamam:

“Sistema congelou”


🔍 Investigação

-DIS THREAD(*) LOCKS

💣 Resultado

Uma thread batch segurando lock exclusivo.


✅ Solução

-CANCEL THREAD(token)

🧠 Explicação

A thread travou milhares de registros.

O cancel provoca rollback.


🔥 LAB 03 — BUFFERPOOL SATURADO

🚨 Problema

DB2 lento.

Muito I/O.


🔍 Investigação

-DIS BUFFERPOOL(BP0) DETAIL

💣 Resultado

HIT RATIO = 62%

✅ Solução

Aumentar VPSIZE.


🧠 Explicação

Cache pequeno.

DB2 lendo disco excessivamente.


🔥 LAB 04 — REORG PENDENTE

🚨 Problema

Performance degradada.


🔍 Investigação

-DIS DATABASE(FINANCE)

💣 Resultado

AREO*

✅ Solução

Executar REORG.


🧠 Explicação

Tabela fragmentada.

DB2 recomenda reorganização.


🔥 LAB 05 — COPY PENDING

🚨 Problema

INSERT falhando.


🔍 Investigação

-DIS DATABASE(PAGTO)

💣 Resultado

COPY PENDING

✅ Solução

Executar COPY utility.


🧠 Explicação

Objeto precisa backup válido.


🔥 LAB 06 — REBUILD PENDING

🚨 Problema

Índice corrompido.


🔍 Investigação

-DIS DATABASE(CLIENTE)

💣 Resultado

REBUILD PENDING

✅ Solução

REBUILD INDEX

🧠 Explicação

Indexspace precisa reconstrução.


🔥 LAB 07 — UTILITY TRAVADA

🚨 Problema

REORG nunca termina.


🔍 Investigação

-DIS UTIL(*)

💣 Resultado

Utility em WAIT.


✅ Solução

-TERM UTIL(utilid)

Reexecutar utility.


🧠 Explicação

Utility ficou presa aguardando recurso.


🔥 LAB 08 — LOG QUASE CHEIO

🚨 Problema

DB2 emitindo alertas.


🔍 Investigação

-DIS LOG

💣 Resultado

Active logs quase esgotados.


✅ Solução

  • aumentar logs
  • acelerar archive
  • reduzir commits longos

🧠 Explicação

Transações segurando log excessivamente.


🔥 LAB 09 — THREAD ZUMBI

🚨 Problema

Sessões antigas nunca encerram.


🔍 Investigação

-DIS THREAD(*) TYPE(INACTIVE)

💣 Resultado

Centenas de conexões JDBC abandonadas.


✅ Solução

Cancelar threads.

Ajustar timeout DDF.


🧠 Explicação

Pooling mal configurado.


🔥 LAB 10 — DDF FORA

🚨 Problema

Aplicações distribuídas não conectam.


🔍 Investigação

-DIS DDF

💣 Resultado

DDF STOPPED

✅ Solução

-START DDF

🧠 Explicação

DRDA estava parado.


🔥 LAB 11 — DEADLOCK

🚨 Problema

SQLCODE -911.


🔍 Investigação

-DIS THREAD(*) LOCKS

💣 Resultado

Duas aplicações disputando recursos.


✅ Solução

Identificar offender.

Cancelar thread problemática.


🧠 Explicação

Deadlock clássico de concorrência.


🔥 LAB 12 — RUNAWAY SQL

🚨 Problema

CPU do LPAR explodiu.


🔍 Investigação

-DIS THREAD(*) SERVICE(WAIT)

💣 Resultado

SELECT sem índice.


✅ Solução

Cancelar thread.

Criar índice.


🧠 Explicação

Full tablescan monstruoso.


🔥 LAB 13 — CLAIMERS SEGURANDO OBJETO

🚨 Problema

REORG não inicia.


🔍 Investigação

-DIS DATABASE(DB1) CLAIMERS

💣 Resultado

Aplicações usando objeto.


✅ Solução

Encerrar aplicações.


🧠 Explicação

Claims impedem drains.


🔥 LAB 14 — BUFFERPOOL ERRADO

🚨 Problema

Objeto crítico lento.


🔍 Investigação

-DIS BUFFERPOOL(*)

💣 Resultado

Objeto em BP inadequado.


✅ Solução

Mover para bufferpool maior.


🧠 Explicação

Pool incompatível com workload.


🔥 LAB 15 — MASSIVE ARCHIVE

🚨 Problema

Milhares de archive logs.


🔍 Investigação

-DIS ARCHIVE

💣 Resultado

Archive atrasado.


✅ Solução

Verificar HSM/tape/storage.


🧠 Explicação

Offload congestionado.


🔥 LAB 16 — START READ ONLY

🚨 Problema

Necessidade de manutenção.


✅ Solução

-START DATABASE(FINANCE) ACCESS(RO)

🧠 Explicação

Permite leitura sem updates.


🔥 LAB 17 — INDEX INDISPONÍVEL

🚨 Problema

Queries lentas.


🔍 Investigação

-DIS DATABASE(DB2PRD)

💣 Resultado

Indexspace STOPPED.


✅ Solução

-START DATABASE(DB2PRD)

🧠 Explicação

Optimizer perdeu acesso ao índice.


🔥 LAB 18 — UTILITIES CONCORRENTES

🚨 Problema

COPY e REORG competindo.


🔍 Investigação

-DIS UTIL(*)

💣 Resultado

Conflito operacional.


✅ Solução

Replanejar janela batch.


🧠 Explicação

Utilities disputam recursos físicos.


🔥 LAB 19 — DB2 EM RECOVER

🚨 Problema

Objeto indisponível.


🔍 Investigação

-DIS DATABASE(SEGURADORA)

💣 Resultado

STATUS RECOVER

✅ Solução

Executar RECOVER utility.


🧠 Explicação

Objeto inconsistente.


🔥 LAB 20 — O “FANTASMA” DO MAINFRAME

🚨 Problema

Sistema lento apenas à noite.


🔍 Investigação

-DIS THREAD(*)
-DIS UTIL(*)
-DIS LOG
-DIS BUFFERPOOL(*)

💣 Resultado

Batch gigantesco executando RUNSTATS + REORG + COPY simultaneamente.


✅ Solução

Separar janela batch.

Priorizar workloads.


🧠 Explicação

Concorrência destrutiva:

  • I/O
  • CPU
  • log
  • bufferpool
  • locks

🔥 DESAFIO EXTRA — COMANDOS PARA TREINAR

Diagnóstico rápido

-DIS THREAD(*)
-DIS UTIL(*)
-DIS LOG
-DIS BUFFERPOOL(*)
-DIS DATABASE(*)

Administração

-START DATABASE(DB1)
-STOP DATABASE(DB1)

Emergência

-CANCEL THREAD(token)
-TERM UTIL(utilid)

☕ O QUE ESSE LAB ENSINA

Esse tipo de troubleshooting desenvolve:

  • visão operacional
  • raciocínio rápido
  • análise de sintomas
  • entendimento interno do DB2
  • troubleshooting de produção
  • mentalidade de DBA z/OS

🔥 FRASE FINAL DO LAB

“No mundo distribuído você abre dashboards.
No mainframe você conversa diretamente com o coração do banco.” ☕💣

 

quinta-feira, 17 de fevereiro de 2011

🔥 SQLCODE no DB2 – Lendo os Sinais da Força (Guia para Padawans Mainframe) 🔥

 

SQLCODE quando o programa Cobol deve tratar o retorno do db2

🔥 SQLCODE no DB2 – Lendo os Sinais da Força (Guia para Padawans Mainframe) 🔥

 


Todo padawan que começa no DB2 passa pelo mesmo rito de iniciação:
o programa compila, o BIND passa…
e na execução surge aquela linha silenciosa e cruel:

SQLCODE = -911

Fim.
Tela verde.
Respiração suspensa.

Mas calma. SQLCODE não é inimigo.
Ele é o oráculo do DB2 — fala pouco, mas fala a verdade.


🧠 O Que é SQLCODE, de Verdade?

SQLCODE é a forma que o DB2 tem de dizer:

👉 “Eu tentei.”
👉 “Funcionou.”
👉 “Funcionou mais ou menos.”
👉 “Deu ruim.”

Cada comando SQL retorna um SQLCODE.
Sempre.
Sem exceção.

💡 Regra de ouro Bellacosa:
Nunca ignore SQLCODE.
Quem ignora SQLCODE, debuga em produção.


⚖️ Zero, Positivo ou Negativo – A Trindade Sagrada

🟢 SQLCODE = 0 → Tudo Certo

O DB2 está feliz.
Você também deveria estar.

  • SELECT encontrou linha

  • INSERT gravou

  • UPDATE atualizou

  • DELETE removeu

💡 Comentário:
Zero não é “talvez”.
Zero é sucesso absoluto.


🟡 SQLCODE > 0 → Aviso (Warning)

Aqui mora a confusão dos iniciantes.

Positivo não é erro.
É o DB2 dizendo:

“Funcionou… mas presta atenção.”

Exemplos clássicos:

  • +100 → nenhuma linha encontrada

  • +802 → divisão por zero evitada

  • +466 → truncate de dado

💡 Dica Padawan:
+100 em SELECT não é falha.
É lógica de negócio.

🥚 Easter egg:
Muitos sistemas tratam +100 como erro… e criam bugs por conta própria.


🔴 SQLCODE < 0 → Erro

Aqui o DB2 cruzou os braços.

Nada foi feito.
Ou pior: foi feito parcialmente.

Negativo significa:

  • SQL inválido

  • Dados inconsistentes

  • Lock

  • Timeout

  • Permissão

  • Conversão errada

💡 Regra Jedi:
SQLCODE negativo exige ação imediata.
Ignorar é lado sombrio.


🧨 SQLCODEs que Todo Padawan Precisa Conhecer

🔥 -100 → Nenhuma linha encontrada (antigo)

Hoje quase arqueologia.
Substituído por +100.


🔥 +100 → Nenhuma linha encontrada

Clássico do SELECT:

SELECT ... INTO ...

Sem registro.

💡 Dica:
Teste +100 como fluxo normal.
Não como exceção.


🔥 -305 → NULL sem indicador

DB2 tentou colocar NULL em campo COBOL “cheio de orgulho”.

💡 Lição:
Campo nullable exige indicador.


🔥 -302 → Conversão ou tamanho inválido

Número grande demais, decimal errado, CHAR mal definido.

💡 Fofoquinha:
90% dos -302 vêm de DCLGEN desatualizado.


🔥 -803 → Violação de chave única

Tentou inserir algo que já existe.

💡 Boa prática:
-803 não é erro técnico.
É regra de negócio.


🔥 -805 → DBRM / PACKAGE não encontrado

O terror noturno.

💡 Tradução Bellacosa:
“Esqueceu o BIND.”


🔥 -818 → Timestamp mismatch

Recompilou, mas não rebindeou.

💡 Comentário:
Esse erro ensina disciplina melhor que qualquer curso.


🔥 -911 / -913 → Deadlock ou Timeout

DB2 desistiu da briga.

💡 Dica Jedi:
Trate retry no código.
Não xingue o DB2 — ele só sobreviveu.


🧪 SQLERRD(3) – O Número que Poucos Olham

Dentro do SQLCA existe um tesouro esquecido:

👉 SQLERRD(3) = número de linhas afetadas

  • UPDATE

  • DELETE

  • INSERT

💡 Easter egg profissional:
Às vezes SQLCODE = 0…
mas SQLERRD(3) = 0.

Executou, mas não mudou nada.


⚙️ Tratamento de SQLCODE no COBOL – Boas Práticas

Nunca faça:

IF SQLCODE NOT = 0
   DISPLAY 'ERRO'
END-IF

Faça:

  • Trate 0

  • Trate +100

  • Trate negativos relevantes

💡 Dica Bellacosa:
SQLCODE é parte da lógica, não exceção.


🗣️ Fofoquices de Sala-Cofre

  • “Mas em QA funciona” → dado diferente

  • “Nunca deu isso antes” → agora deu

  • “É erro intermitente” → lock


🧠 Pensamento Final do El Jefe

SQLCODE é o idioma do DB2.
Quem não fala esse idioma:

  • culpa o banco

  • cria workaround perigoso

  • aprende do jeito difícil

🔥 Para o Padawan:
Leia o SQLCODE.
Entenda o contexto.
Respeite os avisos.

Porque no DB2,
o erro não grita — ele retorna um número. 🧠💾


sábado, 10 de março de 2007

O que são os Comandos EXEC e END-EXEC no COBOL?

 

Bellacosa Mainframe e os comandos EXEC e END-EXEC no cobol

O que são os Comandos EXEC e END-EXEC no COBOL?

Os comandos EXEC e END-EXEC são utilizados para delimitar instruções que não pertencem ao COBOL puro, mas sim a outros subsistemas integrados ao programa.

Eles funcionam como uma espécie de:

"porta de comunicação" entre o COBOL e outros ambientes.

Os mais comuns são:

  • CICS

  • DB2

  • SQL

  • IMS

  • MQ Series (IBM MQ)


Sintaxe básica

EXEC comando
END-EXEC

Ou:

EXEC subsistema
     instruções
END-EXEC

Por que existem?

O compilador COBOL não entende diretamente comandos SQL, CICS ou MQ.

Por isso, um pré-compilador analisa tudo que estiver entre:

EXEC

e

END-EXEC

e converte para chamadas que o COBOL consegue executar.


Fluxo simplificado

Programa COBOL
       ↓
Pré-compilador
       ↓
CICS / DB2 / MQ
       ↓
Programa objeto

EXEC CICS

Uma das utilizações mais famosas.

Permite acessar o ambiente CICS.


Exemplo

EXEC CICS
     SEND
     TEXT('OLA CLIENTE')
END-EXEC

O que acontece?

O CICS envia uma mensagem para a tela do usuário.


Outro exemplo CICS

EXEC CICS
     RETURN
END-EXEC

Retorna o controle ao CICS.


EXEC SQL

Utilizado para acessar bancos de dados DB2.


Exemplo

EXEC SQL

    SELECT NOME
      INTO :WS-NOME
      FROM CLIENTES
     WHERE CPF = :WS-CPF

END-EXEC

O que acontece?

O DB2 executa o SELECT e retorna os dados para a variável COBOL.


Exemplo INSERT

EXEC SQL

    INSERT INTO CLIENTES
           (CPF,NOME)
    VALUES
           (:WS-CPF,
            :WS-NOME)

END-EXEC

Exemplo UPDATE

EXEC SQL

   UPDATE CLIENTES
      SET SALDO = :WS-SALDO
    WHERE CPF   = :WS-CPF

END-EXEC

Exemplo DELETE

EXEC SQL

   DELETE
     FROM CLIENTES
    WHERE CPF = :WS-CPF

END-EXEC

Host Variables

Observe os dois pontos:

:WS-NOME

Essas são:

Host Variables

Variáveis COBOL usadas pelo DB2.


EXEC SQL INCLUDE

Muito comum.

EXEC SQL
    INCLUDE SQLCA
END-EXEC

O que é SQLCA?

Área de comunicação entre:

COBOL
   ↔
DB2

Exemplo SQLCODE

IF SQLCODE = 0

Consulta realizada com sucesso.


EXEC IMS

Usado em aplicações IMS.


Exemplo:

EXEC DLI
     GU
END-EXEC

EXEC MQ

Utilizado para IBM MQ.


Exemplo

EXEC MQPUT
END-EXEC

ou

EXEC MQGET
END-EXEC

END-EXEC

Marca o fim do comando especial.


Exemplo

EXEC SQL
    COMMIT
END-EXEC

Sem END-EXEC o compilador não sabe onde termina a instrução.


Antigamente

Versões antigas utilizavam:

EXEC SQL
   SELECT ...

com ponto final.

Hoje o padrão é:

END-EXEC

Exemplo completo DB2

WORKING-STORAGE SECTION.

01 WS-NOME PIC X(30).

EXEC SQL
   INCLUDE SQLCA
END-EXEC.

PROCEDURE DIVISION.

EXEC SQL

   SELECT NOME
      INTO :WS-NOME
      FROM CLIENTES
     WHERE CPF = '12345678901'

END-EXEC

DISPLAY WS-NOME

Exemplo completo CICS

EXEC CICS
     RECEIVE MAP('TELA1')
END-EXEC

Recebe dados digitados pelo usuário.


EXEC CICS
     SEND MAP('TELA2')
END-EXEC

Envia dados para tela.


O que o compilador faz?

Durante a compilação:

EXEC SQL

não é executado diretamente.

Primeiro ocorre:

Pré-compilação DB2

Depois:

Compilação COBOL

Fluxo DB2

Fonte COBOL
     ↓
Pré-compilador SQL
     ↓
Fonte COBOL expandido
     ↓
Compilador COBOL
     ↓
Link Edit

Onde mais aparece?

CICS

EXEC CICS

DB2

EXEC SQL

IMS

EXEC DLI

MQ

EXEC MQ

Curiosidades

1. EXEC SQL é provavelmente a forma mais usada de EXEC no mundo Mainframe


2. Todo programa COBOL/DB2 passa por pré-compilação


3. EXEC CICS é a base das aplicações online bancárias


4. Milhões de transações por segundo utilizam EXEC CICS e EXEC SQL


Erros comuns de iniciantes

Esquecer END-EXEC


Não incluir SQLCA


Não declarar host variables


Confundir SQLCODE com RETURN-CODE


Resumo rápido

ComandoFunção
EXEC SQLAcesso DB2
EXEC CICSAcesso CICS
EXEC DLIAcesso IMS
EXEC MQAcesso IBM MQ
END-EXECFinaliza instrução
SQLCAComunicação DB2
SQLCODERetorno SQL

Conclusão

Os comandos EXEC e END-EXEC são delimitadores utilizados para integrar programas COBOL com subsistemas do Mainframe, como CICS, DB2, IMS e IBM MQ. Eles permitem que o COBOL execute comandos externos especializados, tornando possível criar aplicações online, acessar bancos de dados e integrar sistemas corporativos executados no ambiente IBM Z.