| Bellacosa Mainframe apresenta o comando Perform em COBOL |
🔥 PERFORM no COBOL: você manda ou ele manda em você?
(Um café no Bellacosa Mainframe, para padawans e cavaleiros Jedi do z/OS)
Você já deu o spoiler certo: PERFORM é o maestro do COBOL.
Quem domina PERFORM escreve código legível, previsível, auditável e aceito em produção.
Quem não domina… acaba criando um GO TO disfarçado com terno e gravata 😅
Vamos organizar, aprofundar e elevar o nível do que você trouxe — com exemplos reais, pegadinhas, DB2, CICS e dicas de campo.
| COBOL e o Perform |
🧠 Origem e filosofia do PERFORM
Nos anos 70, COBOL sofreu com o “spaghetti code” (muito GO TO).
O PERFORM surgiu como a resposta estruturada, permitindo:
-
Modularidade
-
Fluxo previsível
-
Testabilidade
-
Facilidade de manutenção (sim, o auditor agradece)
👉 Regra de ouro mainframe:
“Se dá pra fazer com PERFORM, NÃO use GO TO.”
| Comando Perform e suas variações em COBOL |
📌 O que faz
Executa um parágrafo uma única vez.
PERFORM 0100-CALCULA-IMPOSTO
🧪 Exemplo real
0100-CALCULA-IMPOSTO. COMPUTE WS-IMPOSTO = WS-VALOR * 0.15. 0100-EXIT. EXIT.
💡 Dica Bellacosa
-
Sempre crie o
-EXIT -
Facilita debug, tracing e manutenção futura
2️⃣ PERFORM VARYING — o FOR do COBOL
📌 O que faz
Loop com contador explícito.
PERFORM VARYING WS-CONT FROM 1 BY 1 UNTIL WS-CONT > 10 PERFORM 0300-PROCESSA-REGISTRO END-PERFORM
🧪 Exemplo com tabela interna
PERFORM VARYING IDX FROM 1 BY 1 UNTIL IDX > WS-QTDE MOVE WS-TABELA(IDX) TO WS-REG PERFORM 0400-VALIDA-DADO END-PERFORM
⚠️ Pegadinha clássica
❌ Alterar WS-CONT dentro do parágrafo executado
✔️ Deixe o controle só no PERFORM
3️⃣ PERFORM UNTIL — o rei da leitura de arquivos
📌 O que faz
Repete até a condição ser verdadeira
(atenção: condição é avaliada antes)
PERFORM UNTIL WS-FIM = 'SIM' READ ARQ-ENTRADA AT END MOVE 'SIM' TO WS-FIM NOT AT END PERFORM 0500-PROCESSA-REG END-READ END-PERFORM
🧠 Padrão mainframe clássico
-
Batch
-
VSAM
-
Sequential files
-
DB2 cursors (já já)
4️⃣ PERFORM TIMES — simples, direto e elegante
📌 O que faz
Executa um bloco N vezes, sem contador explícito.
PERFORM 12 TIMES ADD 1 TO WS-TOTAL END-PERFORM
📌 Quando usar
-
Simulações
-
Inicializações
-
Processos fixos
❌ Quando NÃO usar
-
Quando você precisa do índice (use VARYING)
5️⃣ PERFORM THRU — tradição mainframe raiz 🧓💾
📌 O que faz
Executa uma sequência contínua de parágrafos
PERFORM 1000-INICIALIZA THRU 1099-INICIALIZA-EXIT
🧪 Estrutura clássica
1000-INICIALIZA. OPEN INPUT ARQ-ENTRADA PERFORM 1100-CARREGA-PARAMETROS. 1099-INICIALIZA-EXIT. EXIT.
⚠️ Regra sagrada
Nunca coloque código fora da sequência THRU
Senão…
🔥 comportamento imprevisível
🔥 bugs fantasma
🔥 chamado em produção às 3h da manhã
🟦 PERFORM + DB2 (exemplo real)
Cursor com PERFORM UNTIL
PERFORM UNTIL SQLCODE NOT = 0 EXEC SQL FETCH C1 INTO :WS-COL1, :WS-COL2 END-EXEC IF SQLCODE = 0 PERFORM 2000-PROCESSA-LINHA END-IF END-PERFORM
👉 Padrão de ouro DB2 COBOL
🟩 PERFORM + CICS
PERFORM 3000-VALIDA-MAP PERFORM 3100-PROCESSA-NEGOCIO PERFORM 3200-ENVIA-RESPOSTA
✔ Modular
✔ Legível
✔ Fácil de testar
🧨 Erros comuns em produção
| Erro | Impacto |
|---|---|
| PERFORM THRU mal delimitado | Execução inesperada |
| Alterar contador no parágrafo | Loop infinito |
| Falta de EXIT | Debug caótico |
| GO TO misturado com PERFORM | Código ilegível |
🧙 Curiosidades & Easter Eggs
🥚 Em COBOL antigo, PERFORM THRU era o padrão absoluto
🥚 Auditores AMAM código com PERFORM bem estruturado
🥚 Muitos shops ainda proíbem GO TO por norma interna
🥚 PERFORM é um dos motivos do COBOL sobreviver tão bem até hoje
🎓 Regra final para padawans
Se você entende PERFORM, você entende o fluxo do COBOL.
Se entende o fluxo, domina Batch, DB2 e CICS.







