En esta entrada vamos a explorar cómo utilizar el comando SET SQLFORMAT de Oracle SQLcl (SQL Command Line) para modificar la salida de nuestras consultas SQL. Esta funcionalidad es especialmente útil para exportar datos o integrarlos en otros procesos de forma sencilla, sin necesidad de herramientas adicionales.
Requisitos Previos
Antes de empezar, vamos a crear una tabla de ejemplo (EMP) y poblarla con datos. Esta tabla será usada en todos los ejemplos siguientes.
¿Qué es SET SQLFORMAT?
El comando SET SQLFORMAT permite cambiar el formato en que se presentan los resultados de una consulta. SQLcl soporta múltiples formatos como:
- DEFAULT
- CSV
- HTML
- XML
- JSON
- ANSICONSOLE
- INSERT
- LOADER
- FIXED
- DELIMITED
Vamos a ver cada uno de ellos con ejemplos usando la tabla EMP.
DEFAULT
La opción DEFAULT borra todas las configuraciones SQLFORMAT anteriores y regresa a la salida predeterminada.
SQL> SET SQLFORMAT DEFAULT
SQL Format Cleared
SQL> SELECT * FROM emp WHERE deptno = 20;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
7369 SMITH CLERK 7902 17-DEC-80 800 20
7566 JONES MANAGER 7839 02-APR-81 2975 20
SQL>
CSV
El formato CSV genera una salida estándar de variables separadas por comas, con valores de cadena entre comillas dobles. La primera línea contiene los nombres de las columnas.
SQL> SET SQLFORMAT CSV
SQL> SELECT * FROM emp WHERE deptno = 20;
"EMPNO","ENAME","JOB","MGR","HIREDATE","SAL","COMM","DEPTNO"
7369,"SMITH","CLERK",7902,17-DEC-80,800,,20
7566,"JONES","MANAGER",7839,02-APR-81,2975,,20
SQL>
HTML
El formato HTML genera el HTML para una tabla adaptable. El contenido de la tabla se modifica dinámicamente para coincidir con la cadena de búsqueda introducida en el campo de texto superior izquierdo.
SQL> SET SQLFORMAT HTML
SQL> SELECT * FROM emp WHERE deptno = 20;
La salida de esta consulta es bastante grande.
XML
El formato XML genera un documento XML basado en etiquetas. Todos los datos se presentan como etiquetas CDATA. Este sería un ejemplo acortado de la misma:
SQL> SET SQLFORMAT XML
SQL> SELECT * FROM emp WHERE deptno = 20;
<?xml version='1.0' encoding='UTF8' ?>
<RESULTS>
<ROW>
<COLUMN NAME="EMPNO"><![CDATA[7369]]></COLUMN>
<COLUMN NAME="ENAME"><![CDATA[SMITH]]></COLUMN>
<COLUMN NAME="JOB"><![CDATA[CLERK]]></COLUMN>
<COLUMN NAME="MGR"><![CDATA[7902]]></COLUMN>
<COLUMN NAME="HIREDATE"><![CDATA[17-DEC-80]]></COLUMN>
<COLUMN NAME="SAL"><![CDATA[800]]></COLUMN>
<COLUMN NAME="COMM"><![CDATA[]]></COLUMN>
<COLUMN NAME="DEPTNO"><![CDATA[20]]></COLUMN>
</ROW>
</RESULTS>

JSON
El formato JSON genera un documento JSON que contiene las definiciones de las columnas junto con sus datos. La salida se minimiza, por lo que es compacta, pero difícil de leer. El formato JSON-FORMATTED imprime el JSON de forma legible.
SQL> SET SQLFORMAT JSON-FORMATTED
SQL> SELECT * FROM emp WHERE deptno = 20;
El resultado será similar a este indicando las columnas y tipo previamente. Se ha acortado la salida por su longitud:
"items" : [
{
"empno" : 7369,
"ename" : "SMITH",
"job" : "CLERK",
"mgr" : 7902,
"hiredate" : "17-DEC-80",
"sal" : 800,
"comm" : "",
"deptno" : 20
},
ANSICONSOLE
El formato ANSICONSOLE ajusta el tamaño de las columnas al ancho de los datos para ahorrar espacio. Además, subraya las columnas, en lugar de usar una línea de salida aparte. Los subrayados no se copian al texto plano, así que los he añadido manualmente para mostrarles cómo se ven en una pantalla de terminal.
SQL> SET SQLFORMAT ANSICONSOLE
SQL> SELECT * FROM emp WHERE deptno = 20;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
7369 SMITH CLERK 7902 17-DEC-80 800 20
7566 JONES MANAGER 7839 02-APR-81 2975 20
SQL>
INSERT
El formato INSERT produce las instrucciones INSERT que podrían usarse para recrear las filas de una tabla.
SQL> SET SQLFORMAT INSERT
SQL> SELECT * FROM emp WHERE deptno = 20;
REM INSERTING into EMP
SET DEFINE OFF;
Insert into EMP (EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO) values (7369,'SMITH','CLERK',7902,to_timestamp('17-DEC-80','DD-MON-RR HH24.MI.SSXFF'),800,null,20);
Insert into EMP (EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO) values (7566,'JONES','MANAGER',7839,to_timestamp('02-APR-81','DD-MON-RR HH24.MI.SSXFF'),2975,null,20);
SQL>
LOADER
El formato LOADER genera una salida delimitada por barras verticales con valores de cadena entre comillas dobles. Los nombres de columna no se incluyen en la salida.
SQL> SET SQLFORMAT LOADER
SQL> SELECT * FROM emp WHERE deptno = 20;
7369|"SMITH"|"CLERK"|7902|"1980-12-17 00:00:00"|800||20|
7566|"JONES"|"MANAGER"|7839|"1981-04-02 00:00:00"|2975||20|
SQL>
FIXED
El formato FIJO genera columnas de ancho fijo con todos los datos entre comillas dobles. La primera línea contiene los nombres de las columnas.
SQL> SET SQLFORMAT FIXED
SQL> SELECT * FROM emp WHERE deptno = 20;
"EMPNO" "ENAME" "JOB" "MGR" "HIREDATE" "SAL" "COMM" "DEPTNO"
"7369" "SMITH" "CLERK" "7902" "17-DEC-80" "800" "" "20"
"7566" "JONES" "MANAGER" "7839" "02-APR-81" "2975" "" "20"
SQL>
DELIMITED
El formato DELIMITED es un caso especial que permite definir manualmente la cadena delimitadora, así como los caracteres que se utilizarán para encerrar los valores de la cadena. El formato básico es el siguiente:
SET SQLFORMAT DELIMITED <delimiter> <left enclosure> <right enclosure>
En el siguiente ejemplo, la cadena delimitadora es ~del~ y los valores de la cadena están entre comillas dobles.
SQL> SET SQLFORMAT DELIMITED ~del~ " "
SQL> SELECT * FROM emp WHERE deptno = 20;
"EMPNO"~del~"ENAME"~del~"JOB"~del~"MGR"~del~"HIREDATE"~del~"SAL"~del~"COMM"~del~"DEPTNO"
7369~del~"SMITH"~del~"CLERK"~del~7902~del~17-DEC-80~del~800~del~~del~20
7566~del~"JONES"~del~"MANAGER"~del~7839~del~02-APR-81~del~2975~del~~del~20
SQL>
Conclusión
El comando SET SQLFORMAT de SQLcl es una herramienta extremadamente útil cuando necesitamos visualizar, exportar o transformar datos rápidamente en distintos formatos. Ya sea para depuración, documentación, migraciones o integración con otras herramientas, puedes adaptar la salida de tus consultas sin cambiar tu código. Somos expertos en bases de datos Oracle, SQL Server, entre otras. Contáctanos sin compromiso si podemos ayudarte.
¿Aún no conoces Query Performance? Descubre cómo puede ayudarte en tu entorno Oracle. Más información en su página de LinkedIn.
Sígue a GPS en LinkedIn
