código·java·oracle
Oracle y SQL

El comando SET de SQL*Plus: configura tu sesión

LINESIZE, PAGESIZE, AUTOTRACE, TIMING: media docena de órdenes SET convierten SQL*Plus de bloc de notas hostil en herramienta de trabajo decente.

publicado octubre de 2011 revisado agosto de 2026 668 palabras

SQL*Plus es la intérprete de comandos que Oracle lleva instalando desde los años ochenta, y sigue siendo la herramienta que encuentras en cualquier servidor donde no hay nada más. Su aspecto desgarbado no es obligatorio: casi toda la incomodidad se corrige con una sola orden, SET, que ajusta el comportamiento de la sesión. Estas son las variables que de verdad se usan, con su efecto exacto.

Las cuatro básicas de la legibilidad

SQLset_basico.sql
SET LINESIZE 200      -- ancho de linea antes de saltar
SET PAGESIZE 100      -- filas antes de repetir cabeceras
SET FEEDBACK ON       -- "25 rows selected" al final
SET HEADING ON        -- cabeceras de columna

El 90 % de las sesiones confusas se arreglan con esas cuatro líneas. LINESIZE evita que las columnas se partan en varias líneas de sierra; PAGESIZE controla cada cuántas filas se repite la cabecera (con PAGESIZE 0 desaparecen del todo, útil para generar ficheros de datos planos). Añade SET WRAP OFF si prefieres truncar a envolver.

Medir lo que ejecutas

SQLset_medicion.sql
SET TIMING ON        -- cronometra cada sentencia
SET TIME ON          -- prompt con la hora
SET AUTOTRACE ON     -- plan + estadisticas tras cada SELECT
SET AUTOTRACE TRACEONLY  -- plan sin mostrar las filas

TIMING imprime el tiempo transcurrido real tras cada sentencia; AUTOTRACE va mucho más allá y muestra el plan de ejecución y las estadísticas de sesión (lecturas lógicas, físicas, sorts). El modo TRACEONLY ejecuta la consulta pero no vuelca el resultado: ideal para estudiar el plan de un SELECT que devuelve un millón de filas sin inundar la terminal.

Formato fino de columnas

Complemento natural de SET, el comando COLUMN da ancho y máscara a cada columna concreta. La pareja COLUMN ... FORMAT más LINESIZE decente es la diferencia entre leer un informe y adivinarlo:

SQLcolumnas.sql
COLUMN nombre   FORMAT A25 HEADING 'Cliente'
COLUMN importe  FORMAT 999,990.00
COLUMN creado   FORMAT A11
SELECT nombre, importe, TO_CHAR(creado, 'YYYY-MM-DD') AS creado
FROM   facturas;

Variables de sustitución

Con DEFINE y &, SQL*Plus pide valores al vuelo o los toma de variables de sesión. Es el antepasado humilde de los parámetros de los scripts modernos, y aún resuelve apuros:

SQLsustitucion.sql
DEFINE esquema = VENTAS
SELECT COUNT(*) FROM &esquema..facturas;

-- && pide el valor una sola vez por sesion
SELECT * FROM facturas WHERE region = &&region;

Persistir todo: glogin.sql y login.sql

Nadie deberia teclear esta configuración cada mañana. Al arrancar, SQL*Plus ejecuta glogin.sql (global, en $ORACLE_HOME/sqlplus/admin) y después login.sql (personal, buscado en SQLPATH). Un login.sql mínimo que sigue acompañando a los desarrolladores desde 2011:

SQLlogin.sql
-- login.sql
SET LINESIZE 200
SET PAGESIZE 100
SET TIMING ON
SET SQLPROMPT "_USER'@'_CONNECT_IDENTIFIER> "
ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI';

Desde SQL*Plus 12.2, SET SQLPROMPT admite sustituciones como _USER y _CONNECT_IDENTIFIER, y el prompt se reevalúa en cada conexión, de modo que siempre sabes a qué base de datos estás a punto de tocar. Ese detalle ha evitado más DROP catastróficos en producción que cualquier documentación.

De la terminal al fichero: SPOOL y el modo CSV

Para dejar constancia o entregar resultados, SPOOL copia todo lo que ocurre en la sesión a un fichero, y desde 12.2 existe un atajo honesto para intercambio de datos: el marcado CSV nativo, sin malabares con separadores:

SQLspool.sql
SET MARKUP CSV ON QUOTE ON
SPOOL exportacion.csv
SELECT sku, unidades FROM stock;
SPOOL OFF
SET MARKUP CSV OFF

En scripts desatendidos, la pareja de guardia es WHENEVER SQLERROR EXIT SQL.SQLCODE —corta el script al primer error en vez de seguir ejecutando sentencias sobre datos a medias— y WHENEVER OSERROR EXIT FAILURE para los problemas del sistema operativo. Junto a SET ECHO ON y un SPOOL de log, constituyen la diferencia entre un script profesional y una secuencia de sentencias con suerte.

Un SQL*Plus configurado no es nostalgia: es la única interfaz garantizada en cualquier servidor Oracle del mundo, con SSH y nada más.

Con la sesión domada, el siguiente paso natural es sacarle partido al diccionario: las consultas útiles sobre USER_TABLES y v$session ganan mucho cuando su salida por fin cabe en pantalla. Y si tu trabajo es mover datos entre entornos, las utilidades clásicas exp e imp también se manejan desde aquí.