webentwicklung-frage-antwort-db.com.de

Wie generiere ich JSON in Oracle für ein CLOB mit mehr als 32 KB (z. B. 60.000 Zeichen)?

1) Ich muss json von Oracle-Auswahlabfrage machen, die drei Annäherungsweisen hat, denen ich folgen kann.

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

auch ich habe mit diesem Ansatz versucht

2) Wenn Sie mit dieser Version nicht patchen/arbeiten können, gibt es ein exzellentes Paket von Lewis Cunningham und Jonas Krogsboell: PL/JSON * http://pljson.sourceforge.net/

Es ist ein ausgezeichnetes Paket (ich habe es in zahlreichen Datenbankinstallationen verwendet).

Die enthaltenen Beispiele sind gut und decken die meisten Szenarien ab.

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

Erwähnen Sie in dieser Antwort auch, aber nicht für so große Klumpen. Ergebnisse einer SQL-Abfrage als JSON in Oracle 12c zurückgeben

3) Der andere Ansatz kann sein, dass wir den String nach der Auswahlabfrage verketten können.

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 Ansatz mein Problem zu lösen, aber ich möchte nicht für die Schleife laufen . Gibt es eine Lösung in Oracle, um dies zu handhaben.

Ich suche nach einer Lösung, aber das funktioniert nicht ohne for-Schleife.

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

url hat eine lösung geboten, ich habe es versucht, aber es funktioniert nicht.

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

Können Sie mir sagen, wie es geht?

12
Himanshu sharma

Antwort auf diese Frage:

3 Ansatz löst mein Problem, aber ich möchte nicht für Schleife laufen. Gibt es in Oracle eine Lösung, um dies zu lösen?.

Zeichenfolgen können ohne Schleife mit der Oracle-Funktion LISTAGG verkettet werden:

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

Wie Sie jedoch in den Kommentaren darauf hingewiesen haben, ist LISTAGG auf 4000 Zeichen begrenzt. Folgendes ist komplexer/fummeliger, sollte jedoch über diese Grenze hinausgehen:

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 behandelt CLOBs, aber die Funktion EXTRACT hat den Nebeneffekt, dass bestimmte Zeichen (z. B. von " nach &quot;) maskiert werden. Die obige Abfrage konvertiert diese zurück (z. B. von &quot; in ") mithilfe der dbms_xmlgen.convert-Funktion - siehe diese Antwort für weitere Details.

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

8
Steve Chambers

In 12.2 behandeln json_ * -Funktionen Klumpen gut. Use-Klausel Returning clob

create table t( c clob, constraint t_chk check (c is json));
declare
    v_clob clob;
begin
    for i in 1..10000 loop
        v_clob := v_clob || 'asdasdadasdasdasdasdasdasdasd';
    end loop;

    insert into t(c) 
    select 
        json_object
        (
           'body' value v_clob returning clob
         )
    from
        dual;
end;   
0
Brzl

Standardmäßig geben die neuen json_ * -Funktionen einen varchar2 (4000) zurück. Sie können dies in der Rückgabeklausel ändern.

Wenn Sie erweiterte Datentypen aktiviert haben, können Sie dies in varchar2 (32767) ändern. Aber nur die * agg-Funktionen unterstützen clob. 

von hier

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 bietet auch volle Unterstützung für Clobs in den JSON * -Funktionen 

0
Toolkit