powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / JSON группировка в массив
3 сообщений из 3, страница 1 из 1
JSON группировка в массив
    #40104010
dmdmdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Задача, чтобы из линейной таблицы сделать JSON иерархию: шапка документа, потом все его строки, потом следующая шапка, ее строки и т.д.

Мне нужен JSON_OBJECTAGG ? В нем вроде бы только массив "key: value", а мне нужен массив с произвольным кол-вом элементов.
Или нужно что-то другое?
Код: 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.
31.
with t(docid, docstate, createdat, article, quantity) as (
select 'ЗПЦВУс00039', 1, date '2021-10-13', '068356', 5 from dual union all
select 'ЗПЦВУс00039', 1, date '2021-10-13', '022159', 2 from dual union all
select 'ЗПЦВУс00039', 1, date '2021-10-13', '225000', 1 from dual union all
select 'ЗПЦВУс00040', 3, date '2021-10-13', '235578', 1 from dual union all
select 'ЗПЦВУс00040', 3, date '2021-10-13', '278497', 10 from dual union all
select 'ЗПЦВУс00041', 1, date '2021-10-13', '210611', 10 from dual union all
select 'ЗПЦВУс00041', 1, date '2021-10-13', '154213', 5 from dual union all
select 'ЗПЦВУс00041', 1, date '2021-10-13', '242080', 2 from dual
)

SELECT json_object('id'        VALUE t.docid,
                   'docstate'  VALUE t.docstate,
                   'createdat' VALUE t.createdat,
                   'items'     VALUE json_object('article' value t.article,
                                                 'quantity' value t.quantity
                                                )
                  ) ORDERS
from t;                  

{"id":"ЗПЦВУс00039","docstate":1,"createdat":"2021-10-13T00:00:00","items":{"article":"068356","quantity":5}}
{"id":"ЗПЦВУс00039","docstate":1,"createdat":"2021-10-13T00:00:00","items":{"article":"022159","quantity":2}}
{"id":"ЗПЦВУс00039","docstate":1,"createdat":"2021-10-13T00:00:00","items":{"article":"225000","quantity":1}}
{"id":"ЗПЦВУс00040","docstate":3,"createdat":"2021-10-13T00:00:00","items":{"article":"235578","quantity":1}}
{"id":"ЗПЦВУс00040","docstate":3,"createdat":"2021-10-13T00:00:00","items":{"article":"278497","quantity":10}}


--- хочу так ---

{"id":"ЗПЦВУс00039","docstate":1,"createdat":"2021-10-13T00:00:00","items":[{"article":"068356","quantity":5}, {"article":"022159","quantity":2},{"article":"022159","quantity":2}]}
{"id":"ЗПЦВУс00040","docstate":3,"createdat":"2021-10-13T00:00:00","items":[{"article":"235578","quantity":1},{"article":"278497","quantity":10}]}

...
Рейтинг: 0 / 0
JSON группировка в массив
    #40104096
Фотография SeaGate
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dmdmdm,

JSON_ARRAYAGG
Код: 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.
SQL> with t(docid, docstate, createdat, article, quantity) as (
  2  select 'ЗПЦВУс00039', 1, date '2021-10-13', '068356', 5 from dual union all
  3  select 'ЗПЦВУс00039', 1, date '2021-10-13', '022159', 2 from dual union all
  4  select 'ЗПЦВУс00039', 1, date '2021-10-13', '225000', 1 from dual union all
  5  select 'ЗПЦВУс00040', 3, date '2021-10-13', '235578', 1 from dual union all
  6  select 'ЗПЦВУс00040', 3, date '2021-10-13', '278497', 10 from dual union all
  7  select 'ЗПЦВУс00041', 1, date '2021-10-13', '210611', 10 from dual union all
  8  select 'ЗПЦВУс00041', 1, date '2021-10-13', '154213', 5 from dual union all
  9  select 'ЗПЦВУс00041', 1, date '2021-10-13', '242080', 2 from dual
 10  )
 11  SELECT json_object('id'        VALUE t.docid,
 12                     'docstate'  VALUE t.docstate,
 13                     'createdat' VALUE t.createdat,
 14                     'items'     VALUE json_arrayagg(json_object('article' value t.article,
 15                                                   'quantity' value t.quantity
 16                                                  ))
 17                    ) ORDERS
 18  from t
 19  group by docid, docstate, createdat;

ORDERS
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
{"id":"ЗПЦВУс00039","docstate":1,"createdat":"2021-10-13T00:00:00","items":[{"article":"068356","quantity":5},{"article":"225000","quantity":1},{"article":"022159","quantity":2}]}
{"id":"ЗПЦВУс00040","docstate":3,"createdat":"2021-10-13T00:00:00","items":[{"article":"235578","quantity":1},{"article":"278497","quantity":10}]}
{"id":"ЗПЦВУс00041","docstate":1,"createdat":"2021-10-13T00:00:00","items":[{"article":"210611","quantity":10},{"article":"242080","quantity":2},{"article":"154213","quantity":5}]}

...
Рейтинг: 0 / 0
JSON группировка в массив
    #40105181
dmdmdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пометим тему для поиска словами JSON CLOB HTP.

CLOB HTP .

Код: 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.
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.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
create or replace procedure htp_print_clob(
    p_clob in out nocopy clob
)
is
    v_clob_size       number default sys.dbms_lob.getlength(p_clob);
    v_buff_size       number default sys.dbms_lob.getChunkSize(p_clob);  -- 32000
    v_chunk_count     number default trunc(v_clob_size / v_buff_size);
    v_remainder_size  number default mod(v_clob_size, v_buff_size);
    p            integer default null;
begin
    if (v_clob_size <> 0)
    then
      if ( v_chunk_count > 0 )
      then
          for i in 0 .. v_chunk_count - 1
          loop
              htp.prn(
                  sys.dbms_lob.substr(p_clob, v_buff_size, (i * v_buff_size) + 1)
              );
              p := i * v_buff_size + 1;
          end loop;
      end if;
      if ( v_remainder_size > 0 )
      then
          htp.prn(
              sys.dbms_lob.substr(p_clob, v_remainder_size, (v_chunk_count * v_buff_size) + 1)
          );
      end if;
    end if;
  return;
end;
/

CREATE OR REPLACE PROCEDURE GET_SMORDERS ( a_request  varchar2)
AS
    TYPE TStringHash IS TABLE OF VARCHAR2(256) INDEX BY VARCHAR2(256);
    lh_hdr              TStringHash;
    l_hdr               VARCHAR2(256);
    l_response_status   INTEGER := 200;
    l_ccontent_type     VARCHAR2(64) := 'application/json';
    l_in_headers        VARCHAR2(4000);
    l_clob              CLOB;
BEGIN
  
    -- Заголовки и прочие параметры входящего запроса
    --lh_hdr('SERVER_SOFTWARE')       := OWA_UTIL.get_cgi_env('SERVER_SOFTWARE');
    lh_hdr('SERVER_NAME')           := OWA_UTIL.get_cgi_env('SERVER_NAME');
    --lh_hdr('GATEWAY_INTERFACE')     := OWA_UTIL.get_cgi_env('GATEWAY_INTERFACE');
    --lh_hdr('SERVER_PROTOCOL')       := OWA_UTIL.get_cgi_env('SERVER_PROTOCOL');
    --lh_hdr('SERVER_PORT')           := OWA_UTIL.get_cgi_env('SERVER_PORT');
    lh_hdr('REQUEST_METHOD')        := OWA_UTIL.get_cgi_env('REQUEST_METHOD');
    --lh_hdr('PATH_INFO')             := OWA_UTIL.get_cgi_env('PATH_INFO');
    --lh_hdr('PATH_TRANSLATED')       := OWA_UTIL.get_cgi_env('PATH_TRANSLATED');
    --lh_hdr('SCRIPT_NAME')           := OWA_UTIL.get_cgi_env('SCRIPT_NAME');
    lh_hdr('QUERY_STRING')          := OWA_UTIL.get_cgi_env('QUERY_STRING');
    lh_hdr('REMOTE_HOST')           := OWA_UTIL.get_cgi_env('REMOTE_HOST');
    lh_hdr('REMOTE_ADDR')           := OWA_UTIL.get_cgi_env('REMOTE_ADDR');
    --lh_hdr('AUTH_TYPE')             := OWA_UTIL.get_cgi_env('AUTH_TYPE');
    lh_hdr('REMOTE_USER')           := OWA_UTIL.get_cgi_env('REMOTE_USER');
    --lh_hdr('REMOTE_IDENT')          := OWA_UTIL.get_cgi_env('REMOTE_IDENT');
    --lh_hdr('CONTENT-TYPE')          := OWA_UTIL.get_cgi_env('CONTENT-TYPE');
    --lh_hdr('CONTENT-LENGTH')        := OWA_UTIL.get_cgi_env('CONTENT-LENGTH');
    --lh_hdr('HTTP_ACCEPT')           := OWA_UTIL.get_cgi_env('HTTP_ACCEPT');
    --lh_hdr('HTTP_ACCEPT_LANGUAGE')  := OWA_UTIL.get_cgi_env('HTTP_ACCEPT_LANGUAGE');
    --lh_hdr('HTTP_USER_AGENT')       := OWA_UTIL.get_cgi_env('HTTP_USER_AGENT');
    --lh_hdr('HTTP_COOKIE')           := OWA_UTIL.get_cgi_env('HTTP_COOKIE');

    l_hdr := lh_hdr.FIRST;
    WHILE l_hdr IS NOT NULL LOOP
        IF lh_hdr(l_hdr) IS NOT NULL THEN
            l_in_headers := l_in_headers||CHR(10)||l_hdr||': '||lh_hdr(l_hdr);
        END IF;
        l_hdr := lh_hdr.NEXT(l_hdr);
    END LOOP;

    insert into request_log(request) values (a_request || CHR(10) || l_in_headers);

    OWA_UTIL.STATUS_LINE(nstatus => l_response_status, bclose_header => FALSE);
    OWA_UTIL.MIME_HEADER(ccontent_type => l_ccontent_type, bclose_header => FALSE);
    OWA_UTIL.HTTP_HEADER_CLOSE();
    dbms_lob.createtemporary(l_clob, true);
        
    SELECT   json_object('objects' VALUE 
                   json_arrayagg(
                     json_object('object' VALUE
                       json_object('id'        VALUE d.id,
                                   'docstate'  VALUE d.docstate,
                                   'createdat' VALUE d.createdat,
                                   'items'     VALUE json_arrayagg(json_object('article' value s.article,
                                                                  'quantity' value s.quantity
                                                                  ) returning CLOB )
                                   returning CLOB )
                      returning CLOB )
                    returning CLOB )
                  returning CLOB )
                  into l_clob
            FROM smdocuments@dboffice d, smspecor@dboffice s
           where d.createdat = trunc(sysdate)
             and d.doctype = 'OR'
             and s.doctype = d.doctype
             and s.docid = d.id
           group by d.id, d.docstate, d.createdat;

    htp_print_clob(l_clob);
    
    
END GET_SMORDERS;
/

...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / JSON группировка в массив
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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