powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / оракл 19. селект то json
25 сообщений из 27, страница 1 из 2
оракл 19. селект то json
    #39984692
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
что-то я далеко отстал от оракла

подскажите аналог тскл-запроса:
Код: 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
оракл 19. селект то json
    #39984699
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
оракл 19. селект то json
    #39984700
Synoptic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreymx, только здесь зона Оракла, а не T-SQL
...
Рейтинг: 0 / 0
оракл 19. селект то json
    #39984708
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
оракл 19. селект то json
    #39984716
ASNexus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
оракл 19. селект то json
    #39984718
dmdmdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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
оракл 19. селект то json
    #39984722
Vint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ASNexus,
сначала упрешься в 32кб. потом в ora-600 при преобразовании в clob
...
Рейтинг: 0 / 0
оракл 19. селект то json
    #39984726
ASNexus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
оракл 19. селект то json
    #39984728
Vint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ASNexus,
Преобразование числа в json наивный чукотский вьюнош, на проме будет поздно
...
Рейтинг: 0 / 0
оракл 19. селект то json
    #39984774
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
оракл 19. селект то json
    #39984778
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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
оракл 19. селект то json
    #39984860
Vint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreymx,
попробуй разобрать полученный JSON. в зависимости от патчсета может и работать прибавляя мусор в конце. у меня сейчас не доступа к поддержке, глянь ноту по ссылке. может уже и пофиксили в последним версиях, хотя есть у меня смутные сомнения)
...
Рейтинг: 0 / 0
оракл 19. селект то json
    #39984941
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
оракл 19. селект то json
    #39984945
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
andreymx,

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

Код: plsql
1.
select json_arrayagg(json_object(t.*)) json from t;
...
Рейтинг: 0 / 0
оракл 19. селект то json
    #39984948
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
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
оракл 19. селект то json
    #39984951
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
спасибо
буду смотреть
...
Рейтинг: 0 / 0
оракл 19. селект то json
    #39984952
Vint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtender,
особоенно мне нравится null, очень по спеке :)

andreymx,
имхо с учётом убогости реализации json от оракла - лучше формировать json на app сервере с прогнозируемым результатом.
...
Рейтинг: 0 / 0
оракл 19. селект то json
    #39984962
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
на вид работает
Код: 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
оракл 19. селект то json
    #39984998
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
размер одного слоба - 28м
размер all_objects - 50403 объекта
...
Рейтинг: 0 / 0
оракл 19. селект то json
    #39984999
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreymx
размер одного слоба - 28м
размер all_objects - 50403 объекта
...
Рейтинг: 0 / 0
оракл 19. селект то json
    #39985023
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
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
оракл 19. селект то json
    #39985046
Vint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtender,
да можно и null втыкать. но надо при этом помнить про разницу между "",null or undefined, это в оракле то мало кто понимает, а при работе с jsonами вообще единицы.
...
Рейтинг: 0 / 0
оракл 19. селект то json
    #39985049
Vint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
оракл 19. селект то json
    #39985069
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
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
оракл 19. селект то json
    #39985074
Vint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtender,
на это тоже есть баг.
Понятно, что практически всё решаемо, но количество багов в json реализации oracle меня сильно удручает.
...
Рейтинг: 0 / 0
25 сообщений из 27, страница 1 из 2
Форумы / Oracle [игнор отключен] [закрыт для гостей] / оракл 19. селект то json
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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