Гость
Форумы / Oracle [игнор отключен] [закрыт для гостей] / оракл 19. селект то json / 25 сообщений из 27, страница 1 из 2
28.07.2020, 16:05
    #39984692
andreymx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
оракл 19. селект то json
что-то я далеко отстал от оракла

подскажите аналог тскл-запроса:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
with t as
(
select 1 grp, 1 id, '1' x union all
select 1 grp, 2 id, '2' x union all
select 1 grp, 3 id, '3' x union all
select 2 grp, 4 id, '4' x union all
select 3 grp, 5 id, '5' x
)
select *
   from t
 for json auto

результат примерно такой

[
{"grp":1,"id":1,"x":"1"},
{"grp":1,"id":2,"x":"2"},
{"grp":1,"id":3,"x":"3"},
{"grp":2,"id":4,"x":"4"},
{"grp":3,"id":5,"x":"5"}
]
...
Рейтинг: 0 / 0
28.07.2020, 16:35
    #39984699
Synoptic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
оракл 19. селект то json
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
with t as
(
select 1 grp, 1 id, '1' x from dual union all
select 1 grp, 2 id, '2' x from dual union all
select 1 grp, 3 id, '3' x from dual union all
select 2 grp, 4 id, '4' x from dual union all
select 3 grp, 5 id, '5' x from dual
)

select json_object('grp' value grp, 'id' value id, 'x' value x) json from t
...
Рейтинг: 0 / 0
28.07.2020, 16:36
    #39984700
Synoptic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
оракл 19. селект то json
andreymx, только здесь зона Оракла, а не T-SQL
...
Рейтинг: 0 / 0
28.07.2020, 17:08
    #39984708
andreymx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
оракл 19. селект то json
Synoptic
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
with t as
(
select 1 grp, 1 id, '1' x from dual union all
select 1 grp, 2 id, '2' x from dual union all
select 1 grp, 3 id, '3' x from dual union all
select 2 grp, 4 id, '4' x from dual union all
select 3 grp, 5 id, '5' x from dual
)

select json_object('grp' value grp, 'id' value id, 'x' value x) json from t

а оно точно вернёт одну строку?
...
Рейтинг: 0 / 0
28.07.2020, 17:44
    #39984716
ASNexus
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
оракл 19. селект то json
andreymx,

Вот так точно вернет одну строку:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
with t as
(
select 1 grp, 1 id, '1' x from dual union all
select 1 grp, 2 id, '2' x from dual union all
select 1 grp, 3 id, '3' x from dual union all
select 2 grp, 4 id, '4' x from dual union all
select 3 grp, 5 id, '5' x from dual
)
select json_arrayagg(json_object('grp' value grp, 'id' value id, 'x' value x)) json from t
...
Рейтинг: 0 / 0
28.07.2020, 17:45
    #39984718
dmdmdm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
оракл 19. селект то json
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
Connected to Oracle Database 18c Express Edition Release 18.0.0.0.0 
Connected as user1@//192.168.1.201:1522/XE

SQL> with t as
  2  (
  3  select 1 grp, 1 id, '1' x from dual union all
  4  select 1 grp, 2 id, '2' x from dual union all
  5  select 1 grp, 3 id, '3' x from dual union all
  6  select 2 grp, 4 id, '4' x from dual union all
  7  select 3 grp, 5 id, '5' x from dual
  8  ) select json_object('grp' value grp, 'id' value id, 'x' value x) json from t
  9  ;

JSON
--------------------------------------------------------------------------------
{"grp":1,"id":1,"x":"1"}
{"grp":1,"id":2,"x":"2"}
{"grp":1,"id":3,"x":"3"}
{"grp":2,"id":4,"x":"4"}
{"grp":3,"id":5,"x":"5"}

SQL> 
...
Рейтинг: 0 / 0
28.07.2020, 18:03
    #39984722
Vint
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
оракл 19. селект то json
ASNexus,
сначала упрешься в 32кб. потом в ora-600 при преобразовании в clob
...
Рейтинг: 0 / 0
28.07.2020, 18:19
    #39984726
ASNexus
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
оракл 19. селект то json
Vint,

Из приведенного примера 32 кБ получить сложно, а на реальной задаче об этом уже можно будет думать.

Да и перспектива получить ora-600 наверное зависит как минимум от версии. Проверил на Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production:
Код: plsql
1.
2.
3.
4.
5.
with t as
(
select level grp, level id, level x from dual connect by level<100000
)
select json_arrayagg(json_object('grp' value grp, 'id' value id, 'x' value x) returning clob) json from t


Успешно. Размер полученного CLOB 3 466 648 символов, больше не стал экспериментировать.
...
Рейтинг: 0 / 0
28.07.2020, 18:26
    #39984728
Vint
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
оракл 19. селект то json
ASNexus,
Преобразование числа в json наивный чукотский вьюнош, на проме будет поздно
...
Рейтинг: 0 / 0
28.07.2020, 22:45
    #39984774
andreymx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
оракл 19. селект то json
Vint
ASNexus,
сначала упрешься в 32кб. потом в ora-600 при преобразовании в clob


ASNexus
Vint,

Из приведенного примера 32 кБ получить сложно, а на реальной задаче об этом уже можно будет думать.
......

Размер полученного CLOB 3 466 648 символов, больше не стал экспериментировать.


попробовал на
VERSIONVERSION_LEGACYVERSION_FULL19.0.0.0.019.0.0.0.019.7.0.0.0
Код: plsql
1.
2.
3.
4.
5.
6.
7.
SELECT JSON_ARRAYAGG (
        JSON_OBJECT (
            object_name,
            OWNER,
            OBJECT_ID, DATA_OBJECT_ID, OBJECT_TYPE, CREATED, LAST_DDL_TIME, TIMESTAMP, STATUS
             FORMAT JSON ) RETURNING CLOB ) AS   a
  FROM     all_objects;

получил CLOB 12м без ошибок
...
Рейтинг: 0 / 0
28.07.2020, 22:59
    #39984778
andreymx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
оракл 19. селект то json
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
CREATE TABLE TEST_CLOB(ID NUMBER, TEST_CLOB CLOB, stat2 DATE);


INSERT INTO TEST_CLOB(ID, TEST_CLOB, stat2)
SELECT 1, JSON_ARRAYAGG (
        JSON_OBJECT (
            object_name,
            OWNER,
            OBJECT_ID, DATA_OBJECT_ID, OBJECT_TYPE, CREATED, LAST_DDL_TIME, TIMESTAMP, STATUS
             FORMAT JSON ) RETURNING CLOB ) AS   a, SYSDATE
  FROM     all_objects;
  
commit;

SELECT * FROM TEST_CLOB;

работает
сделал 20 инсертов, 600-ой нет
...
Рейтинг: 0 / 0
29.07.2020, 11:15
    #39984860
Vint
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
оракл 19. селект то json
andreymx,
попробуй разобрать полученный JSON. в зависимости от патчсета может и работать прибавляя мусор в конце. у меня сейчас не доступа к поддержке, глянь ноту по ссылке. может уже и пофиксили в последним версиях, хотя есть у меня смутные сомнения)
...
Рейтинг: 0 / 0
29.07.2020, 13:35
    #39984941
andreymx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
оракл 19. селект то json
Vint
andreymx,
попробуй разобрать полученный JSON. в зависимости от патчсета может и работать прибавляя мусор в конце. у меня сейчас не доступа к поддержке, глянь ноту по ссылке. может уже и пофиксили в последним версиях, хотя есть у меня смутные сомнения)
сказывается отсутствие опыта

простой запрос
Код: plsql
1.
2.
3.
4.
5.
 SELECT JSON_ARRAYAGG (JSON_OBJECT (
            OBJECT_TYPE
             FORMAT JSON ) RETURNING CLOB ) AS   a
  FROM     all_objects
  WHERE ROWNUM < 3;

выдает результат: названия в кавычках, данные без
[{"OBJECT_TYPE":JAVA RESOURCE},{"OBJECT_TYPE":TYPE}]

вытаскиваю
Код: plsql
1.
2.
3.
4.
5.
6.
  
 SELECT VALUE,
        JSON_VALUE(VALUE, '$.OBJECT_TYPE') object_name
 FROM JSON_TABLE('[{"OBJECT_TYPE":JAVA RESOURCE},{"OBJECT_TYPE":TYPE}]', '$[*]' 
    COLUMNS VALUE VARCHAR2(4000) FORMAT JSON  PATH '$'
 );

нифига

добавляю двойные кавычки в данные
Код: plsql
1.
2.
3.
4.
5.
 SELECT VALUE,
        JSON_VALUE(VALUE, '$.OBJECT_TYPE') object_name
 FROM JSON_TABLE('[{"OBJECT_TYPE":"JAVA RESOURCE"},{"OBJECT_TYPE":"TYPE"}]', '$[*]' 
    COLUMNS VALUE VARCHAR2(4000) FORMAT JSON  PATH '$'
 )

VALUEOBJECT_NAME{"OBJECT_TYPE":"JAVA RESOURCE"}JAVA RESOURCE{"OBJECT_TYPE":"TYPE"}TYPE
...
Рейтинг: 0 / 0
29.07.2020, 13:41
    #39984945
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
оракл 19. селект то json
andreymx,

так же проще (с 19+):

Код: plsql
1.
select json_arrayagg(json_object(t.*)) json from t;
...
Рейтинг: 0 / 0
29.07.2020, 13:46
    #39984948
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
оракл 19. селект то json
andreymx,

19.5
Код: plsql
1.
2.
3.
4.
5.
SQL> select json_arrayagg(json_object(t.*)) json from (select object_type from all_objects o where rownum<=3) t;

JSON
--------------------------------------------------------------------------------
[{"OBJECT_TYPE":"INDEX"},{"OBJECT_TYPE":"INDEX"},{"OBJECT_TYPE":"INDEX"}]


Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
SQL> select json_arrayagg(json_object(t.*)) json from (select * from all_objects o where rownum<=3) t;

JSON
----------------------------------------------------------------------------------------------------
[{"OWNER":"SYS","OBJECT_NAME":"I_FILE#_BLOCK#","SUBOBJECT_NAME":null,"OBJECT_ID":9,"DATA_OBJECT_ID":9,
"OBJECT_TYPE":"INDEX","CREATED":"2019-04-17T00:56:14","LAST_DDL_TIME":"2019-04-17T00:56:14",
"TIMESTAMP":"2019-04-17:00:56:14","STATUS":"VALID","TEMPORARY":"N","GENERATED":"N","SECONDARY":"N",
"NAMESPACE":4,"EDITION_NAME":null,"SHARING":"NONE","EDITIONABLE":null,"ORACLE_MAINTAINED":"Y",
"APPLICATION":"N","DEFAULT_COLLATION":null,"DUPLICATED":"N","SHARDED":"N","CREATED_APPID":null,
"CREATED_VSNID":null,"MODIFIED_APPID":null,"MODIFIED_VSNID":null},
{"OWNER":"SYS","OBJECT_NAME":"I_OBJ3","SUBOBJECT_NAME":null,"OBJECT_ID":38,"DATA_OBJECT_ID":38,
"OBJECT_TYPE":"INDEX","CREATED":"2019-04-17T00:56:14","LAST_DDL_TIME":"2019-04-17T00:56:14",
"TIMESTAMP":"2019-04-17:00:56:14","STATUS":"VALID","TEMPORARY":"N","GENERATED":"N",
"SECONDARY":"N","NAMESPACE":4,"EDITION_NAME":null,"SHARING":"NONE","EDITIONABLE":null,
"ORACLE_MAINTAINED":"Y","APPLICATION":"N","DEFAULT_COLLATION":null,"DUPLICATED":"N","SHARDED":"N",
"CREATED_APPID":null,"CREATED_VSNID":null,"MODIFIED_APPID":null,"MODIFIED_VSNID":null},
{"OWNER":"SYS","OBJECT_NAME":"I_TS1","SUBOBJECT_NAME":null,"OBJECT_ID":45,"DATA_OBJECT_ID":45,
"OBJECT_TYPE":"INDEX","CREATED":"2019-04-17T00:56:14","LAST_DDL_TIME":"2019-04-17T00:56:14",
"TIMESTAMP":"2019-04-17:00:56:14","STATUS":"VALID","TEMPORARY":"N","GENERATED":"N","SECONDARY":"N",
"NAMESPACE":4,"EDITION_NAME":null,"SHARING":"NONE","EDITIONABLE":null,"ORACLE_MAINTAINED":"Y",
"APPLICATION":"N","DEFAULT_COLLATION":null,"DUPLICATED":"N","SHARDED":"N","CREATED_APPID":null,
"CREATED_VSNID":null,"MODIFIED_APPID":null,"MODIFIED_VSNID":null}]

...
Рейтинг: 0 / 0
29.07.2020, 13:53
    #39984951
andreymx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
оракл 19. селект то json
спасибо
буду смотреть
...
Рейтинг: 0 / 0
29.07.2020, 13:53
    #39984952
Vint
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
оракл 19. селект то json
xtender,
особоенно мне нравится null, очень по спеке :)

andreymx,
имхо с учётом убогости реализации json от оракла - лучше формировать json на app сервере с прогнозируемым результатом.
...
Рейтинг: 0 / 0
29.07.2020, 14:04
    #39984962
andreymx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
оракл 19. селект то json
на вид работает
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
INSERT INTO TEST_CLOB(ID, vCLOB, stat2)
SELECT 2, REPLACE(JSON_ARRAYAGG (
        JSON_OBJECT (
            a.*
             ) RETURNING CLOB ), '},{', '},' || CHR(13) || '{') AS   a,
             SYSDATE
  FROM     all_objects a
  ;
  
COMMIT;


SELECT JSON_VALUE(VALUE, '$.OBJECT_NAME') OBJECT_NAME,
       JSON_VALUE(VALUE, '$.OBJECT_TYPE') OBJECT_TYPE
   FROM TEST_CLOB T
   CROSS APPLY
JSON_TABLE(t.vCLOB, '$[*]' 
    COLUMNS VALUE VARCHAR2(4000) FORMAT JSON  PATH '$'
 )
 ;
   
...
Рейтинг: 0 / 0
29.07.2020, 15:24
    #39984998
andreymx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
оракл 19. селект то json
размер одного слоба - 28м
размер all_objects - 50403 объекта
...
Рейтинг: 0 / 0
29.07.2020, 15:25
    #39984999
andreymx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
оракл 19. селект то json
andreymx
размер одного слоба - 28м
размер all_objects - 50403 объекта
...
Рейтинг: 0 / 0
29.07.2020, 16:05
    #39985023
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
оракл 19. селект то json
Vint,

А что не так?
авторA value can be a string in double quotes, or a number, or true or false or null, or an object or an array.
...
Рейтинг: 0 / 0
29.07.2020, 16:52
    #39985046
Vint
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
оракл 19. селект то json
xtender,
да можно и null втыкать. но надо при этом помнить про разницу между "",null or undefined, это в оракле то мало кто понимает, а при работе с jsonами вообще единицы.
...
Рейтинг: 0 / 0
29.07.2020, 16:54
    #39985049
Vint
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
оракл 19. селект то json
...
Рейтинг: 0 / 0
29.07.2020, 17:32
    #39985069
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
оракл 19. селект то json
Vint,

в любом случае, это настраивается:
Код: plsql
1.
select json_arrayagg(json_object(t.* absent on null)) json from (select * from all_objects o where rownum<=3) t;


Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
JSON
-----------------------------------------------------------------------
[
{"OWNER":"SYS","OBJECT_NAME":"I_FILE#_BLOCK#","OBJECT_ID":9,"DATA_OBJECT_ID":9,
"OBJECT_TYPE":"INDEX","CREATED":"2019-04-17T00:56:14","LAST_DDL_TIME":"2019-04-17T00:56:14","TIMESTAMP":"2019-04-17:00:56:14","STATUS":"VALID",
"TEMPORARY":"N","GENERATED":"N","SECONDARY":"N",
"NAMESPACE":4,"SHARING":"NONE","ORACLE_MAINTAINED":"Y","APPLICATION":"N",
"DUPLICATED":"N","SHARDED":"N"},
{"OWNER":"SYS","OBJECT_NAME":"I_OBJ3","OBJECT_ID":38,"DATA_OBJECT_ID":38,
"OBJECT_TYPE":"INDEX","CREATED":"2019-04-17T00:56:14","LAST_DDL_TIME":"2019-04-17T00:56:14",
"TIMESTAMP":"2019-04-17:00:56:14","STATUS":"VALID",
"TEMPORARY":"N","GENERATED":"N"
,"SECONDARY":"N","NAMESPACE":4,"SHARING":"NONE","ORACLE_MAINTAINED":"Y","APPLICATION":"N","DUPLICATED":"N","SHARDED":"N"},
{"OWNER":"SYS","OBJECT_NAME":"I_TS1","OBJECT_ID":45,"DATA_OBJECT_ID":45,
"OBJECT_TYPE":"INDEX","CREATED":"2019-04-17T00:56:14","LAST_DDL_TIME":"2019-04-17T00:56:14","TIMESTAMP":"2019-04-17:00:56:14","STATUS":"VALID",
"TEMPORARY":"N","GENERATED":"N","SECONDARY":"N","NAMESPACE":4,
"SHARING":"NONE","ORACLE_MAINTAINED":"Y","APPLICATION":"N","DUPLICATED":"N","SHARDED":"N"}]

...
Рейтинг: 0 / 0
29.07.2020, 17:44
    #39985074
Vint
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
оракл 19. селект то json
xtender,
на это тоже есть баг.
Понятно, что практически всё решаемо, но количество багов в json реализации oracle меня сильно удручает.
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / оракл 19. селект то json / 25 сообщений из 27, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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