Translate

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

sábado, 9 de dezembro de 2023

SQL sem Mistérios no Db2 for z/OS

 

Bellacosa Mainframe e o sql sem misterios no db2 for z/os

☕ Um Café no Bellacosa Mainframe

SQL sem Mistérios no Db2 for z/OS

A Jornada Completa de uma Query no IBM Z — O Guia Definitivo do Programador COBOL Padawan Inspirado em Jornada nas Estrelas

"A lógica é o começo da sabedoria, não o fim."

— Sr. Spock


Introdução — Bem-vindo à USS Enterprise... digo... ao IBM Z

Imagine que você acabou de embarcar na USS Enterprise.

Você é um jovem cadete da Academia da Frota Estelar.

Seu trabalho não é pilotar a nave.

Também não é disparar phasers.

Sua missão é muito mais importante.

Você precisa descobrir como um simples pedido chega ao computador da nave, é analisado, processado e retorna em poucos milissegundos.

No universo Star Trek, esse computador responde perguntas como:

"Computador, localizar todos os oficiais Vulcanos da nave."

No mundo corporativo existe outro computador igualmente impressionante.

Ele atende pelo nome de IBM Z.

E seu cérebro de dados chama-se Db2 for z/OS.

Quando um programa COBOL executa um simples:

SELECT *
FROM CLIENTE
WHERE CPF='12345678900'

A maioria dos iniciantes imagina algo parecido com isto:

"O Db2 abriu a tabela, procurou o CPF e devolveu o registro."

Se fosse tão simples, este artigo terminaria aqui.

Mas...

Na realidade, entre o momento em que o programa envia o SQL e o momento em que os dados retornam, acontece uma verdadeira operação digna da Frota Estelar.

São dezenas de decisões inteligentes.

Milhares de estatísticas.

Análises matemáticas.

Escolha de estratégias.

Gerenciamento de memória.

Uso de caches.

Escolha de índices.

Controle de concorrência.

Tudo isso acontece quase instantaneamente.

Hoje vamos fazer uma viagem completa por essa jornada.

Prepare seu café.

Dr. Spock será nosso guia.


Capítulo 1 — O Computador Nunca Faz Apenas o Que Você Escreveu

Existe um dos maiores mitos entre iniciantes.

"Eu escrevi primeiro o SELECT."

Então ele executa primeiro.

Errado.

Na verdade, o Db2 praticamente ignora a ordem em que você escreveu.

Ele interpreta a intenção da consulta.

Depois decide sozinho como obter o resultado da forma mais eficiente possível.

É exatamente como Spock faria.

Se Kirk diz:

"Chegue até Vulcano."

Spock não pergunta:

"Qual estrada devo pegar?"

Ele calcula:

  • combustível

  • gravidade

  • buracos negros

  • campos de dobra

  • rotas inimigas

  • economia de energia

O destino é o mesmo.

O caminho muda.

O Db2 pensa exatamente assim.


Capítulo 2 — A Ponte de Comando do Db2

Imagine a ponte da Enterprise.

Cada oficial possui uma função.

No Db2 também.

OficialComponente Db2
Capitão KirkAplicação COBOL
Sr. SpockOptimizer
ScottyBuffer Manager
UhuraSQL Parser
SuluAccess Path
ChekovIndex Manager
ComputadorBuffer Pools
EngenhariaDisk Storage

O COBOL faz a pergunta.

Spock decide a melhor estratégia.

Scotty garante que tudo funcione.

O computador responde.


Capítulo 3 — A Missão Começa: EXEC SQL

Tudo começa aqui.

EXEC SQL

SELECT NOME

INTO :WS-NOME

FROM CLIENTES

WHERE CPF=:WS-CPF

END-EXEC.

Parece simples.

Mas isso ainda nem é SQL.

O COBOL sequer entende SQL.

Quem entende é o Pré-compilador.


Capítulo 4 — O Tradutor Universal

Antes da compilação acontece algo exclusivo do mundo Mainframe.

O famoso:

Pré-Compiler.

Ele encontra cada bloco EXEC SQL.

Substitui por chamadas internas.

Gera o famoso:

DBRM

(Database Request Module)

Este DBRM será utilizado posteriormente no BIND.

Curiosidade:

Oracle não trabalha assim.

SQL Server também não.

Este é um dos diferenciais históricos do Db2 z/OS.


Capítulo 5 — O Conselho Vulcano: BIND

Aqui mora uma das maiores diferenças entre o Db2 e praticamente todos os bancos relacionais.

O comando:

BIND PACKAGE

é como uma reunião do Alto Conselho Vulcano.

O Db2 olha para a consulta e pensa:

"Se esta SQL for executada milhões de vezes, qual será o melhor caminho?"

Ele cria um PACKAGE, contendo o plano de acesso ideal para aquele momento.

É aqui que nasce o famoso Access Path.


Capítulo 6 — O Dr. Spock Analisa as Probabilidades

Imagine duas tabelas.

CLIENTES

50 milhões de linhas.

ESTADOS

27 linhas.

Você faria o JOIN começando por qual?

Até um cadete responderia:

ESTADOS.

Mas...

Como o Db2 sabe disso?

A resposta chama-se:

RUNSTATS.


Capítulo 7 — RUNSTATS: Os Sensores de Longo Alcance

Os sensores da Enterprise informam:

  • quantas naves existem;

  • velocidade;

  • distância;

  • massa.

O RUNSTATS faz exatamente isso.

Ele informa ao Optimizer:

  • quantidade de linhas;

  • cardinalidade;

  • distribuição;

  • frequência;

  • seletividade;

  • clustering;

  • número de páginas;

  • estatísticas dos índices.

Sem RUNSTATS...

O Optimizer fica praticamente cego.

E um Spock sem sensores toma decisões muito piores.


Capítulo 8 — Álgebra Relacional: O Idioma Secreto do Computador

Depois que o SQL é validado, ele deixa de existir como texto.

Internamente transforma-se em Álgebra Relacional.

Por exemplo:

SELECT NOME
FROM CLIENTES
WHERE CIDADE='SP'

vira algo semelhante a:

σ Cidade='SP'

↓

π Nome

↓

CLIENTES

Ou seja:

primeiro seleciona.

Depois projeta.

O SQL desaparece.

Nasce um plano matemático.


Capítulo 9 — O Optimizer: O Verdadeiro Sr. Spock do IBM Z

Se existe um personagem que representa perfeitamente o Optimizer...

é o próprio Spock.

Ele nunca trabalha por emoção.

Somente lógica.

Ele calcula:

  • custo de CPU;

  • custo de I/O;

  • uso de Buffer Pools;

  • seletividade dos índices;

  • paralelismo;

  • volume esperado;

  • quantidade de páginas;

  • custo de SORT;

  • bloqueios.

Depois escolhe o menor custo possível.

Nem sempre será o caminho mais curto.

Será o mais eficiente.


Capítulo 10 — A Ordem Lógica da Consulta

Agora chegamos ao famoso diagrama.

Embora escrevamos:

SELECT

FROM

JOIN

ON

WHERE

GROUP BY

HAVING

ORDER BY

FETCH FIRST

O Db2 raciocina assim:

FROM

↓

JOIN

↓

ON

↓

WHERE

↓

GROUP BY

↓

HAVING

↓

SELECT

↓

ORDER BY

↓

FETCH FIRST

Mas cuidado.

Isto ainda não representa a ordem física.

Ela continua sendo decidida pelo Optimizer.


Capítulo 11 — O Access Path: A Rota Estelar

Aqui está o segredo.

O Db2 pode resolver exatamente a mesma SQL de dezenas de maneiras diferentes.

Ele escolhe entre:

  • Table Space Scan;

  • Index Scan;

  • Index Only Access;

  • List Prefetch;

  • Dynamic Prefetch;

  • Sequential Detection;

  • Nested Loop Join;

  • Merge Scan Join;

  • Hybrid Join;

  • Star Join;

  • Parallelism;

  • Materialized Query Table;

  • Sparse Index.

É como escolher diferentes rotas pelo Quadrante Alfa.

O destino é igual.

O caminho muda.


Capítulo 12 — O Buffer Pool: O Scotty da Memória

Scotty sempre dizia:

"Captain, I'm giving her all she's got!"

O Buffer Pool faz exatamente isso.

Antes de acessar o disco...

Ele pergunta:

"Essa página já está na memória?"

Se estiver...

Não existe I/O.

A resposta vem em microssegundos.

Grande parte do desempenho do Db2 depende da eficiência dos Buffer Pools.


Capítulo 13 — Os Predicados Stage 1 e Stage 2

Aqui existe uma armadilha clássica.

Observe:

WHERE YEAR(DATA)=2026

Parece bonito.

Mas destrói o uso do índice.

Muito melhor:

WHERE DATA BETWEEN
'2026-01-01'
AND
'2026-12-31'

No primeiro caso:

Stage 2.

No segundo:

Stage 1.

O primeiro costuma obrigar o Db2 a avaliar linha por linha.

O segundo permite filtrar diretamente pelo índice.

Dica Bellacosa: sempre que possível, escreva predicados que possam ser avaliados durante o acesso aos dados. Essa é uma das otimizações mais valiosas para quem desenvolve em COBOL com Db2.


Capítulo 14 — EXPLAIN: A Caixa-Preta da Enterprise

Nenhum engenheiro sério tenta descobrir um problema apenas olhando para a nave.

Ele consulta os sensores.

No Db2 fazemos exatamente isso.

Utilizamos:

EXPLAIN

Ele revela:

  • qual índice foi escolhido;

  • ordem dos JOINs;

  • tipo de acesso;

  • custo estimado;

  • necessidade de SORT;

  • paralelismo;

  • número estimado de linhas.

Nunca adivinhe.

Sempre consulte o plano.


Capítulo 15 — Locks: O Controle de Segurança da Federação

Enquanto tudo acontece...

O Db2 protege os dados.

Existem diversos tipos de bloqueio:

  • IS (Intent Share)

  • IX (Intent Exclusive)

  • S (Share)

  • U (Update)

  • X (Exclusive)

  • SIX (Share with Intent Exclusive)

Além disso, os níveis de isolamento (UR, CS, RS e RR) determinam o equilíbrio entre concorrência e consistência. Em sistemas bancários e de cartões de crédito, essa gestão é essencial para evitar leituras incorretas, perdas de atualização e conflitos entre milhares de transações simultâneas.


Capítulo 16 — Paralelismo: Quando a Enterprise Usa Toda a Tripulação

Em grandes consultas analíticas, o Db2 pode dividir o trabalho.

Imagine:

CPU 1 lê uma partição.

CPU 2 lê outra.

CPU 3 realiza o JOIN.

CPU 4 faz a agregação.

No IBM Z isso acontece utilizando múltiplos processadores e, em muitos cenários, explorando zIIPs para determinadas cargas elegíveis, reduzindo o impacto sobre os CPs tradicionais.


Capítulo 17 — Quando Fazer REBIND?

Imagine que a Enterprise recebeu um novo motor de dobra.

Você continuaria usando os cálculos antigos?

Claro que não.

No Db2 acontece o mesmo.

Após mudanças significativas, como:

  • criação de índices;

  • remoção de índices;

  • crescimento expressivo das tabelas;

  • execução de RUNSTATS;

  • alterações na distribuição dos dados;

vale analisar um REBIND PACKAGE ou REBIND PLAN, permitindo que o Optimizer recalcule um novo Access Path mais eficiente.


Capítulo 18 — O Programador COBOL Jedi... ou Vulcano?

Existe um momento em que o programador deixa de escrever SQL "que funciona".

E começa a escrever SQL "que escala".

Ele passa a pensar:

  • Meu predicado usa índice?

  • Meu JOIN é seletivo?

  • O EXPLAIN confirma minha hipótese?

  • As estatísticas estão atualizadas?

  • O SORT pode ser eliminado?

  • Estou lendo mais linhas do que preciso?

  • O FETCH FIRST pode reduzir trabalho?

  • Existe uma forma mais eficiente de escrever esta consulta?

Esse é o verdadeiro salto de maturidade.


Easter Egg Bellacosa ☕

No episódio "The Ultimate Computer", a Enterprise recebe o computador M-5, projetado para tomar decisões automaticamente.

No começo, tudo parece perfeito.

Depois surgem consequências inesperadas.

O Db2 Optimizer lembra um pouco essa história.

Ele toma decisões sozinho, mas depende da qualidade das informações que recebe.

Se as estatísticas estiverem desatualizadas, um índice importante não existir ou o modelo físico estiver inadequado, até um excelente otimizador poderá escolher um plano ruim.

A diferença é que, felizmente, o Optimizer não tenta assumir o comando da Enterprise nem entra em combate por conta própria.


Curiosidades

  • O Db2 for z/OS está entre os bancos de dados com os otimizadores mais sofisticados do mercado, evoluindo continuamente desde a década de 1980.

  • Um único SELECT pode gerar dezenas de operações internas invisíveis ao desenvolvedor.

  • Em ambientes de missão crítica, o mesmo SQL pode ser executado milhões de vezes por dia, tornando pequenas otimizações responsáveis por economias enormes de CPU e tempo.

  • Muitos problemas de desempenho atribuídos ao COBOL, na verdade, são consequência de SQL mal escrito ou de um plano de acesso inadequado.


Conclusão — A Lógica é a Maior Aliada do Programador

Ao final desta jornada, descobrimos que uma instrução SQL percorre um caminho muito maior do que imaginávamos. Ela nasce no programa COBOL, passa pelo pré-compilador, gera um DBRM, é ligada a PACKAGEs e PLANs durante o BIND, tem seu plano analisado pelo Optimizer, consulta estatísticas produzidas pelo RUNSTATS, escolhe um Access Path, utiliza Buffer Pools, controla bloqueios, decide estratégias de JOIN e somente então retorna os dados solicitados.

Para um programador COBOL Padawan, compreender essa sequência é um divisor de águas. Você deixa de enxergar o Db2 como uma simples "caixa-preta" e passa a entendê-lo como um verdadeiro computador da Frota Estelar: um sistema que utiliza lógica, estatística e otimização para tomar a melhor decisão possível a cada consulta.

Como diria o Sr. Spock, "A lógica é o começo da sabedoria, não o fim." No universo do IBM Z, essa lógica está presente em cada SELECT, em cada índice e em cada plano de acesso. Quanto melhor você compreender esse funcionamento, mais preparado estará para construir aplicações COBOL rápidas, escaláveis e confiáveis — dignas de uma missão de cinco anos explorando as fronteiras da computação corporativa.

sábado, 1 de julho de 2023

☕ SQL NO MAINFRAME: MUITO ALÉM DO SELECT

 

Bellacosa Mainframe e o SQL no Mainframe muito alem do select



☕ SQL NO MAINFRAME: MUITO ALÉM DO SELECT

Como Dominar os Fundamentos de SQL no DB2 13 for z/OS

Quando alguém abre o SPUFI, Data Studio, DBeaver ou qualquer ferramenta SQL pela primeira vez, normalmente executa algo simples:

SELECT *
FROM CLIENTES;

A consulta retorna dados.

O usuário sorri.

Acredita que aprendeu SQL.

Mas na realidade acabou de dar apenas o primeiro passo de uma longa jornada.

No universo Mainframe, SQL é a língua falada entre:

  • COBOL

  • CICS

  • IMS

  • Java

  • Web Services

  • APIs REST

  • z/OS Connect

  • Analytics

  • Inteligência Artificial

Todo sistema corporativo moderno passa por SQL em algum momento.

E o DB2 13 elevou ainda mais essa importância.


A HISTÓRIA QUE TODO PROFISSIONAL DE MAINFRAME DEVERIA CONHECER

Antes do SQL, bancos relacionais eram apenas uma teoria.

Em 1970, Edgar F. Codd publicou um artigo revolucionário na IBM:

A Relational Model of Data for Large Shared Data Banks

Esse trabalho mudou a computação.

A ideia era simples:

Ao invés de navegar registros fisicamente, os usuários deveriam dizer:

"Quero estes dados."

E o banco decidiria:

"Eu descubro a melhor forma de encontrá-los."

Nascia o conceito de SQL.

Décadas depois, essa filosofia continua viva dentro do DB2 13.


O QUE É SQL?

SQL significa:

Structured Query Language

Ou:

Linguagem Estruturada de Consulta

Ela permite:

  • Consultar dados

  • Inserir dados

  • Alterar dados

  • Excluir dados

  • Criar estruturas

  • Gerenciar segurança

Praticamente tudo que fazemos no DB2 passa por SQL.


OS QUATRO GRANDES GRUPOS DE COMANDOS SQL

DQL – Data Query Language

Consulta de dados.

Exemplo:

SELECT *
FROM FUNCIONARIOS;

DML – Data Manipulation Language

Manipulação de registros.

INSERT INTO FUNCIONARIOS
VALUES
(100,'CARLOS');
UPDATE FUNCIONARIOS
SET SALARIO = 5000
WHERE MATRICULA = 100;
DELETE
FROM FUNCIONARIOS
WHERE MATRICULA = 100;

DDL – Data Definition Language

Definição das estruturas.

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

DCL – Data Control Language

Controle de segurança.

GRANT SELECT
ON CLIENTES
TO USER01;

A TABELA É O CORAÇÃO DO DB2

Imagine um arquivo VSAM KSDS.

Agora imagine esse conceito evoluído.

Uma tabela é composta por:

  • Linhas

  • Colunas

  • Relacionamentos

  • Índices

  • Constraints

Exemplo:

IDNOMECIDADE
1ANASÃO PAULO
2JOÃOSANTOS
3MARIARIO

Essa simplicidade aparente esconde uma enorme complexidade de armazenamento.


SUA PRIMEIRA CONSULTA DE VERDADE

O erro mais comum é usar:

SELECT *
FROM CLIENTES;

Em produção isso costuma ser um desastre.

O profissional experiente utiliza:

SELECT
    ID,
    NOME,
    CIDADE
FROM CLIENTES;

Por quê?

Porque reduz:

  • I/O

  • CPU

  • Network Traffic

  • Uso de buffer pools

No DB2 13 isso continua sendo uma das melhores práticas.


APRENDENDO A FILTRAR DADOS

O poder real surge com o WHERE.

SELECT
    NOME
FROM CLIENTES
WHERE CIDADE = 'SANTOS';

Sem WHERE:

SCAN TOTAL

Com WHERE:

BUSCA DIRECIONADA

Diferença gigantesca.

Principalmente em tabelas com bilhões de linhas.


OPERADORES MAIS UTILIZADOS

Igualdade

WHERE ID = 100

Diferente

WHERE ID <> 100

Maior

WHERE SALARIO > 10000

Menor

WHERE SALARIO < 5000

Intervalo

WHERE SALARIO
BETWEEN 5000 AND 10000

Lista

WHERE CIDADE
IN ('SANTOS','CAMPINAS')

LIKE: A ARMA SECRETA DOS ANALISTAS

SELECT *
FROM CLIENTES
WHERE NOME LIKE 'MAR%';

Retorna:

  • MARIA

  • MARCOS

  • MARCELO

Mas atenção.

LIKE mal utilizado pode destruir a performance.

Exemplo ruim:

LIKE '%MAR%'

O otimizador normalmente perde a possibilidade de usar índices eficientemente.


ORDER BY

Organizando resultados.

SELECT
NOME,
SALARIO
FROM FUNCIONARIOS
ORDER BY SALARIO DESC;

Maior salário primeiro.

Muito simples.

Muito poderoso.

Muito custoso quando mal utilizado.


DISTINCT

Eliminando duplicidades.

SELECT DISTINCT
CIDADE
FROM CLIENTES;

Resultado:

SANTOS
CAMPINAS
RIO

Sem repetições.


CONTANDO REGISTROS

Todo DBA utiliza:

SELECT COUNT(*)
FROM CLIENTES;

Mas poucos iniciantes sabem que em tabelas gigantes isso pode gerar leituras enormes.

Por isso estatísticas e catálogos do DB2 também são utilizados para estimativas.


FUNÇÕES DE AGREGAÇÃO

Soma

SELECT SUM(VALOR)
FROM VENDAS;

Média

SELECT AVG(SALARIO)
FROM FUNCIONARIOS;

Máximo

SELECT MAX(SALARIO)
FROM FUNCIONARIOS;

Mínimo

SELECT MIN(SALARIO)
FROM FUNCIONARIOS;

GROUP BY: ONDE O SQL COMEÇA A FICAR INTERESSANTE

Exemplo:

SELECT
CIDADE,
COUNT(*)
FROM CLIENTES
GROUP BY CIDADE;

Resultado:

CidadeQuantidade
Santos1200
São Paulo5800
Campinas900

Aqui começamos a transformar dados em informação.


HAVING

Filtrando grupos.

SELECT
CIDADE,
COUNT(*)
FROM CLIENTES
GROUP BY CIDADE
HAVING COUNT(*) > 1000;

Somente cidades relevantes aparecem.


JOINS: O SUPERPODER DO SQL

Aqui nasce o verdadeiro banco relacional.

Tabela CLIENTES:

IDNOME
1ANA

Tabela PEDIDOS:

PEDIDOID_CLIENTE
1001

Consulta:

SELECT
C.NOME,
P.PEDIDO
FROM CLIENTES C
INNER JOIN PEDIDOS P
ON C.ID = P.ID_CLIENTE;

Resultado:

ANA 100

Magia?

Não.

Modelo relacional.


INNER JOIN

Retorna apenas correspondências.

INNER JOIN

É o JOIN mais utilizado do mundo.


LEFT JOIN

Mantém todos os registros da esquerda.

LEFT JOIN

Mesmo sem correspondência.

Muito usado em auditorias.


SUBSELECTS

Uma consulta dentro da outra.

SELECT *
FROM FUNCIONARIOS
WHERE SALARIO >
(
SELECT AVG(SALARIO)
FROM FUNCIONARIOS
);

Funcionários acima da média.

Excelente exemplo de lógica relacional.


SQL E COBOL: UMA DUPLA IMBATÍVEL

Em Mainframe o SQL raramente vive sozinho.

Exemplo Embedded SQL:

EXEC SQL
SELECT NOME
INTO :WS-NOME
FROM CLIENTES
WHERE ID = :WS-ID
END-EXEC.

Esse padrão movimenta bancos, seguradoras, governos e bolsas de valores há décadas.


O PAPEL DO BIND

Iniciantes aprendem SQL.

Profissionais Mainframe aprendem:

  • Pré-compilação

  • DBRM

  • PACKAGE

  • PLAN

  • BIND

Sem isso o SQL não chega à produção.


O OTIMIZADOR: O CÉREBRO DO DB2

O usuário escreve:

SELECT *
FROM CLIENTES
WHERE ID = 100;

O DB2 pergunta:

  • Uso índice?

  • Faço scan?

  • Quantas páginas?

  • Quanto CPU?

Esse processo é chamado:

Access Path Selection

É aqui que a mágica acontece.


EXPLAIN: O RAIO-X DA CONSULTA

Nunca confie apenas porque uma consulta funciona.

Verifique o plano.

EXPLAIN PLAN FOR
SELECT *
FROM CLIENTES;

O DB2 mostrará:

  • Índices usados

  • Custo estimado

  • Estratégias de acesso

DBAs vivem nessa análise.


O QUE MUDA NO DB2 13?

O DB2 13 trouxe avanços importantes:

Melhor exploração de estatísticas

O otimizador toma decisões mais inteligentes.

Melhor uso de CPU

Redução de consumo em workloads intensos.

Aprimoramentos em SQL Analytics

Funções analíticas mais eficientes.

Melhor integração híbrida

Conectividade moderna com APIs e aplicações distribuídas.

Evolução contínua do Machine Learning para otimização

Capacidade crescente de melhorar decisões de acesso com base em padrões observados.


ERROS CLÁSSICOS DOS INICIANTES

SELECT *

Evite.


Falta de índice

Performance despenca.


WHERE inadequado

Full table scan.


JOIN sem critério

Explosão de registros.


UPDATE sem WHERE

O terror dos DBAs.

UPDATE CLIENTES
SET STATUS='A';

Toda tabela alterada.

Acidente clássico.


O CAMINHO PARA VIRAR ESPECIALISTA

Etapa 1

Dominar SELECT.


Etapa 2

Dominar filtros.


Etapa 3

Dominar JOINs.


Etapa 4

Entender índices.


Etapa 5

Aprender EXPLAIN.


Etapa 6

Estudar catálogo DB2.


Etapa 7

Entender RUNSTATS.


Etapa 8

Compreender Access Paths.


Etapa 9

SQL embarcado em COBOL.


Etapa 10

Otimização avançada.


CONCLUSÃO: SQL É A NOVA LINGUAGEM UNIVERSAL DO MAINFRAME

Muitos profissionais acreditam que dominar COBOL é suficiente para trabalhar em Mainframe.

Não é.

O mercado moderno exige uma combinação poderosa:

  • COBOL

  • JCL

  • CICS

  • RACF

  • DB2

  • SQL

E dentro desse conjunto, SQL ocupa uma posição privilegiada.

Toda aplicação corporativa depende dele.

Toda API consulta dados através dele.

Toda IA corporativa precisa dele.

Todo analista precisa entendê-lo.

O segredo não é decorar comandos.

O segredo é compreender o que acontece por trás deles.

Quando você entende como o DB2 13 interpreta uma consulta, escolhe índices, calcula custos, acessa páginas e otimiza recursos, deixa de ser apenas alguém que escreve SQL.

Você passa a pensar como o próprio banco de dados.

E, no universo Bellacosa Mainframe, é exatamente aí que começa a verdadeira jornada: não em aprender comandos, mas em aprender a conversar com um dos sistemas mais sofisticados já construídos pela engenharia da computação.

☕🚀 Bem-vindo ao mundo do DB2 13. O primeiro SELECT é simples. O desafio real é transformar consultas em performance, conhecimento e valor para o negócio.


sábado, 31 de agosto de 2019

O guia do programador COBOL Padawan para dominar DDL, DML, DQL, DCL e TCL como um oficial da Frota Estelar

 

Bellacosa Mainframe e o sql jedi conheça ddl dml dql dcl e tcl

☕ Um Café no Bellacosa Mainframe

SQL sem Mistérios: Muito Além do SELECT

O guia do programador COBOL Padawan para dominar DDL, DML, DQL, DCL e TCL como um oficial da Frota Estelar

Existe um momento na carreira de todo programador COBOL iniciante em que ele abre uma tela do SPUFI, do DB2I, de alguma ferramenta gráfica ou de um terminal SQL, digita:

SELECT * FROM CLIENTES;

pressiona Enter e sente que acabou de assumir o comando da USS Enterprise.

A tabela responde. As linhas aparecem. Os dados estão ali.

Missão cumprida?

Ainda não, jovem Padawan.

O SELECT é apenas a porta principal da nave. SQL é muito maior do que consultar registros. É uma linguagem capaz de construir estruturas, modificar dados, controlar permissões, organizar transações, impedir inconsistências e proteger sistemas inteiros contra falhas.

Em outras palavras: SQL não é apenas o binóculo que permite observar o espaço. É também o estaleiro que constrói a nave, o computador que controla os sistemas, o oficial de segurança que autoriza acessos e o protocolo de emergência que impede a perda da tripulação.

Para quem está entrando no universo do COBOL, especialmente em ambientes com Db2, compreender as categorias dos comandos SQL é uma das fundações mais importantes da carreira.

Neste café, vamos explorar:

  • DDL — Data Definition Language;

  • DML — Data Manipulation Language;

  • DQL — Data Query Language;

  • DCL — Data Control Language;

  • TCL — Transaction Control Language;

  • diferenças importantes entre comandos;

  • riscos comuns;

  • exemplos práticos;

  • SQL dentro de programas COBOL;

  • transações no mainframe;

  • curiosidades históricas;

  • dicas para entrevistas;

  • um roteiro prático de estudos.

Prepare o café, abra o emulador 3270 e ajuste os escudos. Nossa missão começa agora.


1. SQL não significa apenas SELECT

Muita gente aprende SQL de trás para frente.

Primeiro conhece o SELECT, depois descobre os filtros com WHERE, aprende ORDER BY, talvez um JOIN, e passa a acreditar que SQL é apenas uma linguagem de consulta.

Isso acontece porque a consulta é a parte mais visível.

O analista consulta vendas.

O programador consulta clientes.

O auditor consulta movimentações.

O suporte consulta logs.

Mas, antes que qualquer consulta possa acontecer, alguém precisou:

  1. criar a tabela;

  2. definir suas colunas;

  3. escolher os tipos de dados;

  4. criar chaves;

  5. definir restrições;

  6. inserir registros;

  7. conceder permissões;

  8. controlar transações;

  9. criar índices;

  10. planejar recuperação em caso de falha.

Portanto, SQL administra praticamente todo o ciclo de vida de um banco de dados relacional.

Um banco sem comandos de definição não teria tabelas.

Um banco sem comandos de manipulação não teria registros.

Um banco sem consultas não entregaria informação.

Um banco sem controle de acesso seria uma colônia sem escudos.

Um banco sem transações seria um teletransporte que materializa metade da pessoa em cada sala.

SQL é uma linguagem completa de interação com bancos relacionais.


2. Uma breve origem da linguagem SQL

A história do SQL começa na IBM, durante os anos 1970, quando pesquisadores trabalhavam com o modelo relacional proposto por Edgar F. Codd.

Codd apresentou uma nova forma de organizar dados usando relações, que na prática seriam representadas por tabelas.

Em vez de navegar manualmente por estruturas rígidas e ponteiros físicos, o usuário poderia declarar o resultado desejado.

Essa ideia foi revolucionária.

Em uma linguagem procedural tradicional, você descreve cada passo:

  1. abra o arquivo;

  2. leia o registro;

  3. compare o código;

  4. avance;

  5. repita;

  6. grave o resultado.

Em SQL, você declara:

SELECT NOME
FROM CLIENTE
WHERE CODIGO = 100;

Você diz o que deseja.

O banco decide como encontrar.

Essa diferença entre linguagem procedural e declarativa é fundamental para o programador COBOL.

COBOL normalmente descreve o fluxo.

SQL descreve o resultado.

Quando ambos trabalham juntos, temos uma poderosa combinação:

  • COBOL controla a lógica da aplicação;

  • SQL acessa e manipula os dados;

  • Db2 escolhe o plano de acesso;

  • o sistema operacional garante execução, segurança e recuperação.

É quase como uma equipe da ponte de comando:

  • COBOL é o capitão;

  • SQL é o oficial de operações;

  • Db2 é o computador central;

  • z/OS é a própria nave;

  • RACF é o chefe de segurança;

  • JES2 coordena os trabalhos;

  • CICS mantém a operação on-line;

  • e o programador é o tripulante tentando não causar um DELETE sem WHERE.


3. As cinco grandes famílias do SQL

Os comandos SQL costumam ser classificados em cinco grupos principais:

CategoriaSignificadoFinalidade
DDLData Definition LanguageCriar e alterar estruturas
DMLData Manipulation LanguageInserir, atualizar e excluir dados
DQLData Query LanguageConsultar dados
DCLData Control LanguageControlar permissões
TCLTransaction Control LanguageControlar transações

Essa divisão é didática.

Em alguns livros, o SELECT aparece dentro de DML. Em outros, é separado como DQL. Alguns produtos também apresentam variações de comportamento e sintaxe.

Não entre em guerra klingon por causa da classificação.

O mais importante é compreender a responsabilidade de cada comando.


4. DDL — Data Definition Language

DDL é a linguagem de definição de dados.

Ela cria e modifica a estrutura lógica dos objetos do banco.

Imagine que você esteja construindo uma nova nave da Frota Estelar.

Antes da tripulação embarcar, é necessário definir:

  • quantos decks existirão;

  • onde ficará a engenharia;

  • qual será a capacidade do reator;

  • onde serão instalados os escudos;

  • quantos alojamentos existirão;

  • como os corredores estarão conectados.

No banco, essa construção é feita com DDL.

Os comandos mais conhecidos são:

CREATE
ALTER
DROP
TRUNCATE
RENAME

4.1 CREATE — criando objetos

O CREATE cria novos objetos.

Exemplo:

CREATE TABLE CLIENTE
(
    ID_CLIENTE   INTEGER      NOT NULL,
    NOME         VARCHAR(100) NOT NULL,
    EMAIL        VARCHAR(150),
    DATA_CADASTRO DATE,
    SALDO        DECIMAL(11,2),
    PRIMARY KEY (ID_CLIENTE)
);

Aqui estamos criando uma tabela chamada CLIENTE.

Cada coluna possui um tipo:

  • INTEGER: número inteiro;

  • VARCHAR: texto de tamanho variável;

  • DATE: data;

  • DECIMAL: número decimal;

  • NOT NULL: a coluna não pode ficar vazia;

  • PRIMARY KEY: identifica cada registro de forma única.

O CREATE também pode criar:

CREATE INDEX
CREATE VIEW
CREATE SEQUENCE
CREATE DATABASE
CREATE TABLESPACE
CREATE PROCEDURE
CREATE TRIGGER

No Db2 for z/OS, o universo pode incluir objetos como:

  • database;

  • tablespace;

  • table;

  • index;

  • view;

  • alias;

  • synonym;

  • sequence;

  • stored procedure;

  • function;

  • package;

  • plan.

Nem todos são criados exatamente da mesma maneira em todos os bancos.

Essa é uma lição importante: SQL é padronizado, mas cada fabricante possui extensões e particularidades.


4.2 ALTER — reformando a nave durante a viagem

O ALTER modifica uma estrutura existente.

Por exemplo, imagine que a tabela CLIENTE já esteja em produção, mas agora a empresa deseja armazenar o telefone.

ALTER TABLE CLIENTE
ADD COLUMN TELEFONE VARCHAR(20);

Não foi necessário destruir a tabela.

Apenas adicionamos uma nova coluna.

Também podemos adicionar uma restrição:

ALTER TABLE CLIENTE
ADD CONSTRAINT CK_SALDO
CHECK (SALDO >= 0);

Ou aumentar o tamanho de uma coluna, dependendo do banco:

ALTER TABLE CLIENTE
ALTER COLUMN EMAIL
SET DATA TYPE VARCHAR(250);

Entretanto, o ALTER exige cuidado.

Modificar uma tabela vazia é simples.

Modificar uma tabela com:

  • 500 milhões de linhas;

  • dezenas de índices;

  • programas COBOL dependentes;

  • views;

  • triggers;

  • replicação;

  • rotinas de carga;

  • processos on-line;

é outra história.

Em ambientes mainframe, uma alteração estrutural pode exigir análise de impacto, regeneração de objetos, rebind de packages, testes de compatibilidade e planejamento de janela.

A pergunta não é apenas:

“O comando funciona?”

A pergunta madura é:

“Qual será o impacto dessa alteração em todo o ecossistema?”


4.3 DROP — autodestruição autorizada

O DROP remove um objeto.

DROP TABLE CLIENTE;

Esse comando pode remover:

  • a definição da tabela;

  • seus dados;

  • índices relacionados;

  • dependências, conforme o produto e as opções utilizadas.

É uma operação destrutiva.

Não confunda:

DELETE FROM CLIENTE;

com:

DROP TABLE CLIENTE;

O primeiro remove registros.

O segundo remove a própria tabela.

É como comparar:

  • retirar todos os tripulantes de uma nave;

  • explodir a nave inteira.

São situações completamente diferentes.

Em ambientes críticos, comandos DROP devem obedecer a controles rígidos, permissões específicas, aprovação de mudança e procedimentos de recuperação.


4.4 TRUNCATE — esvaziando o compartimento

O TRUNCATE remove todas as linhas de uma tabela, mas preserva sua estrutura.

TRUNCATE TABLE CLIENTE;

Após o comando:

  • a tabela continua existindo;

  • suas colunas continuam existindo;

  • os índices permanecem definidos;

  • as permissões normalmente permanecem;

  • os dados são removidos.

O TRUNCATE costuma ser mais rápido do que um DELETE sem WHERE, porque pode tratar a remoção em nível de páginas ou estruturas internas, evitando a mesma quantidade de trabalho linha por linha.

Mas isso varia conforme o SGBD.

Também é preciso verificar:

  • possibilidade de rollback;

  • comportamento do log;

  • restrições de integridade;

  • relacionamentos com outras tabelas;

  • triggers;

  • identidade;

  • opções específicas do produto.

A frase “TRUNCATE não pode ser desfeito” não é universal.

Em alguns bancos e contextos, pode haver comportamento transacional. Em outros, a operação possui restrições diferentes.

A regra de ouro é:

Nunca confie em uma frase genérica sobre banco de dados sem verificar o produto e a versão.


4.5 RENAME — mudando o nome da nave

O RENAME altera o nome de um objeto.

Exemplo genérico:

RENAME TABLE CLIENTE TO CLIENTES;

A sintaxe pode variar.

O cuidado está nas dependências.

Se você renomear uma tabela usada por:

  • programas COBOL;

  • jobs;

  • views;

  • stored procedures;

  • APIs;

  • relatórios;

  • scripts;

  • rotinas ETL;

todos esses consumidores poderão falhar.

Renomear não é apenas mudar uma etiqueta.

Em produção, pode significar alterar centenas de referências.


5. DML — Data Manipulation Language

DML é a linguagem de manipulação de dados.

Depois que a estrutura existe, precisamos inserir, alterar e remover registros.

Os comandos centrais são:

INSERT
UPDATE
DELETE
MERGE

5.1 INSERT — novos tripulantes a bordo

O INSERT adiciona registros.

INSERT INTO CLIENTE
(
    ID_CLIENTE,
    NOME,
    EMAIL,
    DATA_CADASTRO,
    SALDO
)
VALUES
(
    1001,
    'Vagner Bellacosa',
    'vagner@example.com',
    CURRENT_DATE,
    1500.00
);

É recomendável indicar explicitamente as colunas.

Evite depender da ordem física:

INSERT INTO CLIENTE
VALUES (1001, 'Vagner Bellacosa', ...);

Esse formato pode funcionar, mas é mais frágil.

Se a estrutura mudar, o comando pode quebrar ou inserir valores na posição errada.

Em sistemas reais, também podemos inserir dados a partir de outra consulta:

INSERT INTO CLIENTE_HISTORICO
SELECT *
FROM CLIENTE
WHERE DATA_CADASTRO < DATE('2020-01-01');

Esse padrão é usado em:

  • arquivamento;

  • migração;

  • cargas;

  • histórico;

  • preparação de ambientes de teste.


5.2 UPDATE — corrigindo a rota

O UPDATE altera registros existentes.

UPDATE CLIENTE
SET SALDO = SALDO + 500
WHERE ID_CLIENTE = 1001;

O maior perigo está na ausência do WHERE.

UPDATE CLIENTE
SET SALDO = 0;

Esse comando zera o saldo de todos os clientes.

Em uma tabela pequena de laboratório, isso vira aprendizado.

Em produção, vira reunião de crise, incidente, auditoria, relatório executivo e talvez uma visita nada amistosa do almirante.

Antes de executar um UPDATE, uma técnica valiosa é testar o filtro com SELECT:

SELECT *
FROM CLIENTE
WHERE ID_CLIENTE = 1001;

Somente depois:

UPDATE CLIENTE
SET SALDO = SALDO + 500
WHERE ID_CLIENTE = 1001;

Essa pequena disciplina evita grandes tragédias.


5.3 DELETE — removendo registros

O DELETE elimina linhas.

DELETE FROM CLIENTE
WHERE ID_CLIENTE = 1001;

Novamente, cuidado com o WHERE.

DELETE FROM CLIENTE;

Remove todas as linhas.

Ao contrário do DROP, a estrutura permanece.

Ao contrário do TRUNCATE, o DELETE pode trabalhar seletivamente:

DELETE FROM LOG_APLICACAO
WHERE DATA_EVENTO < CURRENT_DATE - 365 DAYS;

Essa exclusão remove apenas registros antigos.

Em grandes volumes, pode ser necessário apagar em lotes para evitar:

  • crescimento excessivo de log;

  • locks prolongados;

  • contenção;

  • impacto em concorrência;

  • grandes unidades de trabalho;

  • dificuldade de recuperação.


5.4 MERGE — o oficial multifunção

O MERGE combina decisões de atualização e inserção.

A lógica é:

  • se o registro já existe, atualize;

  • se não existe, insira.

Exemplo conceitual:

MERGE INTO CLIENTE C
USING CLIENTE_CARGA N
ON C.ID_CLIENTE = N.ID_CLIENTE

WHEN MATCHED THEN
    UPDATE SET
        C.NOME  = N.NOME,
        C.EMAIL = N.EMAIL

WHEN NOT MATCHED THEN
    INSERT
    (
        ID_CLIENTE,
        NOME,
        EMAIL
    )
    VALUES
    (
        N.ID_CLIENTE,
        N.NOME,
        N.EMAIL
    );

O MERGE é muito utilizado em:

  • ETL;

  • sincronização;

  • replicação;

  • Data Warehouse;

  • cargas incrementais;

  • integração entre sistemas;

  • atualização de cadastros.

Ele evita a necessidade de executar primeiro um SELECT, depois decidir entre INSERT ou UPDATE na aplicação.

Menos viagens entre programa e banco podem significar melhor desempenho e lógica mais centralizada.


6. DQL — Data Query Language

DQL é a linguagem de consulta de dados.

Seu grande representante é o SELECT.

SELECT NOME, SALDO
FROM CLIENTE;

Mas o universo do SELECT é gigantesco.

Ele pode:

  • filtrar;

  • ordenar;

  • agrupar;

  • calcular;

  • combinar tabelas;

  • numerar linhas;

  • comparar períodos;

  • executar subconsultas;

  • criar resultados analíticos;

  • produzir indicadores;

  • alimentar relatórios;

  • apoiar decisões.


6.1 WHERE — ativando os sensores

O WHERE filtra linhas.

SELECT *
FROM CLIENTE
WHERE SALDO > 1000;

Sem WHERE, todas as linhas são consideradas.

Com WHERE, selecionamos apenas o conjunto necessário.

Operadores comuns:

=
<>
>
<
>=
<=
BETWEEN
IN
LIKE
IS NULL
EXISTS

Exemplo:

SELECT NOME
FROM CLIENTE
WHERE ESTADO IN ('SP', 'RJ', 'MG');

6.2 ORDER BY — organizando a formação

SELECT NOME, SALDO
FROM CLIENTE
ORDER BY SALDO DESC;

DESC significa decrescente.

ASC significa crescente.

Sem ORDER BY, não se deve assumir uma ordem garantida.

Mesmo que o banco pareça devolver sempre igual, isso pode mudar conforme:

  • plano de acesso;

  • índice;

  • paralelismo;

  • reorganização;

  • estatísticas;

  • versão do banco.

Resultado sem ORDER BY é como uma formação de naves sem comandante: pode parecer organizada até o momento em que tudo muda.


6.3 GROUP BY — agrupando frotas

SELECT ESTADO, COUNT(*) AS QUANTIDADE
FROM CLIENTE
GROUP BY ESTADO;

O GROUP BY reúne linhas por uma característica.

Funções agregadas comuns:

COUNT
SUM
AVG
MIN
MAX

Exemplo:

SELECT ESTADO,
       COUNT(*) AS CLIENTES,
       SUM(SALDO) AS SALDO_TOTAL
FROM CLIENTE
GROUP BY ESTADO;

6.4 JOIN — conectando sistemas estelares

O JOIN combina dados de tabelas relacionadas.

SELECT C.NOME,
       P.NUMERO_PEDIDO,
       P.VALOR
FROM CLIENTE C
INNER JOIN PEDIDO P
    ON P.ID_CLIENTE = C.ID_CLIENTE;

Sem JOIN, as informações permaneceriam separadas.

Tipos comuns:

  • INNER JOIN;

  • LEFT JOIN;

  • RIGHT JOIN;

  • FULL JOIN;

  • CROSS JOIN.

O INNER JOIN retorna correspondências.

O LEFT JOIN preserva todas as linhas da tabela da esquerda.

Exemplo:

SELECT C.NOME,
       P.NUMERO_PEDIDO
FROM CLIENTE C
LEFT JOIN PEDIDO P
    ON P.ID_CLIENTE = C.ID_CLIENTE;

Mesmo clientes sem pedidos aparecerão.


7. DCL — Data Control Language

DCL controla permissões.

Os principais comandos são:

GRANT
REVOKE

Em uma nave, nem todo tripulante pode:

  • acessar o reator;

  • disparar torpedos;

  • alterar o computador central;

  • consultar arquivos secretos;

  • iniciar a autodestruição.

No banco, também não deveria ser assim.


7.1 GRANT — concedendo autorização

GRANT SELECT
ON TABLE CLIENTE
TO USER ANALISTA01;

O usuário recebe autorização para consultar a tabela.

Também podemos conceder permissões como:

SELECT
INSERT
UPDATE
DELETE
ALTER
CONTROL
EXECUTE

O conjunto exato depende do produto.

Uma boa prática de segurança é o princípio do menor privilégio:

Conceda apenas o acesso necessário para executar a função.

Um analista que apenas consulta relatórios não precisa de permissão para apagar tabelas.


7.2 REVOKE — retirando autorização

REVOKE SELECT
ON TABLE CLIENTE
FROM USER ANALISTA01;

O acesso é removido.

Isso é importante quando:

  • alguém muda de função;

  • um contrato termina;

  • um usuário deixa a empresa;

  • uma aplicação é desativada;

  • uma permissão foi concedida indevidamente;

  • uma auditoria identifica excesso de privilégio.

No Db2 for z/OS, o controle de acesso pode envolver a interação entre autorizações do Db2 e mecanismos externos de segurança, como RACF, dependendo da arquitetura adotada.

Segurança de banco não deve ser tratada como um detalhe colocado no final do projeto.

Ela precisa nascer junto com a solução.


8. TCL — Transaction Control Language

TCL controla transações.

Os comandos mais conhecidos são:

COMMIT
ROLLBACK
SAVEPOINT

Esta é uma das partes mais importantes para quem desenvolve sistemas corporativos.


9. O que é uma transação?

Uma transação é uma unidade lógica de trabalho.

Imagine uma transferência bancária:

  1. retirar R$ 500 da conta A;

  2. adicionar R$ 500 à conta B;

  3. registrar o movimento;

  4. confirmar a operação.

Não podemos permitir que apenas metade aconteça.

Se o valor sair da conta A, mas não entrar na conta B, o sistema ficará inconsistente.

A transação deve ser tratada como um conjunto indivisível.

Ou tudo funciona.

Ou tudo é desfeito.


9.1 COMMIT — missão confirmada

O COMMIT confirma as alterações.

UPDATE CONTA
SET SALDO = SALDO - 500
WHERE NUMERO = 100;

UPDATE CONTA
SET SALDO = SALDO + 500
WHERE NUMERO = 200;

COMMIT;

Depois do COMMIT, a unidade de trabalho é concluída.

No Db2, o COMMIT também possui impacto em:

  • locks;

  • log;

  • concorrência;

  • recuperação;

  • cursores;

  • duração da unidade de trabalho.

Executar commits com pouca frequência pode criar transações gigantescas.

Executar commits a cada linha pode causar sobrecarga e comprometer a lógica da aplicação.

É necessário equilíbrio.


9.2 ROLLBACK — abortar missão

Se algo falhar:

ROLLBACK;

As alterações da unidade de trabalho são desfeitas.

Exemplo:

UPDATE CONTA
SET SALDO = SALDO - 500
WHERE NUMERO = 100;

-- Falha ao atualizar a conta de destino

ROLLBACK;

O saldo da conta de origem volta ao estado anterior.

O ROLLBACK é o botão de emergência.


9.3 SAVEPOINT — ponto de restauração

O SAVEPOINT cria um marco dentro da transação.

SAVEPOINT ETAPA_1 ON ROLLBACK RETAIN CURSORS;

A sintaxe varia conforme o banco.

Depois, pode ser possível retornar ao ponto:

ROLLBACK TO SAVEPOINT ETAPA_1;

Isso permite desfazer apenas parte do trabalho.

Imagine uma missão com cinco etapas.

Após a terceira, você cria um checkpoint.

Se a quinta falhar, pode voltar à terceira, em vez de reiniciar tudo.


10. As propriedades ACID

Transações confiáveis são frequentemente explicadas pelo acrônimo ACID.

Atomicidade

Ou tudo acontece, ou nada acontece.

A transferência bancária não pode ficar pela metade.

Consistência

A transação leva o banco de um estado válido para outro estado válido.

Regras e constraints devem ser preservadas.

Isolamento

Transações simultâneas não devem interferir de maneira incorreta umas nas outras.

Durabilidade

Após o COMMIT, os dados devem sobreviver a falhas.

ACID é uma das razões pelas quais bancos relacionais permanecem essenciais em sistemas financeiros, governamentais, industriais e corporativos.


11. DELETE, TRUNCATE e DROP: o trio das entrevistas

Essa comparação aparece constantemente.

DELETE

Remove linhas.

DELETE FROM CLIENTE
WHERE ESTADO = 'SP';
  • aceita WHERE;

  • pode remover algumas ou todas as linhas;

  • a tabela permanece;

  • normalmente participa de transações;

  • pode gerar trabalho de log linha a linha.

TRUNCATE

Esvazia a tabela.

TRUNCATE TABLE CLIENTE;
  • remove todas as linhas;

  • não usa WHERE;

  • preserva a estrutura;

  • costuma ser mais rápido;

  • possui particularidades conforme o banco.

DROP

Remove o objeto.

DROP TABLE CLIENTE;
  • remove estrutura;

  • remove dados;

  • pode afetar dependências;

  • exige extremo cuidado.

Resumo Bellacosa:

DELETE   = desembarcar alguns ou todos os tripulantes
TRUNCATE = esvaziar completamente a nave
DROP     = desmontar a nave no estaleiro

12. SQL dentro de um programa COBOL

No mundo mainframe, SQL pode aparecer embutido no COBOL.

Exemplo:

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

As variáveis precedidas por : são host variables.

Elas fazem a ponte entre COBOL e SQL.

Após a execução, o programa deve verificar o SQLCODE ou SQLSTATE.

Exemplo:

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

Em muitos ambientes Db2:

  • SQLCODE = 0: sucesso;

  • SQLCODE = +100: nenhuma linha encontrada ou fim do cursor;

  • valor negativo: erro;

  • valor positivo diferente de 100: aviso ou condição específica.

Nunca ignore o SQLCODE.

Ignorar o retorno do banco é como ignorar um alerta vermelho na ponte porque o café ainda está quente.


13. Cursores em COBOL e Db2

Quando um SELECT retorna várias linhas, usamos cursor.

Fluxo tradicional:

  1. DECLARE CURSOR;

  2. OPEN;

  3. FETCH;

  4. repetir até SQLCODE +100;

  5. CLOSE.

Exemplo simplificado:

       EXEC SQL
           DECLARE C1 CURSOR FOR
           SELECT ID_CLIENTE,
                  NOME
             FROM CLIENTE
            ORDER BY ID_CLIENTE
       END-EXEC.

       EXEC SQL
           OPEN C1
       END-EXEC.

       PERFORM UNTIL SQLCODE = +100

           EXEC SQL
               FETCH C1
                INTO :WS-ID-CLIENTE,
                     :WS-NOME
           END-EXEC

           IF SQLCODE = 0
               DISPLAY WS-ID-CLIENTE ' ' WS-NOME
           END-IF

       END-PERFORM.

       EXEC SQL
           CLOSE C1
       END-EXEC.

O programador precisa entender o impacto do COMMIT sobre cursores.

Dependendo de como o cursor foi declarado, um COMMIT pode fechá-lo.

Uma opção conhecida é:

WITH HOLD

Exemplo:

DECLARE C1 CURSOR WITH HOLD FOR
SELECT ...

Isso pode preservar o cursor através de commits, respeitando as regras do Db2.


14. Cuidados com COMMIT em processamento batch

Imagine um programa COBOL que atualiza 10 milhões de registros.

Fazer um único COMMIT no final pode resultar em:

  • unidade de trabalho enorme;

  • crescimento de log;

  • locks prolongados;

  • dificuldade de restart;

  • grande rollback em caso de erro;

  • impacto em outros processos.

Por outro lado, fazer COMMIT a cada registro pode:

  • aumentar o custo;

  • reduzir desempenho;

  • dificultar consistência;

  • gerar excesso de pontos de sincronização.

Uma estratégia comum é confirmar em lotes:

a cada 1.000 registros
a cada 5.000 registros
a cada 10.000 registros

O número ideal depende de:

  • volume;

  • tempo de execução;

  • tamanho das linhas;

  • concorrência;

  • capacidade de log;

  • estratégia de restart;

  • requisitos de negócio;

  • janela batch.

Não existe um número mágico universal.

O profissional experiente mede, testa e conversa com DBA, produção e arquitetura.


15. Passo a passo para praticar SQL

Vamos montar uma pequena estação de treinamento.

Passo 1 — criar a tabela

CREATE TABLE TRIPULANTE
(
    ID_TRIPULANTE INTEGER NOT NULL,
    NOME          VARCHAR(100) NOT NULL,
    POSTO         VARCHAR(50),
    NAVE          VARCHAR(50),
    CREDITOS      DECIMAL(10,2),
    PRIMARY KEY (ID_TRIPULANTE)
);

Passo 2 — inserir registros

INSERT INTO TRIPULANTE
VALUES
(1, 'James Kirk', 'Capitao', 'Enterprise', 5000.00);

INSERT INTO TRIPULANTE
VALUES
(2, 'Spock', 'Oficial de Ciencia', 'Enterprise', 4800.00);

INSERT INTO TRIPULANTE
VALUES
(3, 'Montgomery Scott', 'Engenheiro Chefe', 'Enterprise', 4500.00);

Passo 3 — consultar

SELECT *
FROM TRIPULANTE;

Passo 4 — filtrar

SELECT NOME, POSTO
FROM TRIPULANTE
WHERE CREDITOS > 4600;

Passo 5 — atualizar

UPDATE TRIPULANTE
SET CREDITOS = CREDITOS + 500
WHERE ID_TRIPULANTE = 3;

Passo 6 — confirmar

COMMIT;

Passo 7 — testar rollback

UPDATE TRIPULANTE
SET CREDITOS = 0;

ROLLBACK;

Após o rollback, os créditos devem retornar ao estado anterior.

Passo 8 — adicionar coluna

ALTER TABLE TRIPULANTE
ADD COLUMN PLANETA_ORIGEM VARCHAR(50);

Passo 9 — conceder acesso

GRANT SELECT
ON TABLE TRIPULANTE
TO USER CADETE01;

Passo 10 — remover um registro

DELETE FROM TRIPULANTE
WHERE ID_TRIPULANTE = 3;

Esse laboratório apresenta praticamente todas as categorias principais.


16. Erros clássicos do SQL Padawan

Executar UPDATE sem WHERE

UPDATE FUNCIONARIO
SET SALARIO = 1000;

Todos os salários serão alterados.

Executar DELETE sem WHERE

DELETE FROM FUNCIONARIO;

Todos os registros serão removidos.

Usar SELECT *

SELECT *
FROM CLIENTE;

É útil para testes, mas em programas e consultas profissionais pode trazer colunas desnecessárias, aumentar tráfego e criar dependências frágeis.

Prefira:

SELECT ID_CLIENTE,
       NOME,
       EMAIL
FROM CLIENTE;

Não tratar NULL

NULL não é zero.

NULL não é espaço.

NULL significa ausência de valor conhecido.

Isto está errado:

WHERE EMAIL = NULL

O correto é:

WHERE EMAIL IS NULL

Ignorar transações

Atualizar tabelas relacionadas sem pensar em COMMIT e ROLLBACK é um convite à inconsistência.

Ignorar o plano de acesso

Uma consulta correta pode ser lenta.

É preciso compreender:

  • índices;

  • estatísticas;

  • cardinalidade;

  • joins;

  • filtros;

  • ordenações;

  • acesso por tabela ou índice;

  • custo estimado.

No Db2, EXPLAIN é uma ferramenta essencial nessa jornada.


17. Curiosidades do universo SQL

SQL já foi chamado de SEQUEL

A linguagem desenvolvida inicialmente na IBM era associada ao nome SEQUEL, de Structured English Query Language.

Por razões relacionadas a marca, o nome foi encurtado para SQL.

Por isso algumas pessoas pronunciam:

“és-quê-éle”

e outras:

“síquel”.

Ambas as formas aparecem no mercado.

SQL é declarativo

Você descreve o resultado, não necessariamente o caminho.

SELECT NOME
FROM CLIENTE
WHERE ID_CLIENTE = 100;

Você não manda o banco:

  • abrir o índice;

  • ir à página;

  • localizar a linha;

  • carregar a coluna.

O otimizador decide o plano.

SELECT pode não pertencer à DQL em todas as classificações

Algumas referências tratam SELECT como parte da DML.

A classificação DQL é muito usada em materiais didáticos, mas não representa uma verdade absoluta e universal.

Nem todo comando existe igualmente em todo banco

A sintaxe e o comportamento variam entre:

  • Db2;

  • Oracle;

  • PostgreSQL;

  • SQL Server;

  • MySQL;

  • MariaDB;

  • SQLite.

Aprenda o conceito e depois confirme a implementação.


18. Como entrevistas cobram esses conhecimentos

O entrevistador raramente quer apenas ouvir a lista:

DDL, DML, DQL, DCL e TCL.

Ele quer perceber se você entende situações reais.

Perguntas possíveis:

Qual a diferença entre DELETE, TRUNCATE e DROP?

Responda considerando:

  • linhas;

  • estrutura;

  • filtro;

  • log;

  • transação;

  • desempenho;

  • impacto.

O que acontece se um UPDATE não tiver WHERE?

Todas as linhas elegíveis serão atualizadas.

Por que não fazer um único COMMIT em um batch gigantesco?

Pode gerar unidade de trabalho extensa, locks, log elevado, rollback demorado e dificuldade de restart.

Quando usar MERGE?

Quando é necessário inserir registros inexistentes e atualizar os já existentes com base em uma condição.

Qual a função do GRANT?

Conceder privilégios sobre objetos ou operações.

O que significa SQLCODE +100?

Em muitos cenários Db2, indica que nenhuma linha foi encontrada ou que o cursor chegou ao final.

Por que um índice pode melhorar o SELECT e prejudicar o INSERT?

O índice acelera algumas buscas, mas precisa ser mantido a cada inserção, atualização ou exclusão.

Essa última pergunta já mostra que banco de dados é uma disciplina de equilíbrio.


19. O caminho depois dos comandos básicos

Após dominar as famílias SQL, avance para:

  1. filtros e operadores;

  2. funções escalares;

  3. agregações;

  4. joins;

  5. subqueries;

  6. CTEs;

  7. window functions;

  8. views;

  9. constraints;

  10. índices;

  11. transações;

  12. níveis de isolamento;

  13. locking;

  14. deadlocks;

  15. EXPLAIN;

  16. otimização;

  17. stored procedures;

  18. triggers;

  19. particionamento;

  20. segurança e auditoria.

Não tente aprender tudo em um único warp.

A evolução acontece em camadas.

Primeiro, compreenda o que cada comando faz.

Depois, entenda quando deve ser usado.

Em seguida, estude o impacto.

Finalmente, aprenda a operar em escala.


20. Easter egg: o protocolo Kobayashi Maru do SQL

Existe um teste não oficial que todo programador enfrenta em algum momento.

Você está conectado em uma base.

Recebe a tarefa:

“Corrigir apenas um registro.”

Digita:

UPDATE CLIENTE
SET STATUS = 'INATIVO';

E percebe, um segundo depois, que esqueceu o WHERE.

Este é o Kobayashi Maru do SQL.

A diferença é que, neste teste, existe uma chance de sobrevivência:

  • não faça COMMIT;

  • execute ROLLBACK;

  • respire;

  • valide os dados;

  • revise o processo;

  • nunca mais atualize antes de testar o filtro com SELECT.

Kirk trapaceou no Kobayashi Maru.

O programador SQL aprende a usar transações.


Conclusão — Da primeira consulta ao comando da ponte

SQL não é apenas uma coleção de comandos.

É uma forma estruturada de pensar sobre dados.

DDL constrói o universo.

DML movimenta seus habitantes.

DQL observa e interpreta.

DCL protege as fronteiras.

TCL mantém a linha temporal consistente.

Para o programador COBOL, dominar essas categorias significa compreender melhor como as aplicações corporativas realmente funcionam.

Um programa não vive sozinho.

Ele depende de tabelas, índices, permissões, locks, transações, logs, packages, planos de acesso, unidades de trabalho e mecanismos de recuperação.

O iniciante memoriza:

SELECT
INSERT
UPDATE
DELETE

O profissional pergunta:

  • Quantas linhas serão afetadas?

  • Existe índice adequado?

  • O filtro está correto?

  • Qual será o nível de isolamento?

  • Quando ocorrerá o COMMIT?

  • Como o processo será reiniciado?

  • O usuário possui autorização?

  • Qual será o impacto sobre outros sistemas?

  • O programa está tratando o SQLCODE?

  • Existe uma estratégia de rollback?

Essa é a diferença entre escrever SQL e entender SQL.

Comece com uma tabela pequena.

Faça inserts.

Teste updates.

Use rollback.

Crie uma coluna.

Conceda uma permissão.

Abra um cursor em COBOL.

Observe o SQLCODE.

Depois repita.

O conhecimento não vem de decorar uma imagem com cinco caixas coloridas. Ele nasce quando você executa, erra em laboratório, investiga o comportamento e compreende por que cada comando existe.

E lembre-se, Padawan:

Um SELECT mostra o que existe.
Um INSERT cria um novo registro.
Um UPDATE muda a realidade.
Um DELETE apaga evidências.
Um COMMIT sela a linha do tempo.

Portanto, antes de pressionar Enter, confira o WHERE.

A Frota Estelar agradece.