Как считывать ключи из вложенного JSON_OBJECT_T с помощью JSON_KEY_LIST в PL /SQL?

#json #oracle #plsql

Вопрос:

У меня есть json_object_t тип, который выглядит следующим образом.

 v_input_data := new JSON_OBJECT({
   "REQS": {  "INDICATOR": "Y",
              "NUMBER": 0,
              "CATEGORY": "TU",
              "ID_R": 10888,
              "SUPPL_VAL": 0,
              "line_itemssub": {
                                 "QTY": 0,
                                 "TOTAL_QTY": 1,
                                 "PIPE": {
                                           "P_CODE": 9801,
                                           "P_ID": 7500030,
                                           "CC_CODE": "C6AJG4"
                                          }
                                }     
          },
   "Name":"Rajesh",
   "Age":47
});
 

v_input_data.get_keys дает мне только 3 значения REQS , Name amp; Age .
Но я хочу, чтобы ключи также присутствовали во вложенных объектах. Как я могу этого достичь ?

Заранее спасибо.

Комментарии:

1. Вы можете перейти по этой ссылке — asktom.oracle.com/pls/apex/…

Ответ №1:

PL/SQL

 SET SERVEROUTPUT ON;
DECLARE
    PROCEDURE json_keys (p_object IN JSON_OBJECT_T) IS
        v_object JSON_OBJECT_T;
        v_keys JSON_KEY_LIST;
        v_key VARCHAR2(4000);
    BEGIN
        v_keys := p_object.get_keys;
        FOR i IN v_keys.FIRST..v_keys.LAST LOOP
            v_key := v_keys(i);
            dbms_output.put_line(v_key);
            IF p_object.get(v_key).is_object THEN
                v_object := new JSON_OBJECT_T(p_object.get(v_key));
                json_keys(v_object);
            END IF;
        END LOOP;
    END json_keys;
BEGIN
    json_keys(new JSON_OBJECT_T('{
        "REQS": {
            "INDICATOR": "Y",
            "NUMBER": 0,
            "CATEGORY": "TU",
            "ID_R": 10888,
            "SUPPL_VAL": 0,
            "LINE_ITEMSSUB": {
                "QTY": 0,
                "TOTAL_QTY": 1,
                "PIPE": {
                    "P_CODE": 9801,
                    "P_ID": 7500030,
                    "CC_CODE": "C6AJG4"
                }
            }
        },
        "Name": "Rajesh",
        "Age": 47
    }'));
END;
 

Выход

 REQS
INDICATOR
NUMBER
CATEGORY
ID_R
SUPPL_VAL
LINE_ITEMSSUB
QTY
TOTAL_QTY
PIPE
P_CODE
P_ID
CC_CODE
Name
Age


PL/SQL procedure successfully completed.
 

Комментарии:

1. Это работает. Хорошая идея использовать рекурсию. Спасибо!