Я пытаюсь разобрать большой json, используя API JSON_OBJECT_T
, JSON_ARRAY_T
, и он работает нормально, но мне нужны советы экспертов, эффективен он или нет?
Я добавляю свой файл json и код синтаксического анализа, как показано ниже.
Код
SET SERVEROUTPUT ON;
DECLARE
l_clob clob;
l_time timestamp;
l_json json_object_t;
l_stops_array json_array_t;
l_stops_arr json_array_t;
routeInfoObj json_object_t;
routeStopArr json_array_t;
BEGIN
SELECT LOG_CLOB INTO l_clob FROM ITV_DEV_LOGS WHERE LOG_ID = 1435334;
l_time := systimestamp;
l_json := json_object_t.parse( l_clob );
dbms_output.put_line( 'Parsing Time: ' || extract(second from( systimestamp - l_time ) ) );
l_stops_array := l_json.get_array('data');
DBMS_OUTPUT.PUT_LINE('Data array: '||l_stops_array.get_size);
FOR i in 0..l_stops_array.get_size-1 loop
l_stops_arr := TREAT(l_stops_array.get(i) AS JSON_OBJECT_T).get_array('routedStops');
DBMS_OUTPUT.PUT_LINE('stops array: '||l_stops_arr.get_size);
FOR j in 0..l_stops_arr.get_size - 1 loop
routeInfoObj := TREAT(l_stops_arr.get(j) AS JSON_OBJECT_T).get_object('routingInfo');
DBMS_OUTPUT.PUT_LINE('Stop : ' || routeInfoObj.get_number('stop'));
routeStopArr := TREAT(l_stops_arr.get(j) AS JSON_OBJECT_T).get_array('routedJobs');
FOR k in 0..routeStopArr.get_size - 1 loop
DBMS_OUTPUT.PUT_LINE('JobRef : ' || TREAT(routeStopArr.get(k) AS JSON_OBJECT_T).get_string('jobRef'));
// update query to update stop value to respective jobRef
end loop;
end loop;
end loop;
END;
Он работает нормально, но есть ли способ улучшить эту реализацию, поскольку это всего лишь образец json, и количество объектов внутри может возрасти до 2000, и вместо обновления записей одну за другой, есть ли способ обновить все записи в одном выражении?