Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Como exportar os resultados da consulta Oracle para um arquivo JSON ao usar SQLcl


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 para json . Isso garante que nosso .json resultante arquivo de fato contém JSON. Você também pode usar json-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 era ansiconsole . Isso é opcional – você pode deixar em json 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"
        }
      ]
    }
  ]
}