sql Come generare JSON in Oracle per un CLOB che è> 32k(ad es. 60.000 caratteri)?



plsql (1)

1) Devo fare json dalla query di oracle select che ha tre approcci che posso seguire.

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

anche io ho provato con questo approccio

2) Se non riesci a patch / lavorare con quella versione, c'è un eccellente pacchetto scritto da Lewis Cunningham e Jonas Krogsboell: PL / JSON * http://pljson.sourceforge.net/

È un pacchetto eccellente (l'ho usato in numerose installazioni di database).

Gli esempi inclusi sono buoni e coprono la maggior parte degli scenari.

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

Menzione Anche in questa risposta, ma non funziona per un così grande clob. Restituisce i risultati di una query sql come JSON in oracle 12c

3) L'altro approccio può essere che possiamo concatenare la stringa dopo la query di selezione.

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 approccio risolvere il mio problema, ma non voglio correre per il ciclo . C'è qualche soluzione in oracle per gestire questo.

Controllo la soluzione ma non lavoro senza ciclo.

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

url ha fornito una soluzione, l'ho provato ma non funziona. Il problema sta arrivando.

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

Potresti dirmi come si può fare?


In risposta a questa domanda:

3 approccio risolvere il mio problema, ma non voglio correre per il ciclo . C'è qualche soluzione in oracle per gestire questo.

Le stringhe possono essere concatenate senza loop utilizzando la funzione LISTAGG di Oracle:

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

Tuttavia, come hai sottolineato nei commenti, LISTAGG ha un limite di 4000 caratteri. Quanto segue è più complesso / laborioso, ma dovrebbe far fronte oltre questo limite:

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 gestisce CLOB s ma la funzione EXTRACT ha l'effetto collaterale di escape di determinati caratteri (ad esempio da " a &quot; ). La query sopra riportata li converte (ad es. Da &quot; a " ) utilizzando la funzione dbms_xmlgen.convert - guarda questa risposta per ulteriori dettagli.

Demo di SQL Fiddle: http://sqlfiddle.com/#!4/5b295/40





clob