Carregar Dados de Arquivos na Nuvem
O pacote PL/SQL DBMS_CLOUD
oferece suporte ao carregamento de dados de arquivos na nuvem para tabelas criadas no Autonomous Database on Dedicated Exadata Infrastructure.
DBMS_CLOUD
:
- Arquivos de texto na nuvem, usando o procedimento
DBMS_CLOUD.COPY_DATA
- Arquivos JSON na nuvem, usando o procedimento
DBMS_CLOUD.COPY_TEXT
- O arquivo de origem está disponível como arquivo local em seu computador cliente ou foi transferido por upload para um armazenamento de objetos baseado na nuvem, como o Oracle Cloud Infrastructure Object Storage, e pode ser acessado pelo usuário do banco de dados que está tentando carregar dados.
- Suas credenciais do Cloud Object Storage são armazenadas usando o procedimento
DBMS_CLOUD.CREATE_CREDENTIAL
. Consulte Criar Credenciais para obter mais informações.
O pacote DBMS_CLOUD
oferece suporte ao carregamento de arquivos nos seguintes serviços de nuvem: Oracle Cloud Infrastructure Object Storage, Oracle Cloud Infrastructure Object Storage Classic, Azure Blob Storage e Amazon S3.
Tópicos Relacionados
Criar Credenciais
Saiba como armazenar sua credencial do Cloud Object Storage usando o procedimento DBMS_CLOUD.CREATE_CREDENTIAL
.
DBMS_CLOUD.CREATE_CREDENTIAL
usando qualquer ferramenta de banco de dados, como SQL*Plus, SQL Developer ou Database Actions (SQL Developer baseado na Web). Por exemplo:BEGIN
DBMS_CLOUD.CREATE_CREDENTIAL
(
credential_name => 'DEF_CRED_NAME',
username => 'adb_user@oracle.com',
password => 'password'
);
END;
/
Os valores fornecidos para username
e password
dependem do serviço de Cloud Object Storage que você está usando:
-
Oracle Cloud Infrastructure Object Storage:
username
is your Oracle Cloud Infrastructure user name andpassword
is your Oracle Cloud Infrastructure auth token. Consulte Como Trabalhar com Tokens de Autenticação. -
Oracle Cloud Infrastructure Object Storage Classic:
username
is your Oracle Cloud Infrastructure Classic user name andpassword
is your Oracle Cloud Infrastructure Classic password.
Esta operação armazena as credenciais no banco de dados em um formato criptografado. Você pode usar qualquer nome para o nome da credencial. Observe que essa etapa só é necessária uma vez, a menos que suas credenciais do armazenamento de objetos sejam alteradas. Depois de armazenar as credenciais, você poderá usar o mesmo nome de credencial para todos os carregamentos de dados.
Carregar Dados de Arquivos de Texto
Saiba como carregar dados de arquivos de texto na nuvem para seu Autonomous Database usando o procedimento DBMS_CLOUD.COPY_DATA
.
O arquivo de origem neste exemplo, channels.txt
, tem os seguintes dados:
S,Direct Sales,Direct T,Tele Sales,Direct C,Catalog,Indirect I,Internet,Indirect P,Partners,Others
Carregar um Arquivo JSON de Documentos Delimitados em uma Coleta
Saiba como carregar um arquivo JSON de documentos delimitados em uma coleção no seu Autonomous Database usando o procedimento DBMS_CLOUD.COPY_DATA
.
Este exemplo carrega valores JSON de um arquivo delimitado por linha e usa o arquivo JSON myCollection.json
. Cada valor e cada linha são carregados em uma coleção no Autonomous Database como um único documento.
Veja a seguir o exemplo desse arquivo. Ele tem três linhas, com um objeto por linha. Cada um desses objetos é carregado como um documento JSON separado.
{ "name" : "apple", "count": 20 } { "name" : "orange", "count": 42 } { "name" : "pear", "count": 10 }
Carregar um Array de Documentos JSON para uma Coleção
Saiba como carregar um array de documentos JSON em uma coleção no seu Autonomous Database usando o procedimento DBMS_CLOUD.COPY_COLLECTION
.
Este exemplo usa o arquivo JSON fruit_array.json
. Veja a seguir o conteúdo do arquivo fruit_array.json
:
[{"name" : "apple", "count": 20 }, {"name" : "orange", "count": 42 }, {"name" : "pear", "count": 10 }]
Copiar dados JSON para uma tabela existente
Use o DBMS_CLOUD.COPY_DATA
para carregar dados JSON na nuvem para uma tabela.
O arquivo de origem do exemplo é um arquivo de dados JSON.
Monitorar e Solucionar Problemas de Carga de Dados
Todas as operações de carregamento de dados feitas usando o pacote PL/SQL
são registradas nas tabelas DBMS_CLOUD
dba_load_operations
e user_load_operations
:
-
dba_load_operations
: mostra todas as operações de carga. -
user_load_operations
: mostra as operações de carga no seu esquema.
Consulte estas tabelas para ver informações sobre carregamentos de dados em andamento e concluídos. Por exemplo, o uso de uma instrução SELECT
com um predicado de cláusula WHERE
na coluna TYPE
mostra operações de carga com o tipo COPY
:
SELECT table_name, owner_name, type, status, start_time, update_time, logfile_table, badfile_table
FROM user_load_operations WHERE type = 'COPY';
TABLE_NAME OWNER_NAME TYPE STATUS START_TIME UPDATE_TIME LOGFILE_TABLE BADFILE_TABLE
---------- ----------- ------- ---------- ---------------------- --------------------- --------------- ------------- ------------- -------------
CHANNELS SH COPY COMPLETED 04-MAR-21 07.38.30.522711000 AM GMT 04-MAR-21 07.38.30.522711000 AM GMT COPY$1_LOG COPY$1_BAD
A coluna LOGFILE_TABLE
mostra o nome da tabela que você pode consultar para verificar o log de uma operação de carregamento. Por exemplo, a consulta a seguir mostra o log da operação de carregamento:
select * from COPY$21_LOG;
A coluna BADFILE_TABLE
mostra o nome da tabela que você pode consultar para verificar as linhas que apresentaram erros durante o carregamento. Por exemplo, a consulta a seguir mostra os registros rejeitados para a operação de carregamento:
select * from COPY$21_BAD;
Dependendo dos erros mostrados no log e das linhas mostradas na tabela BADFILE_TABLE
especificada, você pode corrigir o erro especificando as opções de formato corretas em DBMS_CLOUD.COPY_DATA
.
Observação:
As tabelasLOGFILE_TABLE
e BADFILE_TABLE
são armazenadas por dois dias para cada operação de carregamento e, em seguida, removidas automaticamente.
Consulte Procedimento DELETE_ALL_OPERATIONS para obter informações sobre como limpar a tabela user_load_operations
.
Objetos JSON Textuais que Representam Valores Escalares Estendidos
Os dados JSON binários nativos (formato OSON) estendem a linguagem JSON adicionando tipos escalares, como data, que correspondem aos tipos SQL e não fazem parte do padrão JSON. O Oracle Database também suporta o uso de objetos JSON textuais que representam valores escalares JSON, incluindo esses valores não padrão.
Quando você cria dados JSON binários nativos com base em dados JSON textuais que contêm esses objetos estendidos, eles podem, opcionalmente, ser substituídos por valores escalares JSON JSON correspondentes (binários nativos).
Um exemplo de objeto estendido é {"$numberDecimal":31}
. Ele representa um valor escalar JSON do tipo não padrão número decimal e, quando interpretado como tal, é substituído por um número decimal no formato binário nativo.
Por exemplo, quando você usa o construtor de tipo de dados JSON, JSON
, se você usar a palavra-chave EXTENDED
, os objetos estendidos reconhecidos na entrada textual serão substituídos pelos valores escalares correspondentes no resultado JSON binário nativo. Se você não incluir a palavra-chave EXTENDED
, essa substituição não ocorrerá; os objetos JSON estendidos textuais são simplesmente convertidos como estão para objetos JSON no formato binário nativo.
Por outro lado, ao usar a função SQL Oracle json_serialize
para serializar dados JSON binários como dados JSON textuais (VARCHAR2
, CLOB
ou BLOB
), você pode usar a palavra-chave EXTENDED
para substituir valores escalares JSON (binários nativos) pelos correspondentes objetos JSON textuais estendidos.
Observação:
Se o banco de dados que você usa for um Oracle Autonomous Database, você poderá usar o procedimento PL/SQL DBMS_CLOUD.copy_collection
para criar uma coleção de documentos JSON com base em um arquivo de dados JSON, como o produzido por bancos de dados NoSQL comuns, incluindo o Oracle NoSQL Database.
Se você usar ejson
como valor do parâmetro type
do procedimento, os objetos JSON estendidos reconhecidos no arquivo de entrada de dados serão substituídos pelos valores escalares correspondentes na coleção JSON binária resultante. Por outro lado, você pode usar a função json_serialize
com a palavra-chave EXTENDED
para substituir valores escalares por objetos JSON estendidos nos dados JSON textuais resultantes.
Estes são os dois principais casos de uso de objetos estendidos:
-
Troca (importação/exportação):
-
Consuma dados JSON existentes (em algum lugar) que contenham objetos estendidos.
-
Serialize dados JSON binários nativos como dados JSON textuais com objetos estendidos, para uso fora do banco de dados.
-
-
Inspeção de dados JSON binários nativos: veja o que você tem examinando objetos estendidos correspondentes.
Para fins de intercâmbio, você pode ingerir dados JSON de um arquivo produzido por bancos de dados NoSQL comuns, incluindo o Oracle NoSQL Database, convertendo objetos estendidos em escalares JSON binários nativos. Por outro lado, você pode exportar dados JSON binários nativos como dados textuais, substituindo valores JSON escalares específicos da Oracle pelos correspondentes objetos JSON textuais estendidos.
Dica:
Como exemplo de inspeção, considere um objeto como {"dob" : "2000-01-02T00:00:00"}
como resultado da serialização de dados JSON nativos. "2000-01-02T00:00:00"
é o resultado da serialização de um valor binário nativo do tipo data ou o valor binário nativo é apenas uma string? O uso de json_serialize
com a palavra-chave EXTENDED
permite que você saiba.
O mapeamento de campos de objeto estendido para tipos JSON escalares é, em geral, muitos para um: mais de um tipo de objeto JSON estendido pode ser mapeado para um determinado valor escalar. Por exemplo, os objetos JSON estendidos {"$numberDecimal":"31"}
e {"$numberLong:"31"}
são convertidos com o valor 31 do número do tipo escalar da linguagem JSON e o método de item type()
retorna "number"
para cada um desses escalares JSON.
O método de item type()
reporta o tipo escalar da linguagem JSON de seu valor de destino (como uma string JSON). Alguns valores escalares são distinguíveis internamente, mesmo quando têm o mesmo tipo escalar. Isso geralmente permite que a função json_serialize
(com a palavra-chave EXTENDED
) reconstrua o objeto JSON estendido original. Esses valores escalares são distinguidos internamente usando diferentes tipos SQL para implementá-los ou marcando-os com o tipo de objeto JSON estendido do qual são derivados.
Quando json_serialize
reconstrui o objeto JSON estendido original, o resultado nem sempre é textualmente idêntico ao original, mas é sempre semanticamente equivalente. Por exemplo, {"$numberDecimal":"31"}
e {"$numberDecimal":31}
são semanticamente equivalentes, mesmo que os valores de campo sejam diferentes em tipo (string e número). Eles são convertidos no mesmo valor interno e cada um é marcado como derivado de um objeto estendido $numberDecimal
(mesma tag). Mas quando serializado, o resultado de ambos é {"$numberDecimal":31}
. A Oracle sempre usa o tipo mais diretamente relevante para o valor do campo que, nesse caso, é o valor 31
da linguagem JSON, do número do tipo escalar.
A Tabela - apresenta correspondências entre os vários tipos usados. Ela é mapeada entre (1) tipos de objetos estendidos usados como entrada, (2) tipos reportados pelo método de item type()
, (3) tipos SQL usados internamente, (4) tipos de linguagem JSON padrão usados como saída pela função json_serialize
e (5) tipos de saída de objetos estendidos por json_serialize
quando a palavra-chave EXTENDED
é especificada.
Tabela - Relações de Tipo de Objeto JSON Estendido
Tipo de Objeto Estendido (Entrada) | Tipo Escalar JSON Oracle (Reportado por type()) | Tipo Escalar SQL | Tipo Escalar JSON Padrão (Saída) | Tipo de Objeto Estendido (Saída) |
---|---|---|---|---|
$numberDouble com o valor sendo um número JSON, uma string que representa o número ou uma destas strings: "Infinity" , "-Infinity" , "Inf" , "-Inf" , "Nan" Rodapé 1
|
duplo | BINARY_DOUBLE |
number |
$numberDouble com o valor sendo um número JSON ou uma destas strings: "Inf" , "-Inf" , "Nan" Ritmo 2 |
$numberFloat com valor igual a $numberDouble |
flutuante | BINARY_FLOAT |
number |
$numberFloat com valor igual a $numberDouble |
$numberDecimal com valor igual a $numberDouble |
number | NUMBER |
number |
$numberDecimal com valor igual a $numberDouble |
$numberInt com o valor sendo um inteiro de 32 bits assinado ou uma string que representa o número
|
number | NUMBER |
number |
$numberInt com valor igual a $numberDouble |
$numberLong com o valor sendo um número JSON ou uma string que representa o número
|
number | NUMBER |
number |
$numberLong com valor igual a $numberDouble |
Quando o valor é uma string de caracteres base-64, o objeto estendido também pode ter o campo |
binário | BLOB ou RAW |
string A conversão é equivalente ao uso da função SQL |
Uma das seguintes opções se aplica:
|
$oid com o valor sendo uma string de 24 caracteres hexadecimais
|
binário | RAW(12) |
string A conversão é equivalente ao uso da função SQL |
$rawid com o valor sendo uma string de 24 caracteres hexadecimais
|
$rawhex com valor sendo uma string com um número par de caracteres hexadecimais
|
binário | RAW |
string A conversão é equivalente ao uso da função SQL |
$binary com o valor sendo uma string de caracteres base-64, preenchida à direita com caracteres =
|
$rawid com o valor sendo uma string de 24 ou 32 caracteres hexadecimais
|
binário | RAW |
string A conversão é equivalente ao uso da função SQL |
$rawid |
$oracleDate com o valor sendo uma string de data ISO 8601
|
data | DATE |
string |
$oracleDate com o valor sendo uma string de data ISO 8601
|
$oracleTimestamp com o valor sendo uma string de timestamp ISO 8601
|
timestamp | TIMESTAMP |
string |
$oracleTimestamp com o valor sendo uma string de timestamp ISO 8601
|
$oracleTimestampTZ com o valor sendo uma string de timestamp ISO 8601 com um deslocamento de fuso horário numérico ou com Z |
timestamp com fuso horário | TIMESTAMP WITH TIME ZONE |
string |
$oracleTimestampTZ com o valor sendo uma string de timestamp ISO 8601 com um deslocamento de fuso horário numérico ou com Z |
|
timestamp com fuso horário | TIMESTAMP WITH TIME ZONE |
string |
$oracleTimestampTZ com o valor sendo uma string de timestamp ISO 8601 com um deslocamento de fuso horário numérico ou com Z |
$intervalDaySecond com o valor sendo uma string de intervalo ISO 8601, conforme especificado para a função SQL to_dsinterval |
daysecondInterval | INTERVAL DAY TO SECOND |
string |
$intervalDaySecond com o valor sendo uma string de intervalo ISO 8601, conforme especificado para a função SQL to_dsinterval |
$intervalYearMonth com o valor sendo uma string de intervalo ISO 8601, conforme especificado para a função SQL to_yminterval |
yearmonthInterval | INTERVAL YEAR TO MONTH |
string |
$intervalYearMonth com o valor sendo uma string de intervalo ISO 8601, conforme especificado para a função SQL to_yminterval |
Dois campos:
|
vetor | VECTOR |
array de números |
Dois campos:
|
Observação 1 Os valores de string são interpretados sem maiúsculas e minúsculas. Por exemplo, "NAN"
"nan"
e "nAn"
são aceitos e equivalentes; da mesma forma, "INF"
, "inFinity"
e "iNf"
. Números infinitamente grandes ("Infinity"
ou "Inf"
) e pequenos ("-Infinity"
ou "-Inf"
) são aceitos com a palavra completa ou a abreviação.
Observação 2 Na saída, somente esses valores de string são usados - sem variantes da palavra completa Infinity ou letra maiúscula.