Oracle формат Apex несколько JSON запросов к одному - PullRequest
0 голосов
/ 06 мая 2020

Я написал код PL / SQL, который запрашивает службу Dremio и получает JSON с выводом базы данных. Вывод сохраняется в сгустке REST_COLLECTION. Результат будет показан на странице APEX. Проблема с этим сервисом Dremio заключается в том, что я могу одновременно получать только 500 данных. Решение было al oop и объединение результатов каждый раз ..... Вот и моя проблема.

JSON выглядит так:

{"rowCount":307,"schema":[{"name":"EXPORTDATUM","type":{"name":"DATE"}},   
{"name":"DOKUMENTE","type":{"name":"DOUBLE"}},{"name":"SEITEN","type":{"name":"DOUBLE"}}, 
{"name":"STAPELKLASSE","type":{"name":"VARCHAR"}},{"name":"FORMULAR","type"
{"name":"VARCHAR"}}],"rows":[{"EXPORTDATUM":"2019-02-04","DOKUMENTE":9.0,"SEITEN":37.0,"STAPELKLASSE":"TEST","FORMULAR":"TEST"}]}

Concat Строки JSON каждый раз приводят к ошибке JSON при просмотре страницы из-за нескольких элементов root.

Данные строки SUBSTR не являются стандартными, выход Dremio может измениться.

Создание нескольких сгустков каждый раз возможно, но тогда мой запрос не знает количество сгустков. Запрос выглядит так, кстати:

select 
    to_date(j."EXPORTDATUM", 'YYYY-MM-DD') as "EXPORTDATUM",
    j."DOKUMENTE",
    j."SEITEN",
    j."STAPELKLASSE",
    j."FORMULAR"

from apex_collections c, json_table(
    c.clob001 format json,
    '$.rows[*]'
    columns (
        "EXPORTDATUM"   VARCHAR2(4000)  path '$.EXPORTDATUM',
"DOKUMENTE"  VARCHAR2(4000) path '$.DOKUMENTE',
"SEITEN"   VARCHAR2(4000) path '$.SEITEN',
"STAPELKLASSE"   VARCHAR2(4000)  path '$.STAPELKLASSE',
"FORMULAR"   VARCHAR2(4000)  path '$.FORMULAR'
    )
) j

where c.collection_name = 'REST_COLLECTION'

Надеюсь, есть решение для объединения нескольких JSON без подстроки.

1 Ответ

1 голос
/ 07 мая 2020

Чтобы отобразить c ваши JSON строки в коллекции, я создал простой SQL с Union.

Вы можете использовать APEX_ JSON API для создания документа JSON.

Ниже приведен пример кода, с которого можно начать. Вам просто нужно немного изменить в соответствии с вашими требованиями.

declare
l_json clob;
begin
  apex_json.initialize_clob_output;
  apex_json.open_array;
for rec in (select  * from(
select 
    to_date(j."EXPORTDATUM", 'YYYY-MM-DD') as "EXPORTDATUM",
    j."DOKUMENTE",
    j."SEITEN",
    j."STAPELKLASSE",
    j."FORMULAR"

from  json_table(
   '{
    "rowCount": 307,
    "schema": [{
            "name": "EXPORTDATUM",
            "type": {
                "name": "DATE"
            }
        },
        {
            "name": "DOKUMENTE",
            "type": {
                "name": "DOUBLE"
            }
        }, {
            "name": "SEITEN",
            "type": {
                "name": "DOUBLE"
            }
        },
        {
            "name": "STAPELKLASSE",
            "type": {
                "name": "VARCHAR"
            }
        }, {
            "name": "FORMULAR",
            "type": {
                "name": "VARCHAR"
            }
        }
    ],
    "rows": [{
        "EXPORTDATUM": "2019-02-04",
        "DOKUMENTE": 9.0,
        "SEITEN": 37.0,
        "STAPELKLASSE": "row1",
        "FORMULAR": "row1"
    },
    {
        "EXPORTDATUM": "2019-02-04",
        "DOKUMENTE": 9.0,
        "SEITEN": 37.0,
        "STAPELKLASSE": "row2",
        "FORMULAR": "row2"
    }]
}' format json,
    '$.rows[*]'
    columns (
        "EXPORTDATUM"   VARCHAR2(4000)  path '$.EXPORTDATUM',
"DOKUMENTE"  VARCHAR2(4000) path '$.DOKUMENTE',
"SEITEN"   VARCHAR2(4000) path '$.SEITEN',
"STAPELKLASSE"   VARCHAR2(4000)  path '$.STAPELKLASSE',
"FORMULAR"   VARCHAR2(4000)  path '$.FORMULAR'
    )
) j
union all
select 
    to_date(j."EXPORTDATUM", 'YYYY-MM-DD') as "EXPORTDATUM",
    j."DOKUMENTE",
    j."SEITEN",
    j."STAPELKLASSE",
    j."FORMULAR"

from  json_table(
   '{
    "rowCount": 307,
    "schema": [{
            "name": "EXPORTDATUM",
            "type": {
                "name": "DATE"
            }
        },
        {
            "name": "DOKUMENTE",
            "type": {
                "name": "DOUBLE"
            }
        }, {
            "name": "SEITEN",
            "type": {
                "name": "DOUBLE"
            }
        },
        {
            "name": "STAPELKLASSE",
            "type": {
                "name": "VARCHAR"
            }
        }, {
            "name": "FORMULAR",
            "type": {
                "name": "VARCHAR"
            }
        }
    ],
    "rows": [{
        "EXPORTDATUM": "2019-02-04",
        "DOKUMENTE": 9.0,
        "SEITEN": 37.0,
        "STAPELKLASSE": "row3",
        "FORMULAR": "row3"
    },
    {
        "EXPORTDATUM": "2019-02-04",
        "DOKUMENTE": 9.0,
        "SEITEN": 37.0,
        "STAPELKLASSE": "row4",
        "FORMULAR": "row4"
    }]
}' format json,
    '$.rows[*]'
    columns (
        "EXPORTDATUM"   VARCHAR2(4000)  path '$.EXPORTDATUM',
"DOKUMENTE"  VARCHAR2(4000) path '$.DOKUMENTE',
"SEITEN"   VARCHAR2(4000) path '$.SEITEN',
"STAPELKLASSE"   VARCHAR2(4000)  path '$.STAPELKLASSE',
"FORMULAR"   VARCHAR2(4000)  path '$.FORMULAR'
    )
) j) )
loop
    apex_json.open_object;
    apex_json.write('EXPORTDATUM', rec.EXPORTDATUM);
    apex_json.write('DOKUMENTE', rec.DOKUMENTE);
    apex_json.write('SEITEN', rec.SEITEN);
    apex_json.write('STAPELKLASSE', rec.STAPELKLASSE);
    apex_json.write('FORMULAR', rec.FORMULAR);
    apex_json.close_object;
end loop;
    apex_json.close_array;
    dbms_output.put_line(apex_json.get_clob_output( p_free => true ) );
end;

Надеюсь, это решит вашу проблему.

...