Db2 for i

Base de datos integrada en el sistema operativo, nomenclatura dual, acceso a datos, SQL, vistas de sistema y herramientas.

Base de datos integrada

A diferencia de x86 donde instalás PostgreSQL, MySQL o SQL Server sobre el SO, en IBM i la base de datos Db2 for i es parte integral del sistema operativo. No se instala, no se configura por separado, no tiene su propio proceso daemon.

x86 — Base de datos separada

  • Se instala sobre el SO (apt install, docker, etc.)
  • Tiene su propio motor, proceso y gestión de memoria
  • Necesita configuración: puertos, usuarios, storage
  • Backups independientes del SO
  • Los datos son archivos del filesystem (tablespaces)
  • Puede caerse sin afectar al SO

IBM i — Db2 integrada

  • Viene con el SO, siempre disponible
  • Comparte memoria y storage con todo el sistema
  • Sin configuración: funciona desde el primer boot
  • Backup del sistema incluye los datos
  • Los datos son objetos nativos del SO (*FILE)
  • La BD es inseparable del sistema operativo
Consecuencia práctica: Cualquier biblioteca que creés ya es un schema SQL. Cualquier PF que creés ya es consultable con SQL. No hay "importación" ni "migración" — los datos son la base de datos.

Nomenclatura dual

Db2 for i soporta dos formas de referirse a los mismos objetos. Ambas son válidas y acceden exactamente a los mismos datos:

ConceptoSQL estándarIBM i tradicional
ContenedorSchemaLibrary
DatosTablePhysical File (PF)
VistaViewLogical File (LF)
FilaRowRecord
ColumnaColumnField
ÍndiceIndexKeyed Access Path
CatálogoINFORMATION_SCHEMAQSYS2 views

Separador de schema

Podés usar dos notaciones para calificar tablas:

Notación sistema (barra)

SELECT * FROM MILIB/CLIENTES

Tradicional de IBM i. Funciona en 5250 y SQL interactivo.

Notación SQL (punto)

SELECT * FROM MILIB.CLIENTES

Estándar SQL. Necesaria para JDBC/ODBC y herramientas externas.

Formas de acceso a datos

1

SQL interactivo (STRSQL)

Sesión SQL desde 5250. Ideal para consultas rápidas y pruebas.

2

SQL embebido

SQL dentro de programas RPG, COBOL o C. Se compila junto con el programa.

3

ODBC / JDBC

Conexión desde aplicaciones externas (Java, .NET, Python, Node.js).

4

IBM ACS — Run SQL Scripts

Editor SQL gráfico de IBM. Soporta múltiples statements, variables y resultsets.

5

DDS (Data Description Specifications)

Acceso nativo por record-level (READ, WRITE, UPDATE). Tradicional en RPG.

6

Servicios SQL (QSYS2)

Vistas y funciones SQL que exponen información del sistema operativo.

SQL básico en Db2 for i

SQL — Crear tabla
-- Crear una tabla (equivale a CRTPF)
CREATE TABLE MILIB.CLIENTES (
  ID         INTEGER GENERATED ALWAYS AS IDENTITY,
  NOMBRE     VARCHAR(100) NOT NULL,
  EMAIL      VARCHAR(200),
  ESTADO     CHAR(1) DEFAULT 'A',
  SALDO      DECIMAL(11,2) DEFAULT 0,
  CREADO     TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

-- Agregar índice (equivale a CRTLF con clave)
CREATE INDEX MILIB.CLI_EMAIL ON MILIB.CLIENTES (EMAIL);
SQL — Consultas
-- Consultas básicas
SELECT * FROM MILIB.CLIENTES WHERE ESTADO = 'A';

-- Insertar
INSERT INTO MILIB.CLIENTES (NOMBRE, EMAIL)
VALUES ('Fernando Secchi', 'fernando@sinaptrix.com');

-- Actualizar
UPDATE MILIB.CLIENTES SET ESTADO = 'I' WHERE ID = 5;

-- IBM i soporta la notación con barra también
SELECT * FROM MILIB/CLIENTES WHERE ESTADO = 'A';
SQL — Funcionalidades avanzadas
-- Common Table Expressions (CTEs)
WITH activos AS (
  SELECT * FROM MILIB.CLIENTES WHERE ESTADO = 'A'
)
SELECT COUNT(*), SUM(SALDO) FROM activos;

-- Window functions
SELECT NOMBRE, SALDO,
       RANK() OVER (ORDER BY SALDO DESC) AS ranking
FROM MILIB.CLIENTES;

-- MERGE (upsert)
MERGE INTO MILIB.CLIENTES AS t
USING (VALUES ('nuevo@email.com', 'Nuevo')) AS s(EMAIL, NOMBRE)
ON t.EMAIL = s.EMAIL
WHEN MATCHED THEN UPDATE SET NOMBRE = s.NOMBRE
WHEN NOT MATCHED THEN INSERT (EMAIL, NOMBRE) VALUES (s.EMAIL, s.NOMBRE);

Tipos de datos comunes

Tipo Db2EquivalenteNotas
CHAR(n)CHAR en PostgreSQLLargo fijo, padding con espacios
VARCHAR(n)VARCHARLargo variable, más eficiente
INTEGERINT4 bytes, -2B a +2B
SMALLINTSMALLINT2 bytes, -32K a +32K
BIGINTBIGINT8 bytes
DECIMAL(p,s)NUMERICExacto. Muy usado para montos (ej: DEC(11,2))
DATEDATEFormato depende del job (ISO, MDY, etc.)
TIMETIMEHH:MM:SS
TIMESTAMPTIMESTAMPFecha + hora + microsegundos
CLOBTEXTTexto largo (hasta 2GB)
BLOBBYTEADatos binarios (hasta 2GB)
Nota sobre DECIMAL: En IBM i es muy común usar DECIMAL(p,s)(también llamado PACKED o ZONED en DDS). Los programas RPG trabajan nativamente con decimales de punto fijo, por lo que es el tipo preferido para valores monetarios.

Journaling y transacciones

El journaling es el sistema de logging transaccional de Db2 for i. Registra cada cambio en las tablas para permitir recovery, auditoría y replicación.

Journal (*JRN)

Objeto que recibe las entradas de journal. Cada tabla se asocia a un journal.

Journal Receiver (*JRNRCV)

Almacena las entradas. Se rotan periódicamente. Es el equivalente a los WAL logs de PostgreSQL.

Commitment Control

Transacciones ACID. Se activa con STRCMTCTL. Soporta isolation levels como en cualquier BD moderna.

Remote Journaling

Replica journal entries a otro sistema para alta disponibilidad y disaster recovery.

CL — Journaling
CRTJRNRCV JRNRCV(MILIB/MIRCV0001)          Crear receptor
CRTJRN JRN(MILIB/MIJRN) JRNRCV(MILIB/MIRCV0001)  Crear journal
STRJRNPF FILE(MILIB/CLIENTES) JRN(MILIB/MIJRN)    Iniciar journaling
ENDJRNPF FILE(MILIB/CLIENTES) JRN(MILIB/MIJRN)    Detener journaling
DSPJRN JRN(MILIB/MIJRN)                   Ver entradas del journal
Importante: Las tablas creadas con SQL (CREATE TABLE) se journalean automáticamente si la biblioteca tiene un journal por defecto. Las creadas con DDS (CRTPF) requieren activar el journaling manualmente.

Vistas de sistema (QSYS2)

IBM i expone una enorme cantidad de información del sistema operativo a través de vistas SQL en el schema QSYS2. Esto permite monitorear y administrar el sistema con SQL puro.

SQL — Consultas al sistema
-- Ver trabajos activos (equivale a WRKACTJOB)
SELECT JOB_NAME, JOB_TYPE, JOB_STATUS, CPU_TIME
FROM QSYS2.ACTIVE_JOB_INFO
WHERE JOB_STATUS = 'RUN';

-- Ver tablas de una biblioteca
SELECT TABLE_NAME, TABLE_TYPE, ROW_COUNT
FROM QSYS2.SYSTABLES
WHERE TABLE_SCHEMA = 'MILIB';

-- Ver columnas de una tabla
SELECT COLUMN_NAME, DATA_TYPE, LENGTH, NUMERIC_SCALE
FROM QSYS2.SYSCOLUMNS
WHERE TABLE_SCHEMA = 'MILIB' AND TABLE_NAME = 'CLIENTES';

-- Ver el job log actual
SELECT MESSAGE_ID, MESSAGE_TYPE, MESSAGE_TEXT
FROM QSYS2.JOBLOG_INFO
ORDER BY ORDINAL_POSITION DESC
FETCH FIRST 20 ROWS ONLY;

-- Uso de disco por biblioteca
SELECT SCHEMA_NAME, SYSTEM_SCHEMA_NAME,
       JOURNAL_NAME, NUMBER_TABLES
FROM QSYS2.SYSSCHEMAS
WHERE SCHEMA_NAME LIKE 'MI%';

Vistas QSYS2 más útiles:

QSYS2.SYSTABLES

Catálogo de tablas/vistas

QSYS2.SYSCOLUMNS

Columnas de cada tabla

QSYS2.SYSINDEXES

Índices existentes

QSYS2.ACTIVE_JOB_INFO

Trabajos activos del sistema

QSYS2.JOBLOG_INFO

Job log vía SQL

QSYS2.SYSTEM_STATUS

Estado del sistema (CPU, memoria)

QSYS2.USER_INFO

Información de perfiles de usuario

QSYS2.OBJECT_STATISTICS

Estadísticas de objetos

Herramientas de consulta

STRSQL

SQL interactivo desde 5250. Simple pero limitado en funcionalidad.

IBM ACS — Run SQL Scripts

El más completo. Soporta múltiples statements, variables, resultsets, export a CSV/Excel. Gratuito.

DBeaver / DataGrip

Herramientas universales de BD que se conectan vía JDBC. Útil si ya las usás para otras BDs.

VS Code + Db2 for i extension

Extensión que permite ejecutar SQL directamente desde VS Code contra IBM i.

RUNQRY / Query/400

Herramientas legacy de consulta. Aún se usan pero están siendo reemplazadas por SQL.

Conectividad externa

Para conectarte a Db2 for i desde aplicaciones externas (Node.js, Java, Python, .NET), necesitás usar el driver JDBC o ODBC de IBM.

JDBC (JTOpen / jt400)

Driver Java. Incluido en IBM ACS. Usado por DBeaver, aplicaciones Java y Kotlin.

ODBC (IBM i Access)

Driver nativo. Usado por .NET, Python (pyodbc), aplicaciones Windows.

odbc_db2 (Node.js)

Paquete npm para conectar Node.js a Db2 for i vía ODBC.

Mapepire

Nuevo protocolo de IBM para acceso SQL moderno desde cualquier lenguaje. JSON sobre WebSocket.

Ejemplo — Connection string JDBC
jdbc:as400://MI_SERVIDOR;naming=sql;libraries=MILIB;prompt=false
Recomendación: Para desarrollo moderno, Mapepire es la opción más nueva y prometedora de IBM. Para integración probada, JDBC con el driver jt400 sigue siendo la opción más estable y documentada.