Вы можете:
- Создать внешнюю таблицу для чтения файла
- Использовать JSON_table для преобразования документа в реляционные строки-столбцы
Это выглядит примерно так:
/* Create the file */
create or replace directory tmp as '/tmp';
declare
f utl_file.file_type;
begin
f := utl_file.fopen ('TMP', 'input.json', 'w');
utl_file.put_line ( f, '{ "CAR":["%HON%","%UZU%"], "NAME":["%RAY%","%OE%"] }');
utl_file.fclose(f);
end;
/
create table json_ext (
json_doc varchar2(100)
) organization external (
default directory tmp
access parameters (
records delimited by newline
fields (
json_doc char(1000)
)
)
location ( 'input.json' )
);
select * from json_ext;
JSON_DOC
{ "CAR":["%HON%","%UZU%"], "NAME":["%RAY%","%OE%"] }
select *
from json_ext,
json_table (
json_doc, '$'
columns (
nested path '$.CAR[*]' columns (
CAR path '$'
),
nested path '$.NAME[*]' columns (
NAME path '$'
)
)
);
JSON_DOC CAR NAME
{ "CAR":["%HON%","%UZU%"], "NAME":["%RAY%","%OE%"] } %HON% <null>
{ "CAR":["%HON%","%UZU%"], "NAME":["%RAY%","%OE%"] } %UZU% <null>
{ "CAR":["%HON%","%UZU%"], "NAME":["%RAY%","%OE%"] } <null> %RAY%
{ "CAR":["%HON%","%UZU%"], "NAME":["%RAY%","%OE%"] } <null> %OE%
Это разбивает каждый массив на собственный набор строк и столбцов.Чтобы получить это как единый список имен атрибутов и значений массива, вы можете unpivot
результаты:
with rws as (
select j.*
from json_ext,
json_table (
json_doc, '$'
columns (
nested path '$.CAR[*]' columns (
CAR path '$'
),
nested path '$.NAME[*]' columns (
NAME path '$'
)
)
) j
)
select * from rws
unpivot (
val for attr in ( CAR, NAME )
);
ATTR VAL
CAR %HON%
CAR %UZU%
NAME %RAY%
NAME %OE%