Base de datos integrada en el sistema operativo, nomenclatura dual, acceso a datos, SQL, vistas de sistema y herramientas.
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
IBM i — Db2 integrada
Db2 for i soporta dos formas de referirse a los mismos objetos. Ambas son válidas y acceden exactamente a los mismos datos:
Podés usar dos notaciones para calificar tablas:
Notación sistema (barra)
SELECT * FROM MILIB/CLIENTESTradicional de IBM i. Funciona en 5250 y SQL interactivo.
Notación SQL (punto)
SELECT * FROM MILIB.CLIENTESEstándar SQL. Necesaria para JDBC/ODBC y herramientas externas.
SQL interactivo (STRSQL)
Sesión SQL desde 5250. Ideal para consultas rápidas y pruebas.
SQL embebido
SQL dentro de programas RPG, COBOL o C. Se compila junto con el programa.
ODBC / JDBC
Conexión desde aplicaciones externas (Java, .NET, Python, Node.js).
IBM ACS — Run SQL Scripts
Editor SQL gráfico de IBM. Soporta múltiples statements, variables y resultsets.
DDS (Data Description Specifications)
Acceso nativo por record-level (READ, WRITE, UPDATE). Tradicional en RPG.
Servicios SQL (QSYS2)
Vistas y funciones SQL que exponen información del sistema operativo.
-- 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);
-- 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';-- 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);CHAR(n)CHAR en PostgreSQLLargo fijo, padding con espaciosVARCHAR(n)VARCHARLargo variable, más eficienteINTEGERINT4 bytes, -2B a +2BSMALLINTSMALLINT2 bytes, -32K a +32KBIGINTBIGINT8 bytesDECIMAL(p,s)NUMERICExacto. Muy usado para montos (ej: DEC(11,2))DATEDATEFormato depende del job (ISO, MDY, etc.)TIMETIMEHH:MM:SSTIMESTAMPTIMESTAMPFecha + hora + microsegundosCLOBTEXTTexto largo (hasta 2GB)BLOBBYTEADatos binarios (hasta 2GB)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.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.
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
CREATE TABLE) se journalean automáticamente si la biblioteca tiene un journal por defecto. Las creadas con DDS (CRTPF) requieren activar el journaling manualmente.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.
-- 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.SYSTABLESCatálogo de tablas/vistas
QSYS2.SYSCOLUMNSColumnas de cada tabla
QSYS2.SYSINDEXESÍndices existentes
QSYS2.ACTIVE_JOB_INFOTrabajos activos del sistema
QSYS2.JOBLOG_INFOJob log vía SQL
QSYS2.SYSTEM_STATUSEstado del sistema (CPU, memoria)
QSYS2.USER_INFOInformación de perfiles de usuario
QSYS2.OBJECT_STATISTICSEstadísticas de objetos
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.
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.
jdbc:as400://MI_SERVIDOR;naming=sql;libraries=MILIB;prompt=false