Ao usar SQLcl com Oracle Database, você pode exportar os resultados de sua consulta para um arquivo JSON com o
SPOOL
comando. Exemplo
Aqui está um exemplo que exporta uma tabela inteira:
SET SQLFORMAT json;
SPOOL '/Users/barney/data/regions.json';
SELECT * FROM regions;
SPOOL off;
SET SQLFORMAT ansiconsole;
Aqui está o que ele fez, linha por linha:
- A primeira linha define
SQLFORMAT
parajson
. Isso garante que nosso.json
resultante arquivo de fato contém JSON. Você também pode usarjson-formatted
para gerar o JSON em um formato mais amigável (mais sobre isso posteriormente). - A segunda linha usa o
SPOOL
comando para especificar onde o arquivo de saída será gravado. Certifique-se de alterar/Users/barney/data/regions.json
para um local em seu sistema e um nome de arquivo apropriado. - Na terceira linha, executei a consulta SQL – os resultados para os quais estou exportando. Nesse caso, exportei todas as
regions
tabela. - Em seguida, virei
SPOOL
desligado. - Por último, configurei
SQLFORMAT
de volta à minha configuração original, que eraansiconsole
. Isso é opcional – você pode deixar emjson
se preferir, ou altere para outra coisa.
Aqui está a aparência do arquivo resultante:
{"results":[{"columns":[{"name":"REGION_ID","type":"NUMBER"},{"name":"REGION_NAME","type":"VARCHAR2"}],"items": [ {"region_id":1,"region_name":"Europe"} ,{"region_id":2,"region_name":"Americas"} ,{"region_id":3,"region_name":"Asia"} ,{"region_id":4,"region_name":"Middle East and Africa"} ]}]} 4 rows selected.
Como mencionado, você também tem a opção de usar
json-formatted
para gerar o JSON em um formato mais amigável, com recuos, etc. Incluí um exemplo disso na parte inferior deste artigo. Remover comentários
Você pode remover o
X rows selected
com SET FEEDBACK off
:SET SQLFORMAT json;
SET FEEDBACK off;
SPOOL '/Users/barney/data/regions_feedback_off.json';
SELECT * FROM regions;
SPOOL off;
SET FEEDBACK on;
SET SQLFORMAT ansiconsole;
Resultado:
{"results":[{"columns":[{"name":"REGION_ID","type":"NUMBER"},{"name":"REGION_NAME","type":"VARCHAR2"}],"items": [ {"region_id":1,"region_name":"Europe"} ,{"region_id":2,"region_name":"Americas"} ,{"region_id":3,"region_name":"Asia"} ,{"region_id":4,"region_name":"Middle East and Africa"} ]}]}
Neste caso eu virei
FEEDBACK
novamente após exportar o arquivo. Anexar os resultados
Por padrão,
SPOOL
usa REPLACE
, que substitui o arquivo se ele já existir. No entanto, podemos usar o
APPEND
argumento para anexar os resultados ao arquivo. Exemplo:
SET SQLFORMAT json;
SET FEEDBACK off;
SPOOL '/Users/barney/data/regions_feedback_off.json' APPEND;
SELECT * FROM regions;
SPOOL off;
SET FEEDBACK on;
SET SQLFORMAT ansiconsole;
Arquivo resultante:
{"results":[{"columns":[{"name":"REGION_ID","type":"NUMBER"},{"name":"REGION_NAME","type":"VARCHAR2"}],"items": [ {"region_id":1,"region_name":"Europe"} ,{"region_id":2,"region_name":"Americas"} ,{"region_id":3,"region_name":"Asia"} ,{"region_id":4,"region_name":"Middle East and Africa"} ]}]} {"results":[{"columns":[{"name":"REGION_ID","type":"NUMBER"},{"name":"REGION_NAME","type":"VARCHAR2"}],"items": [ {"region_id":1,"region_name":"Europe"} ,{"region_id":2,"region_name":"Americas"} ,{"region_id":3,"region_name":"Asia"} ,{"region_id":4,"region_name":"Middle East and Africa"} ]}]}
Este exemplo anexou os resultados ao arquivo que foi criado (e preenchido) no exemplo anterior. Isso resultou na duplicação da saída da consulta no arquivo.
Substituir o arquivo existente
Podemos usar
REPLACE
para substituir o arquivo existente com os resultados de uma nova consulta:SET SQLFORMAT json;
SET FEEDBACK off;
SPOOL '/Users/barney/data/regions_feedback_off.json' REPLACE;
SELECT * FROM regions;
SPOOL off;
SET FEEDBACK on;
SET SQLFORMAT ansiconsole;
Arquivo resultante:
{"results":[{"columns":[{"name":"REGION_ID","type":"NUMBER"},{"name":"REGION_NAME","type":"VARCHAR2"}],"items": [ {"region_id":1,"region_name":"Europe"} ,{"region_id":2,"region_name":"Americas"} ,{"region_id":3,"region_name":"Asia"} ,{"region_id":4,"region_name":"Middle East and Africa"} ]}]}
Como mencionado,
REPLACE
é a configuração padrão, então poderíamos simplesmente omitir esse argumento completamente. JSON formatado
Você também pode usar
json-formatted
para gerar o JSON em um formato mais amigável:SET SQLFORMAT json-formatted;
SPOOL '/Users/barney/data/regions_formatted.json';
SELECT * FROM regions;
SPOOL off;
SET SQLFORMAT ansiconsole;
Resultado:
{ "results" : [ { "columns" : [ { "name" : "REGION_ID", "type" : "NUMBER" }, { "name" : "REGION_NAME", "type" : "VARCHAR2" } ], "items" : [ { "region_id" : 1, "region_name" : "Europe" }, { "region_id" : 2, "region_name" : "Americas" }, { "region_id" : 3, "region_name" : "Asia" }, { "region_id" : 4, "region_name" : "Middle East and Africa" } ] } ] }