Как создать JSON в Oracle для CLOB, который составляет> 32k (например, 60 000 символов)?

1 ) Я должен сделать JSON из oracle select query, который имеет три подхода, которым я могу следовать .

SELECT JSON_ARRAY(json_object('id'         VALUE employee_id, 
                   'data_clob'    VALUE data_clob
                     )) from tablename;

также я пробовал с таким подходом

2) если вы не можете исправить / работать с этой версией, есть отличный пакет, написанный Льюисом Каннингемом и Джонасом Крогсбоеллом: PL / JSON * http://pljson.sourceforge.net/

это отличный пакет (я использовал его в многочисленных базах данных промышленные установки.)

включенные примеры хороши и охватывают большинство сценариев.

declare 
  ret json;
begin
  ret := json_dyn.executeObject('select * from tab');
  ret.print;
end;
/

упоминание в этом ответе тоже, но не работает для такого большого clob. возвращает результаты sql-запроса как JSON в oracle 12c

3) другой подход может быть, мы можем объединить строку после запроса select.

FOR rec IN (SELECT employee_id, data_clob
                FROM tablename) LOOP
      IF i <> 1 THEN
        v_result := v_result || ',';
      END IF;

      v_result := v_result || '{"employee_id":' || to_char(rec.employee_id) || ',"data_clob": ' || rec.data_clob || '}';

      i := i + 1;
    END LOOP;
    v_result := v_result || ']}'; 

3 подход решить мою проблему, но я не хочу работать для цикла . Есть ли какое-либо решение в Oracle, чтобы справиться с этим .

Я проверяю решение, но это не работает без цикла for.

https://technology.amis.nl/2015/03/13/using-an-aggregation-function-to-query-a-json-string-straight-from-sql/

url предоставил некоторое решение, я пробовал это, но не работал .Тот же вопрос.

ORA-22835: Buffer too small for CLOB to CHAR or BLOB to RAW conversion (actual: 57416, maximum: 4000)

не могли бы вы сказать мне, как это можно сделать ?

2 ответов


в ответ на этот вопрос:

3 подход решить мою проблему, но я не хочу работать для цикла . Есть ли какое-либо решение в oracle для обработки этого .

строки могут быть объединены без цикла с помощью Oracle LISTAGG функция:

SELECT '{"employees":[' || LISTAGG('{"employee_id":' || to_char(employee_id)
                      || ',"data_clob":"' || data_clob || '"}', ',')
              WITHIN GROUP (ORDER BY employee_id) || ']}' AS json
FROM tablename;

однако, как вы указали в комментариях,LISTAGG имеет предел 4000 символов. Следующее Более сложное / fiddly но должно справиться за этим пределом:

SELECT '{"employees":[' || dbms_xmlgen.convert(
         RTRIM(XMLAGG(XMLELEMENT(E,'{"employee_id":' || to_char(employee_id)
                                 || ',"data_clob":"' || data_clob || '"}',',')
                      .EXTRACT('//text()') ORDER BY employee_id).GetClobVal(),',')
       , 1) || ']}' AS json
FROM tablename;

XMLAGG ручки CLOBs но EXTRACT функция имеет побочный эффект экранирования определенных символов (например," to &quot;). Запрос выше преобразует их обратно (например,&quot; to ") С помощью - см. ответ для получения дополнительной информации.

SQL Скрипка демо: http://sqlfiddle.com/#!4/5b295/40


по умолчанию новые функции json_ * возвращают varchar2 (4000). Вы можете изменить это в предложении returning.

Если у вас есть расширенные типы данных, вы можете изменить это в varchar2(32767). Но только функции * agg поддерживают clob.

С здесь

SELECT length(JSON_ARRAYAGG( 
         JSON_OBJECT( 
           KEY 'object_type' VALUE object_type, 
           KEY 'object_name' VALUE object_name 
         ) 
       returning clob) 
       ) array_size
FROM   all_objects;

ARRAY_SIZE  
5772072  

18c также имеет полную поддержку clobs в функциях json*