powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Как выдернуть часть JSON?
15 сообщений из 15, страница 1 из 1
Как выдернуть часть JSON?
    #39428747
Oracloidesche
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нужна консультация

Есть большой JSON в CLOB:
Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
{
  "key1": "value1",
  "key2": "value2",
  "data": {
    "dt": "2017-01-01T00:00:00",
    "super_big_array": [ 
    .... тут огромное кол-во объектов, мегабайт на 100 ...
    ]
  }
}



Вот как мне выдернуть в другой clob то, что лежит в data?
т.е. чтобы там получилось

Код: javascript
1.
2.
3.
4.
5.
6.
{
    "dt": "2017-01-01T00:00:00",
    "super_big_array": [ 
    .... тут огромное кол-во объектов, мегабайт на 100 ...
    ]
}



Мне в голову приходит только поискать в начале "data": , и в конце какой-нибудь последовательности символов...
В поддержке json, которая появилась в 12с нет ничего чтобы выдернуть это более высокоуровневыми средствами? Другие варианты тоже выслушаю если есть.

Спасибо.
...
Рейтинг: 0 / 0
Как выдернуть часть JSON?
    #39428809
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Oracloidesche
Код: javascript
1.
2.
    "super_big_array": [ 
    .... тут огромное кол-во объектов, мегабайт на 100 ...

Обратно пропорциональное количеству мозгов архитектора?
...
Рейтинг: 0 / 0
Как выдернуть часть JSON?
    #39428937
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OracloidescheВ поддержке json, которая появилась в 12с нет ничего чтобы выдернуть это более высокоуровневыми средствами?Попробуй API for JSON Processing .

Средствами SQL не выйдет (если не влезает в varchar) даже если обратиться "поэлементно" и обернуть враппером.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
drop table tj;

create table tj (id int, value clob, constraint check_json check(value is json));

insert into tj
select
rownum,
'{
  "key1": "value1",
  "key2": "value2",
  "data": {
    "dt": "2017-01-01T00:00:00",
    "super_big_array": [ 
    {
    "aaa": 111, "bbb": 222,
    "yyy": 666, "zzz": 777   
    }
    ]
  }
}'
from dual
connect by rownum <= 4;

update tj t
   set value = regexp_replace(t.value,
                              '(\d)(\1{2})',
                              '"\1\2' || lpad('x', power(10, rownum), 'x') || '"')
 where id > 1;

commit;


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
SQL> set lines 160 pages 160
SQL> column aaa format a35
SQL> column aaa_ format a35
SQL> column arr1 format a35
SQL> column arr2 format a35
SQL> select json_query("T"."VALUE" format json,
  2                    '$.data.super_big_array.aaa' asis) aaa,
  3         json_query("T"."VALUE" format json,
  4                    '$.data.super_big_array.aaa' with conditional array
  5                    wrapper error on error) aaa_,
  6         json_query("T"."VALUE" format json,
  7                    '$.data.super_big_array[*]' asis with array wrapper) arr1,
  8         json_query("T"."VALUE" format json, '$.data.super_big_array' asis) arr2
  9    from tj t;

AAA                                 AAA_                                ARR1                             ARR2
----------------------------------- ----------------------------------- ----------------------------------- -----------------------------------
111                                 [111]                               [{"aaa":111,"bbb":222,"yyy":666,"zz [{"aaa":111,"bbb":222,"yyy":666,"zz
                                                                        z":777}]                            z":777}]

111xxxxxxxxxx                       ["111xxxxxxxxxx"]                   [{"aaa":"111xxxxxxxxxx","bbb":"222x [{"aaa":"111xxxxxxxxxx","bbb":"222x
                                                                        xxxxxxxxx","yyy":"666xxxxxxxxxx","z xxxxxxxxx","yyy":"666xxxxxxxxxx","z
                                                                        zz":"777xxxxxxxxxx"}]               zz":"777xxxxxxxxxx"}]

111xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ["111xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx [{"aaa":"111xxxxxxxxxxxxxxxxxxxxxxx [{"aaa":"111xxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx   xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
                                    "]                                  xxxxxxx","bbb":"222xxxxxxxxxxxxxxxx xxxxxxx","bbb":"222xxxxxxxxxxxxxxxx
                                                                        xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
                                                                        xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
                                                                        xxxxxxxxxxxxxx","yyy":"666xxxxxxxxx xxxxxxxxxxxxxx","yyy":"666xxxxxxxxx
                                                                        xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
                                                                        xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
                                                                        xxxxxxxxxxxxxxxxxxxxx","zzz":"777xx xxxxxxxxxxxxxxxxxxxxx","zzz":"777xx
                                                                        xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
                                                                        xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
                                                                        xxxxxxxxxxxxxxxxxxxxxxxxxxxx"}]     xxxxxxxxxxxxxxxxxxxxxxxxxxxx"}]

111xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ["111xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxx             xxxxxxxxxxxxxxxxxxxxxxxxx"]


SQL>

ElicOracloidesche
Код: javascript
1.
2.
    "super_big_array": [ 
    .... тут огромное кол-во объектов, мегабайт на 100 ...

Обратно пропорциональное количеству мозгов архитектора?Почему?

По-моему главная ошибка это опираться на сырую встроенную реализацию, т.к.
во-первых Оракл пока не поддерживает создание json, а только парсинг,
во-вторых при парсинге токен может быть только типа varchar2.

Или если кто-то использует, скажем, XML, а не json на 100 метров, то это тоже значит отсутствие мозгов?
...
Рейтинг: 0 / 0
Как выдернуть часть JSON?
    #39428943
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbms_photoshopИли если кто-то использует, скажем, XML, а не json на 100 метров, то это тоже значит отсутствие мозгов?Да. Это неподходящие форматы для таких объёмов.
...
Рейтинг: 0 / 0
Как выдернуть часть JSON?
    #39428956
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Elicdbms_photoshopИли если кто-то использует, скажем, XML, а не json на 100 метров, то это тоже значит отсутствие мозгов?Да. Это неподходящие форматы для таких объёмов.Для хранения в Оракле не подходящие
По двум причинам, средства Оракла не блещут при работе с большими XML (и тем более json) и по ряду причин данные лучше хранить в реляционном виде.

А для взаимодействия между системами, почему нет.
xml/json позволяют иметь nested данные, что может в разы уменьшить объем в сравнении с плоским cvs, например.
Да и вообще в ряде приложений - это стандарты для обмена данными.
И если ТС, скажем, получает некоторый json через API, то перед ним вполне может стоять описанная задача.

PS. В hadoop, например, разработчик волен выбирать в каком формате хранятся данные путем указания SerDe
и имеется встроенный парсер для json, так что желающие могут хранить терабайты джейсонов и не испытывать особых проблем.
...
Рейтинг: 0 / 0
Как выдернуть часть JSON?
    #39428962
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbms_photoshopДа и вообще в ряде приложений - это стандарты для обмена данными.Нормальное API даст piecewise интерфейс.
Здравым смыслом был бы потоковый формат из xml/json-чиков.
...
Рейтинг: 0 / 0
Как выдернуть часть JSON?
    #39429007
Oracloidesche
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, это интеграция с внешней системой. Сами пытались до них донести, что это плохая идея, но все же считают себя самыми умными. Прикол еще в том, что от этой data делается подпись sha3-512 и мы эту подпись проверить должны :)
...
Рейтинг: 0 / 0
Как выдернуть часть JSON?
    #39429013
Oracloidesche
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbms_photoshop,

То что на Java можно спокойно распарсить такие объемы - понятно, я таким уже занимался, просто не хочется переносить логику в Java, но видимо придется
...
Рейтинг: 0 / 0
Как выдернуть часть JSON?
    #39429030
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Elicdbms_photoshopДа и вообще в ряде приложений - это стандарты для обмена данными.Нормальное API даст piecewise интерфейс.
Здравым смыслом был бы потоковый формат из xml/json-чиков.Во-первых, в некоторых системах есть такое понятие как порция данных, которую получатель потребляет at one go.
Во-вторых, если в порции передается миллионы трейдов, например, то весьма сомнительно что дергать интерфейс миллионы раз целесообразнее.
...
Рейтинг: 0 / 0
Как выдернуть часть JSON?
    #39429035
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Oracloideschedbms_photoshop,

То что на Java можно спокойно распарсить такие объемы - понятно, я таким уже занимался, просто не хочется переносить логику в Java, но видимо придетсяНа самом деле ты должен быть благодарен, что сразу напоролся на что-то подобное.
Ибо в случае с XML ты мог бы написать обработку в базе и все хорошо работало бы до поры до времени,
но потом при увеличении объемов в два раза какие-то части системы замедлились в 10 раз,
а на каких-то стали валиться разнообразные internal errors и появилась бы задача все переписывать с нуля.
...
Рейтинг: 0 / 0
Как выдернуть часть JSON?
    #39429039
Oracloidesche
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbms_photoshop,

Ну так, не первый день с Ораклом, сразу решил проработать узкие места, до того как все написать :)
...
Рейтинг: 0 / 0
Как выдернуть часть JSON?
    #39429597
ora601
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Oracloidesche,

Если элемент в "super_big_array" не превышает 4к, то вполне возможно вытащить их все как rows обычным запросом.


Код: plsql
1.
2.
3.
4.
5.
 SELECT jt."big_arr_elem"
  FROM tj,
       json_table(value, '$.data.super_big_array[*]' 
         COLUMNS ("big_arr_elem" VARCHAR2 
                  PATH '$')) AS jt ;
...
Рейтинг: 0 / 0
Как выдернуть часть JSON?
    #39429601
Фотография Shtock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>>во-первых Оракл пока не поддерживает создание json, а только парсинг,

12.2 протестует!
...
Рейтинг: 0 / 0
Как выдернуть часть JSON?
    #39429736
Фотография Shtock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
with jdata as (
select '{
  "key1": "value1",
  "key2": "value2",
  "data": {
    "dt": "2017-01-01T00:00:00",
    "super_big_array": [ 
    1,2,365,9
    ]
  }
}' js
from dual
)
 SELECT  '{
    "dt": "2017-01-01T00:00:00",
    "super_big_array": [' || RTRIM(XMLAGG(XMLELEMENT(E,jt."big_arr_elem",',').EXTRACT('//text()') ).GetClobVal(),',') || ']
}'AS cl
  FROM jdata,
       json_table(js, '$.data.super_big_array[*]' 
         COLUMNS ("big_arr_elem" VARCHAR2 
                  PATH '$')) AS jt ;
...
Рейтинг: 0 / 0
Как выдернуть часть JSON?
    #39430415
Oracloidesche
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shtock,

Не, мне потом от этого хэш считать, а это значит, что я не могу соврать ни в одном байте от первоначальной json строки.

Да ладно, я уже наваял на Java через Jackson Streaming API, там можно выдернуть подстроку от и до конкретного байта ну и Streaming API не будет жрать память.
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Как выдернуть часть JSON?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]