Как создать 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
ручки CLOB
s но EXTRACT
функция имеет побочный эффект экранирования определенных символов (например,"
to "
). Запрос выше преобразует их обратно (например,"
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*