2017-11-03 223 views
10

1) Takip edebileceğim üç yaklaşımı olan oracle seçim sorgusundan json yapmalıyım. PL/JSON *:Bir CLOB için> 32k (ör. 60.000 karakter) için Oracle'da JSON nasıl oluşturulur?

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

Ayrıca ben bu yaklaşım

2) Eğer yama yapamıyorsanız/o sürümü ile çalışma Lewis Cunningham ve Jonas Krogsboell tarafından yazılmış mükemmel bir paket var olan denedi http://pljson.sourceforge.net/

Mükemmel bir paket (Çok sayıda veritabanı yüklemesinde kullandım).

Verilen örnekler iyi ve çoğu senaryoyu kapsamaktadır.

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

bu cevap olarak Mansiyon çok ama böyle büyük clob için çalışıyorum. Return results of a sql query as JSON in oracle 12c

3) diğer yaklaşım biz seçme sorgusu sonrasında dize arada kullanabilirsiniz olabilir.

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 yaklaşım benim sorunu çözmek ama döngü aday istemiyoruz. Bunu işlemek için kehanette bir çözüm var mı?

Çözüm olup olmadığını kontrol ediyorum ancak bu döngü olmadan çalışmayacak.

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

url bazı çözüm sağlamak vardır, ben bu çalıştı ama çalışmıyor .Same sorunu geliyor.

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

bunu nasıl yapılabilir bana söylemek mümkün yapabileceğimi? Bu soruya yanıt olarak

+0

bu durumda Veritabanı sürümü nedir? Oracle 12c (12.1.0.2), sorununuzu çözebilecek yerel bir json veri tipine sahiptir (https://docs.oracle.com/database/121/ADXDB/json.htm). Ayrıca, EXTENDED olarak ayarlanabilen bir MAX_STRING_SIZE parametresi de vardır (32k VARCHAR2 değişkenini verir). Neden tüm bu bilgiler için: Oracle Veritabanı'nda, JSON veri ortak SQL veri türleri VARCHAR2, CLOB ve BLOB kullanılarak saklanır (şuna bakın: https://docs.oracle.com/database/122/ADJSN/json-in- oracle-database.htm # ADXDB6371). – g00dy

+0

Parametre MAX_STRING_SIZE parametresinin STANDARD olarak ayarlandığını ve sizin durumunuza CLOB (4GB) ile VARCHAR2 (yani 4000b) dönüştürmeye çalıştığınız bildirir. 60k gibi bir şeye ihtiyacınız varsa, VARCHAR2'yi, ancak CLOB'u kullanamazsınız, yani tüm verileri tek bir değişkene sahip olmak istiyorsanız. – g00dy

cevap

7

:

3 yaklaşım benim sorunu çözmek ama döngü aday istemiyoruz. Bunu işlemek için kehanette bir çözüm var mı?

Strings Oracle'ın LISTAGG işlevini kullanarak olmadan döngü sonuna ilave edilmesini:

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

Ancak, Açıklamalarda belirttiği ettik, LISTAGG 4000 karakter sınırı vardır. Aşağıdaki derinde/daha karmaşıktır, ancak bu sınırın ötesinde baş olmalıdır:

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; 

XMLAGGCLOB s kolları ancak EXTRACT fonksiyonu (" den &quot; ör), bazı karakterleri kaçan bir yan etkiye sahiptir. Yukarıdaki sorgu, bu geri dönüşümü (ör.dbms_xmlgen.convert işlevini kullanarak &quot; - ") - daha fazla ayrıntı için bkz. this answer.

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

+0

Hayır, çözüm bu değil. oracle bu sorguyu kontrol edin bu error.ORA-22835: CLO için CHOB veya RAW dönüşümüne BLOB için çok küçük (fiili: 57416, maksimum: 4000) –

+0

Cevabımı düzenlediniz - lütfen yeni yöntemin işe yarayıp yaramadığını bana bildirin ... –

+0

Hayır, bu da çalışmıyor, aynı sorun. –

0

yerine (4000) varchar2adBSTR clob dönmek için Oracle söyleyebilir:

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