Разбор JSON в Oracle APEX 19,2 - PullRequest
0 голосов
/ 13 февраля 2020

Я пытаюсь проанализировать json, получить из него данные и поместить его в коллекцию Apex.

DECLARE
     s            varchar2(32767) := APEX_APPLICATION.g_x01;
     j            apex_json.t_values; 
     v            apex_json.t_value; 
     n_count      number;
     temp         varchar2(1000);

Begin

    APEX_COLLECTION.CREATE_OR_TRUNCATE_COLLECTION(
        p_collection_name => 'Settings'
        );

    apex_json.parse(p_values => j, p_source => s);

    n_count := apex_json.get_count(p_path => 'Attribute', p_values => j);   

            for i in 1 .. n_count
            loop
                        v := apex_json.get_value(p_path => 'TEST[%d]', p0 => i, p_values => j);
                        temp := v.varchar2_value;
                        APEX_COLLECTION.ADD_MEMBER(
                        p_collection_name => 'Settings',
                            p_c001 => 'TEST',
                            p_c002 => temp
                        );
            end loop;  
end;

и он работает хорошо, когда атрибут Test является массивом. Но когда это не так, есть проблема. Я легко могу обработать одно значение с помощью

apex_json.parse(s);
         APEX_COLLECTION.ADD_MEMBER(
                p_collection_name => 'Settings',
                p_c001 => 'Test',
                p_c002 => apex_json.get_varchar2(p_path => 'TEST')
                ); 

Но я не знаю, как проверить при запуске, какой тип TEST (массив или varchar2)

1 Ответ

0 голосов
/ 13 февраля 2020

Я решил эту проблему с помощью функции apex_ json .does_exist с параметром p_values, p_path, p0. Сначала мы должны проверить, существует ли массив с именем 'TEST' с 1 атрибутом. Тогда просто сделайте заявление if-then-else. Решение ниже

DECLARE
     s            varchar2(32767) := APEX_APPLICATION.g_x01;
     j            apex_json.t_values; 
     v            apex_json.t_value; 
     n_count      number;
     temp         varchar2(1000);

Begin

    APEX_COLLECTION.CREATE_OR_TRUNCATE_COLLECTION(
        p_collection_name => 'Settings'
        );

    apex_json.parse(p_values => j, p_source => s);

    if apex_json.does_exist(p_values => j, p_path => 'TEST[%d]', p0 => 1) then
        n_count := apex_json.get_count(p_path => 'TEST', p_values => j);    
        for i in 1 .. n_count
            loop
                        v := apex_json.get_value(p_path => 'TEST[%d]'    , p0 => i, p_values => j);
                        temp := v.varchar2_value;
                        APEX_COLLECTION.ADD_MEMBER(
                        p_collection_name => 'Settings',
                            p_c001 => 'TEST',
                            p_c002 => temp
                        );
            end loop;         
    else 
        apex_json.parse(s);
             APEX_COLLECTION.ADD_MEMBER(
                    p_collection_name => 'Settings',
                    p_c001 => 'TEST',
                    p_c002 => apex_json.get_varchar2(p_path => 'TEST')
                    );         
    end if;

end;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...