sql - json_object - ¿Cómo generar JSON en Oracle para un CLOB que sea> 32k(por ejemplo, 60,000 caracteres)?
leer json en oracle (1)
En respuesta a esta pregunta:
El enfoque 3 soluciona mi problema pero no quiero ejecutarlo . ¿Hay alguna solución en Oracle para manejar esto?
Las cadenas se pueden concatenar sin bucles utilizando la función LISTAGG
de Oracle:
SELECT ''{"employees":['' || LISTAGG(''{"employee_id":'' || to_char(employee_id)
|| '',"data_clob":"'' || data_clob || ''"}'', '','')
WITHIN GROUP (ORDER BY employee_id) || '']}'' AS json
FROM tablename;
Sin embargo, como ha señalado en los comentarios, LISTAGG
tiene un límite de 4000 caracteres. Lo siguiente es más complejo / complicado, pero debe superar este límite:
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
maneja CLOB
s pero la función EXTRACT
tiene el efecto secundario de escapar de ciertos caracteres (por ejemplo, de "
a "
). La consulta anterior los convierte (por ejemplo, de "
a "
) usando la función dbms_xmlgen.convert
- ver esta respuesta para mas detalles.
Demostración de SQL Fiddle: http://sqlfiddle.com/#!4/5b295/40
1) Tengo que hacer json desde la consulta de selección de Oracle, que tiene tres enfoques que puedo seguir.
SELECT JSON_ARRAY(json_object(''id'' VALUE employee_id,
''data_clob'' VALUE data_clob
)) from tablename;
también lo he intentado con este enfoque
2) Si no puede parchar / trabajar con esa versión, hay un paquete excelente escrito por Lewis Cunningham y Jonas Krogsboell: PL / JSON * http://pljson.sourceforge.net/
Es un paquete excelente (lo he usado en numerosas instalaciones de bases de datos).
Los ejemplos incluidos son buenos y cubren la mayoría de los escenarios.
declare
ret json;
begin
ret := json_dyn.executeObject(''select * from tab'');
ret.print;
end;
/
Mencione En esta respuesta también, pero no funciona para tan grande clob. Devuelve resultados de una consulta SQL como JSON en Oracle 12c
3) El otro enfoque puede ser que podemos concatenar la cadena después de la consulta de selección.
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 || '']}'';
El enfoque 3 soluciona mi problema pero no quiero ejecutarlo . ¿Hay alguna solución en Oracle para manejar esto?
Compruebo la solución pero eso no funciona sin for loop.
url ha proporcionado alguna solución, lo intenté pero no funcionó. El problema está por venir.
ORA-22835: Buffer too small for CLOB to CHAR or BLOB to RAW conversion (actual: 57416, maximum: 4000)
¿Podrías decirme cómo se puede hacer?