Sqlcl - Formatando Resultados com SQLFORMAT
Olá Pessoa, hoje trago um conteúdo que e um verdadeiro canivete suíço quando se trata de exportação de dados ou manipulação de dados. De uma maneira simplificada o Sqlcl suporta a formatação de queries nos formatos mais populares como: CSV, JSON, HML, INSERT, XML e entre outros.
Isso ajuda no momento em que e necessário exportar dados para uma planilha, ou quando e solicitado um extração de dados para serem corrigidos ou conferidos, ou ate para backup em situações específicas.
Dessa forma vou mostrar como configurar e usar os tipos de formatação usando o SET SQLFORMAT para exportar dados nas mais variadas formatações usando o Sqlcl.
1 - Preparação: Vamos criar um tabela EMP e realizar alguns inserts nela:
CREATE TABLE EMP (
EMPNO NUMBER(4,0),
ENAME VARCHAR2(10 BYTE),
JOB VARCHAR2(9 BYTE),
MGR NUMBER(4,0),
HIREDATE DATE,
SAL NUMBER(7,2),
COMM NUMBER(7,2),
DEPTNO NUMBER(2,0),
CONSTRAINT PK_EMP PRIMARY KEY (EMPNO)
);
insert into EMP (EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO) values (7369,'SMITH','CLERK',7902,to_date('17-DEC-80','DD-MON-RR'),800,null,20);
insert into EMP (EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO) values (7499,'ALLEN','SALESMAN',7698,to_date('20-FEB-81','DD-MON-RR'),1600,300,30);
insert into EMP (EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO) values (7521,'WARD','SALESMAN',7698,to_date('22-FEB-81','DD-MON-RR'),1250,500,30);
insert into EMP (EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO) values (7566,'JONES','MANAGER',7839,to_date('02-APR-81','DD-MON-RR'),2975,null,20);
insert into EMP (EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO) values (7654,'MARTIN','SALESMAN',7698,to_date('28-SEP-81','DD-MON-RR'),1250,1400,30);
insert into EMP (EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO) values (7698,'BLAKE','MANAGER',7839,to_date('01-MAY-81','DD-MON-RR'),2850,null,30);
insert into EMP (EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO) values (7782,'CLARK','MANAGER',7839,to_date('09-JUN-81','DD-MON-RR'),2450,null,10);
insert into EMP (EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO) values (7788,'SCOTT','ANALYST',7566,to_date('19-APR-87','DD-MON-RR'),3000,null,20);
insert into EMP (EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO) values (7839,'KING','PRESIDENT',null,to_date('17-NOV-81','DD-MON-RR'),5000,null,10);
insert into EMP (EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO) values (7844,'TURNER','SALESMAN',7698,to_date('08-SEP-81','DD-MON-RR'),1500,0,30);
insert into EMP (EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO) values (7876,'ADAMS','CLERK',7788,to_date('23-MAY-87','DD-MON-RR'),1100,null,20);
insert into EMP (EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO) values (7900,'JAMES','CLERK',7698,to_date('03-DEC-81','DD-MON-RR'),950,null,30);
insert into EMP (EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO) values (7902,'FORD','ANALYST',7566,to_date('03-DEC-81','DD-MON-RR'),3000,null,20);
insert into EMP (EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO) values (7934,'MILLER','CLERK',7782,to_date('23-JAN-82','DD-MON-RR'),1300,null,10);
commit;
2 - Agora vamos acessar o ambiente usando o Sqlcl e fazer um select simples para confirmar que os dados estão lá:
OBS: Aqui deixo o link do post de como instalar o Sqlcl, configurar, importar conexões e realizar uma conexão:
C:\Users\pedro\AppData\Roaming\MobaXterm\home>sql -name orclpdb @format_prod_pv
NOTE: Picked up JDK_JAVA_OPTIONS: --enable-native-access=ALL-UNNAMED
SQLcl: Release 25.3 Production em dom. abr. 26 17:00:18 2026
Copyright (c) 1982, 2026, Oracle. Todos os direitos reservados.
Conectado a:
Oracle Database 21c Enterprise Edition Release 21.0.0.0.0 - Production
Version 21.3.0.0.0
SYS@orclpdb> show con_name
CON_NAME
------------------------------
ORCLPDB
SYS@orclpdb>
SYS@orclpdb> set lines 9999 pages 9999
SYS@orclpdb>
SYS@orclpdb> select * from EMP;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
________ _________ ____________ _______ ___________ _______ _______ _________
7369 SMITH CLERK 7902 17/12/80 800 20
7499 ALLEN SALESMAN 7698 20/02/81 1600 300 30
7521 WARD SALESMAN 7698 22/02/81 1250 500 30
7566 JONES MANAGER 7839 02/04/81 2975 20
7654 MARTIN SALESMAN 7698 28/09/81 1250 1400 30
7698 BLAKE MANAGER 7839 01/05/81 2850 30
7782 CLARK MANAGER 7839 09/06/81 2450 10
7788 SCOTT ANALYST 7566 19/04/87 3000 20
7839 KING PRESIDENT 17/11/81 5000 10
7844 TURNER SALESMAN 7698 08/09/81 1500 0 30
7876 ADAMS CLERK 7788 23/05/87 1100 20
7900 JAMES CLERK 7698 03/12/81 950 30
7902 FORD ANALYST 7566 03/12/81 3000 20
7934 MILLER CLERK 7782 23/01/82 1300 10
14 linhas selecionadas.
SYS@orclpdb>
Acima, podemos ver que nossa tabela esta populada com 14 registros, agora vamos aos tipos de formação usando o SET SQLFORMAT no Sqlcl.
3- DEFAULT
A formação DEFAULT limpa qualquer outra formação que esteja ativa revertendo o output para o padrão:
SYS@orclpdb> SET SQLFORMAT DEFAULT
Formato SQL Removido
SYS@orclpdb> SELECT * FROM emp WHERE deptno = 20;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- -------- ---------- ---------- ----------
7369 SMITH CLERK 7902 17/12/80 800 20
7566 JONES MANAGER 7839 02/04/81 2975 20
7788 SCOTT ANALYST 7566 19/04/87 3000 20
7876 ADAMS CLERK 7788 23/05/87 1100 20
7902 FORD ANALYST 7566 03/12/81 3000 20
SYS@orclpdb>
4- CSV
O formato CSV produz uma saída padrão de valores separados por vírgula, com valores de texto entre aspas duplas. A primeira linha contém os nomes das colunas.
SYS@orclpdb> SET SQLFORMAT CSV
SYS@orclpdb> 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
7788,"SCOTT","ANALYST",7566,19-APR-87,3000,,20
7876,"ADAMS","CLERK",7788,23-MAY-87,1100,,20
7902,"FORD","ANALYST",7566,03-DEC-81,3000,,20
SYS@orclpdb>5- HTML
O formato HTML produz o HTML para uma tabela responsiva. O conteúdo da tabela se altera dinamicamente para corresponder à string de busca digitada no campo de texto no canto superior esquerdo.
SYS@orclpdb> SET SQLFORMAT XML
SYS@orclpdb> SELECT * FROM emp WHERE deptno = 20;
<?xml version='1.0' encoding='UTF-8' ?>
<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-DEZ-1980 00:00:00]]></COLUMN>
<COLUMN NAME="SAL"><![CDATA[800]]></COLUMN>
<COLUMN NAME="COMM"><![CDATA[]]></COLUMN>
<COLUMN NAME="DEPTNO"><![CDATA[20]]></COLUMN>
</ROW>
<ROW>
<COLUMN NAME="EMPNO"><![CDATA[7566]]></COLUMN>
<COLUMN NAME="ENAME"><![CDATA[JONES]]></COLUMN>
<COLUMN NAME="JOB"><![CDATA[MANAGER]]></COLUMN>
<COLUMN NAME="MGR"><![CDATA[7839]]></COLUMN>
<COLUMN NAME="HIREDATE"><![CDATA[02-ABR-1981 00:00:00]]></COLUMN>
<COLUMN NAME="SAL"><![CDATA[2975]]></COLUMN>
<COLUMN NAME="COMM"><![CDATA[]]></COLUMN>
<COLUMN NAME="DEPTNO"><![CDATA[20]]></COLUMN>
</ROW>
<ROW>
<COLUMN NAME="EMPNO"><![CDATA[7788]]></COLUMN>
<COLUMN NAME="ENAME"><![CDATA[SCOTT]]></COLUMN>
<COLUMN NAME="JOB"><![CDATA[ANALYST]]></COLUMN>
<COLUMN NAME="MGR"><![CDATA[7566]]></COLUMN>
<COLUMN NAME="HIREDATE"><![CDATA[19-ABR-1987 00:00:00]]></COLUMN>
<COLUMN NAME="SAL"><![CDATA[3000]]></COLUMN>
<COLUMN NAME="COMM"><![CDATA[]]></COLUMN>
<COLUMN NAME="DEPTNO"><![CDATA[20]]></COLUMN>
</ROW>
<ROW>
<COLUMN NAME="EMPNO"><![CDATA[7876]]></COLUMN>
<COLUMN NAME="ENAME"><![CDATA[ADAMS]]></COLUMN>
<COLUMN NAME="JOB"><![CDATA[CLERK]]></COLUMN>
<COLUMN NAME="MGR"><![CDATA[7788]]></COLUMN>
<COLUMN NAME="HIREDATE"><![CDATA[23-MAI-1987 00:00:00]]></COLUMN>
<COLUMN NAME="SAL"><![CDATA[1100]]></COLUMN>
<COLUMN NAME="COMM"><![CDATA[]]></COLUMN>
<COLUMN NAME="DEPTNO"><![CDATA[20]]></COLUMN>
</ROW>
<ROW>
<COLUMN NAME="EMPNO"><![CDATA[7902]]></COLUMN>
<COLUMN NAME="ENAME"><![CDATA[FORD]]></COLUMN>
<COLUMN NAME="JOB"><![CDATA[ANALYST]]></COLUMN>
<COLUMN NAME="MGR"><![CDATA[7566]]></COLUMN>
<COLUMN NAME="HIREDATE"><![CDATA[03-DEZ-1981 00:00:00]]></COLUMN>
<COLUMN NAME="SAL"><![CDATA[3000]]></COLUMN>
<COLUMN NAME="COMM"><![CDATA[]]></COLUMN>
<COLUMN NAME="DEPTNO"><![CDATA[20]]></COLUMN>
</ROW>
</RESULTS>
5 linhas selecionadas.
SYS@orclpdb>
6- JSON
O formato JSON produz um documento JSON contendo as definições das colunas junto com os dados que elas contêm. A saída é compacta, mas difícil de ler. O formato JSON-FORMATTED formata o JSON de forma legível, tornando-o compreensível para humanos.
- JSON
SYS@orclpdb> SET SQLFORMAT JSON SYS@orclpdb> SELECT * FROM emp WHERE deptno = 20; {"results":[{"columns":[{"name":"EMPNO","type":"NUMBER"},{"name":"ENAME","type":"VARCHAR2"},{"name":"JOB","type":"VARCHAR2"},{"name":"MGR","type":"NUMBER"},{"name":"HIREDATE","type":"DATE"},{"name":"SAL ","type":"NUMBER"},{"name":"COMM","type":"NUMBER"},{"name":"DEPTNO","type":"NUMBER"}],"items": [ {"empno":7369,"ename":"SMITH","job":"CLERK","mgr":7902,"hiredate":"17-DEZ-1980 00:00:00","sal":800,"deptno":20} ,{"empno":7566,"ename":"JONES","job":"MANAGER","mgr":7839,"hiredate":"02-ABR-1981 00:00:00","sal":2975,"deptno":20} ,{"empno":7788,"ename":"SCOTT","job":"ANALYST","mgr":7566,"hiredate":"19-ABR-1987 00:00:00","sal":3000,"deptno":20} ,{"empno":7876,"ename":"ADAMS","job":"CLERK","mgr":7788,"hiredate":"23-MAI-1987 00:00:00","sal":1100,"deptno":20} ,{"empno":7902,"ename":"FORD","job":"ANALYST","mgr":7566,"hiredate":"03-DEZ-1981 00:00:00","sal":3000,"deptno":20} ]}]} 5 linhas selecionadas. SYS@orclpdb>
- JSON-FORMATED
SYS@orclpdb> SET SQLFORMAT JSON-FORMATTED
SYS@orclpdb> SELECT * FROM emp WHERE deptno = 20;
{
"results" : [
{
"columns" : [
{
"name" : "EMPNO",
"type" : "NUMBER"
},
{
"name" : "ENAME",
"type" : "VARCHAR2"
},
{
"name" : "JOB",
"type" : "VARCHAR2"
},
{
"name" : "MGR",
"type" : "NUMBER"
},
{
"name" : "HIREDATE",
"type" : "DATE"
},
{
"name" : "SAL",
"type" : "NUMBER"
},
{
"name" : "COMM",
"type" : "NUMBER"
},
{
"name" : "DEPTNO",
"type" : "NUMBER"
}
],
"items" : [
{
"empno" : 7369,
"ename" : "SMITH",
"job" : "CLERK",
"mgr" : 7902,
"hiredate" : "17-DEZ-1980 00:00:00",
"sal" : 800,
"comm" : "",
"deptno" : 20
},
{
"empno" : 7566,
"ename" : "JONES",
"job" : "MANAGER",
"mgr" : 7839,
"hiredate" : "02-ABR-1981 00:00:00",
"sal" : 2975,
"comm" : "",
"deptno" : 20
},
{
"empno" : 7788,
"ename" : "SCOTT",
"job" : "ANALYST",
"mgr" : 7566,
"hiredate" : "19-ABR-1987 00:00:00",
"sal" : 3000,
"comm" : "",
"deptno" : 20
},
{
"empno" : 7876,
"ename" : "ADAMS",
"job" : "CLERK",
"mgr" : 7788,
"hiredate" : "23-MAI-1987 00:00:00",
"sal" : 1100,
"comm" : "",
"deptno" : 20
},
{
"empno" : 7902,
"ename" : "FORD",
"job" : "ANALYST",
"mgr" : 7566,
"hiredate" : "03-DEZ-1981 00:00:00",
"sal" : 3000,
"comm" : "",
"deptno" : 20
}
]
}
]
}
5 linhas selecionadas.
SYS@orclpdb>
7- ANSICONSOLE
O formato ANSICONSOLE redimensiona as colunas para a largura dos dados a fim de economizar espaço. Ele também sublinha as colunas, em vez de usar uma linha separada de saída. As linhas sublinhadas não são copiadas para texto simples.
SYS@orclpdb> SET SQLFORMAT ANSICONSOLE
SYS@orclpdb> SELECT * FROM emp WHERE deptno = 20;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
________ ________ __________ _______ _______________________ _______ _______ _________
7369 SMITH CLERK 7902 17-DEZ-1980 00:00:00 800 20
7566 JONES MANAGER 7839 02-ABR-1981 00:00:00 2975 20
7788 SCOTT ANALYST 7566 19-ABR-1987 00:00:00 3000 20
7876 ADAMS CLERK 7788 23-MAI-1987 00:00:00 1100 20
7902 FORD ANALYST 7566 03-DEZ-1981 00:00:00 3000 20
5 linhas selecionadas.
SYS@orclpdb>
8- INSERT
O formato INSERT produz as instruções INSERT que poderiam ser usadas para recriar as linhas em uma tabela. Aqui entra o ponto que comentei, muito mais prático no momento de um backup ou alguma atividade específica em momentos onde a massa de dados para formatar e muito grande. Usando o SET SQLFORMAT INSERT você consegue gerar os comandos em segundos.
SYS@orclpdb> SET SQLFORMAT INSERT SYS@orclpdb> 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_date('17-DEZ-1980 00:00:00','DD-MON-YYYY HH24:MI:SS'),'800',null,'20'); Insert into EMP (EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO) values ('7566','JONES','MANAGER','7839',to_date('02-ABR-1981 00:00:00','DD-MON-YYYY HH24:MI:SS'),'2975',null,'20'); Insert into EMP (EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO) values ('7788','SCOTT','ANALYST','7566',to_date('19-ABR-1987 00:00:00','DD-MON-YYYY HH24:MI:SS'),'3000',null,'20'); Insert into EMP (EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO) values ('7876','ADAMS','CLERK','7788',to_date('23-MAI-1987 00:00:00','DD-MON-YYYY HH24:MI:SS'),'1100',null,'20'); Insert into EMP (EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO) values ('7902','FORD','ANALYST','7566',to_date('03-DEZ-1981 00:00:00','DD-MON-YYYY HH24:MI:SS'),'3000',null,'20'); 5 linhas selecionadas. SYS@orclpdb>
9- LOADER
O formato LOADER produz saída delimitada por pipe com valores de string entre aspas duplas. Os nomes das colunas não são incluídos na saída.
SYS@orclpdb> SET SQLFORMAT LOADER SYS@orclpdb> 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| 7788|"SCOTT"|"ANALYST"|7566|"1987-04-19 00:00:00"|3000||20| 7876|"ADAMS"|"CLERK"|7788|"1987-05-23 00:00:00"|1100||20| 7902|"FORD"|"ANALYST"|7566|"1981-12-03 00:00:00"|3000||20| 5 linhas selecionadas. SYS@orclpdb>
10- FIXED
O formato FIXO produz colunas de largura fixa com todos os dados entre aspas duplas. A primeira linha contém os nomes das colunas.
SYS@orclpdb> SET SQLFORMAT FIXED
SYS@orclpdb> SELECT * FROM emp WHERE deptno = 20;
"EMPNO" "ENAME" "JOB" "MGR" "HIREDATE" "SAL" "COMM"
"DEPTNO"
"7369" "SMITH" "CLERK" "7902" "17-DEZ-1980 00:00:00" "800" ""
"20"
"7566" "JONES" "MANAGER" "7839" "02-ABR-1981 00:00:00" "2975" ""
"20"
"7788" "SCOTT" "ANALYST" "7566" "19-ABR-1987 00:00:00" "3000" ""
"20"
"7876" "ADAMS" "CLERK" "7788" "23-MAI-1987 00:00:00" "1100" ""
"20"
"7902" "FORD" "ANALYST" "7566" "03-DEZ-1981 00:00:00" "3000" ""
"20"
5 linhas selecionadas.
SYS@orclpdb>
11- DELIMITED
O formato DELIMITADO é um caso especial, que permite definir manualmente a string delimitadora, assim como os caracteres que serão usados para envolver valores de string. O formato básico é o seguinte.
SET SQLFORMAT DELIMITED <delimiter> <left enclosure> <right enclosure>
No exemplo a seguir, a string delimitadora é ; e os valores das strings estão entre aspas duplas.
SYS@orclpdb> SET SQLFORMAT DELIMITED ; " "
SYS@orclpdb> SELECT * FROM emp WHERE deptno = 20;
"EMPNO";"ENAME";"JOB";"MGR";"HIREDATE";"SAL";"COMM";"DEPTNO"
7369;"SMITH";"CLERK";7902;17-DEZ-1980 00:00:00;800;;20
7566;"JONES";"MANAGER";7839;02-ABR-1981 00:00:00;2975;;20
7788;"SCOTT";"ANALYST";7566;19-ABR-1987 00:00:00;3000;;20
7876;"ADAMS";"CLERK";7788;23-MAI-1987 00:00:00;1100;;20
7902;"FORD";"ANALYST";7566;03-DEZ-1981 00:00:00;3000;;20
5 linhas selecionadas.
SYS@orclpdb>
Outro Exemplo, usando a string delimitadora \del\ :
SYS@orclpdb> SET SQLFORMAT DELIMITED \del\ " " SYS@orclpdb> 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-DEZ-1980 00:00:00\del\800\del\\del\20 7566\del\"JONES"\del\"MANAGER"\del\7839\del\02-ABR-1981 00:00:00\del\2975\del\\del\20 7788\del\"SCOTT"\del\"ANALYST"\del\7566\del\19-ABR-1987 00:00:00\del\3000\del\\del\20 7876\del\"ADAMS"\del\"CLERK"\del\7788\del\23-MAI-1987 00:00:00\del\1100\del\\del\20 7902\del\"FORD"\del\"ANALYST"\del\7566\del\03-DEZ-1981 00:00:00\del\3000\del\\del\20 5 linhas selecionadas. SYS@orclpdb>
Dessa forma, temos uma maneira rápida e simples para formatar dados usando o Sqlcl tornando a tarefa ágil quando temos uma massa de dados grande para realizar a atividade manualmente.
Conclusão:
- Como configurar o Sqlcl no Windows
- Como formatar dados usando sqlcl (DEFAULT,CSV,HTML,JSON,DELIMITED, FIXED,INSERT,LOADER,ANSICONSOLE)
Material de apoio:
- Oracle SQL Developer Command-Line Quick Reference, Release 17.4
- SQLcl : Format Query Results with the SET SQLFORMAT Command - ORACLE-BASE
Por hoje é isso pessoal, espero que esse conteúdo ajude de alguma forma e caso tenham alguma dúvida podem deixar aqui nos comentários ou me mandar via E-mail com Título da postagem, meu E-mail para envio de dúvidas e sugestões de novas postagens: pedrohvido@gmail.com.
Comentários
Postar um comentário