powered by simpleCommunicator - 2.0.19     © 2024 Programmizd 02
Map
Форумы / Oracle APEX [игнор отключен] [закрыт для гостей] / Apex_json : сборка множества json в один общий
4 сообщений из 4, страница 1 из 1
Apex_json : сборка множества json в один общий
    #40122527
disgust
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Понадобилось для нужд бэкэнда сделать пачку методов, возвращающих clob с джейсоном внутри, решил воспользоваться пакетом apex_json.
Всё шло хорошо, пока джейсон не начал разрастаться и содержать большое количество повторяющихся конструкций, например, один из массивов может выглядеть так (количество объектов внутри произвольное):
Код: xml
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.
{
  "infoColumnsWidgets": [
    {
      "widgetNamespace": "mot",
      "widgetName": "info_column",
      "orderNumber": 1,
      "navigateToPage": null,
      "widgetData": {
        "title": "Fact",
        "textPattern": "$v0",
        "values": [
          {
            "id": "v0",
            "type": "int",
            "value": "200000"
          }
        ]
      }
    },
    {
      "widgetNamespace": "mot",
      "widgetName": "info_column",
      "orderNumber": 2,
      "navigateToPage": null,
      "widgetData": {
        "title": "Plan",
        "textPattern": "$v0",
        "values": [
          {
            "id": "v0",
            "type": "int",
            "value": "200000"
          }
        ]
      }
    },
    {
      "widgetNamespace": "mot",
      "widgetName": "info_column",
      "orderNumber": 3,
      "navigateToPage": null,
      "widgetData": {
        "title": "Prognosis",
        "textPattern": "$v0",
        "values": [
          {
            "id": "v0",
            "type": "int",
            "value": "100"
          }
        ]
      }
    }
  ]
}



Естественно, каждый объект генерится в цикле, но хотелось бы унести генерацию в отдельную функцию и в цикле дёргать её с нужными параметрами, например, так:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
function f_getTest return clob as
  v_res clob;
begin
  apex_json.initialize_clob_output;
  apex_json.open_object;
    apex_json.open_object('infoColumnsWidgets');
    for rec in (select * from some_table_data)
    loop
      apex_json.write_raw(f_getWidgetJson(rec.param));
    end loop;
    apex_json.close_object;
  apex_json.close_all;
  v_res := apex_json.get_clob_output;
  apex_json.free_output;
  return v_res;
end;



В явном виде возможность сгенерить валидный джейсон объекта вроде как отсутствует - без обёртки в {} апекс сам падает на этапе генерации. Это ладно, обёртку в скобки можно самому обработать.
Но вот способа передать один джейсон внутрь другого я не нашёл, за исключением теоретически-ужасных костылей типа заполнения массива плейсхолдерами с их последующей заменой в сгенерированном клобе. Фу-фу.

Буду рад любым советами
...
Рейтинг: 0 / 0
Apex_json : сборка множества json в один общий
    #40123323
Sah
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Использовать SQL?

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
      WITH address_list as (
         SELECT
                JSON_ARRAYAGG(
                      JSON_OBJECT(
                                  'address' IS sa.column_value
                         )
                   )   addr_list
           FROM TABLE ( apex_t_varchar2('Address1', 'Address2') ) sa

      )
      SELECT json_object('Тип адреса' is json_array('Fact', 'Reg') ,
                         'address_list' IS addr_list
                         returning clob
                        )
        FROM address_list ;
...
Рейтинг: 0 / 0
Apex_json : сборка множества json в один общий
    #40123371
disgust
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Sah,

К сожалению, у меня оракл версии 12.1, а эти классные фишечки появляются в 12.2.
...
Рейтинг: 0 / 0
Apex_json : сборка множества json в один общий
    #40123460
disgust
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Решение проблемы ниже. Оказалось, что моя ошибка в повторной инициализации аутпута во вложенной функции; ну и неправильным было пытаться использовать функцию, вложенная процедура прекрасно пишет в ту же область памяти.

Код: 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.
declare
  procedure dept_object is
    l_cursor sys_refcursor;
  begin
    open l_cursor for
      select d.dname  as "department_name",
             d.deptno as "department_number",
             cursor (select e.empno as "employee_number",
                            e.ename as "employee_name"
                       from emp e
                      where e.deptno = d.deptno
                      order by e.empno)   as "employees"
        from dept d
       order by d.dname;
    apex_json.open_object;
    apex_json.write('departments', l_cursor);
    apex_json.close_object;
  end;
begin
  apex_json.initialize_clob_output;
  dept_object;
  dbms_output.put_line(apex_json.get_clob_output);
  apex_json.free_output;
end;
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / Oracle APEX [игнор отключен] [закрыт для гостей] / Apex_json : сборка множества json в один общий
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали тему (0):
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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