# Inserir JSON em bancos de dados

### **Desafio** <a href="#desafio" id="desafio"></a>

JSON é o principal formato de dados usado no **Skyone Studio** e geralmente você pode querer escrever vários registros de dados de uma matriz JSON em um banco de dados relacional.

Você pode sempre processar cada elemento da matriz individualmente e usar um INSERT regular para armazenar o registro no banco de dados. Entretanto, a maioria dos bancos de dados tem ferramentas para receber uma matriz JSON como argumento para uma função que mapeia os elementos da matriz para as colunas do banco de dados. Essas funções nos permitem passar grandes matrizes JSON para um único INSERT, economizando tempo e processamento a partir dos fluxos do **Skyone Studio**.

### **JSON Source** <a href="#json-source" id="json-source"></a>

Como exemplo, considere a array de **trades** extraídas da CoinAPI:

```json
[
    {
        "symbol_id": "BITSTAMP_SPOT_BTC_USD",
        "time_exchange": "2023-01-23T00:16:24.1850000Z",
        "time_coinapi": "2023-01-23T00:16:24.2096192Z",
        "uuid": "f4b6a7d3-3a6b-4870-9073-383c62f68d6b",
        "price": 22688,
        "size": 0.0268,
        "taker_side": "BUY"
    },
    {
        "symbol_id": "BITSTAMP_SPOT_BTC_USD",
        "time_exchange": "2023-01-23T00:16:26.6100000Z",
        "time_coinapi": "2023-01-23T00:16:26.6324401Z",
        "uuid": "b473a149-e174-4c98-a7e6-561b0ad470be",
        "price": 22691,
        "size": 0.00419,
        "taker_side": "BUY"
    }
]

```

Normalmente queremos INSERT todo o array em uma única operação de banco de dados.

### **Postgres** <a href="#postgres" id="postgres"></a>

Vamos supor que já temos o banco de dados de **trades** criado com os nomes de coluna idênticos aos nomes de propriedade da array de operações.

No campo de **query** da operação do banco de dados, você pode configurar:

```json
INSERT INTO trades 
SELECT * FROM 
json_populate_recordset (NULL::trades, 
'<>trades</>'
);

```

Onde <>trades\</> é um parâmetro que contém a array como especificado acima.

**Oracle**

Vamos supor que já temos o banco de dados de **trades** criado com os nomes de coluna idênticos aos nomes de propriedade da array de operações.

No campo de **query** da operação do banco de dados, você pode configurar:

```json
DECLARE
my_array CLOB := '<>trades</>';
BEGIN
INSERT INTO trades (SYMBOL_ID, TIME_EXCHANGE, TIME_COINAPI, UUID, PRICE, "SIZE", TAKER_SIDE)
select * from json_table(my_array format json,'$[*]' 
columns(
    symbol_id varchar path '$[*].symbol_id',    
    time_exchange timestamp path '$[*].time_exchange',
    time_coinapi timestamp path '$[*].time_coinapi',
    uuid varchar path '$[*].uuid',
    price number path '$[*].price',
    "SIZE" number path '$[*].size',
    taker_side varchar path '$[*].taker_side'    
));
END;

```

Onde <>trades\</> é um parâmetro que contém a array como especificado acima.

Observe que temos que usar a variável **my\_array** para armazenar a array JSON original. Isto é necessário para lidar com arrays maiores que 4000 caracteres.

### **MS SQL** <a href="#ms-sql" id="ms-sql"></a>

Vamos supor que já temos o banco de dados de **trades** criado com os nomes de coluna idênticos aos nomes de propriedade da array de operações.

No campo de **query** da operação do banco de dados, você pode configurar:

```json
DECLARE @json NVARCHAR(max)  = N'<>trades</>' 
INSERT INTO trades
SELECT * FROM OPENJSON(@json)  
WITH   
(
    symbol_id VARCHAR(200) '$.symbol_id',    
    time_exchange DATETIME '$.time_exchange',
    time_coinapi DATETIME '$.time_coinapi',
    uuid VARCHAR(200) '$.uuid',
    price NUMERIC '$.price',
    size NUMERIC '$.size',
    taker_side varchar(200) '$.take_side' 
) 
```

Onde <>trades\</> é um parâmetro que contém a array como especificado acima.

{% hint style="warning" %}
Se o seu JSON tiver strings com aspas simples como parte do texto, você pode precisar escapar delas duplicando as aspas simples. O MS SQL irá armazenar uma única aspas em seu lugar.
{% endhint %}

Leia também: [How to Escape a Single Quote in SQL Server](https://www.encodedna.com/sqlserver/tips/how-to-escape-a-single-quote-in-sql-server.htm)
