sql - json圖檔 - json階層



如何在Oracle中為大於32k的CLOB(例如60,000個字符)生成JSON? (1)

1)我必須從甲骨文選擇查詢有三種方法我可以遵循。

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

我也嘗試過這種方法

2)如果你無法修補/使用該版本,那麼有一個由Lewis Cunningham和Jonas Krogsboell編寫的優秀包:PL / JSON * http://pljson.sourceforge.net/

這是一個很好的包(我用它在眾多的數據庫安裝)。

包括的例子很好,涵蓋了大多數情況。

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

提到在這個答案也是如此,但不適用於這樣大的clob。 在oracle 12c中將SQL查詢的結果作為JSON返回

3)另一種方法可以是我們可以在選擇查詢之後連接字符串。

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/

網址提供了一些解決方案,我試過這個,但不工作。同樣的問題來了。

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

你能告訴我怎麼辦?


在回答這個問題時:

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個字符。 以下是更複雜/更複雜,但應該超越這個限制:

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處理CLOBEXTRACT函數具有轉義某些字符(例如從" to &quot; )的副作用。上面的查詢使用dbms_xmlgen.convert函數將這些字符轉換回來(例如從&quot; to " ) - 看到這個答案了解更多詳情。

SQL小提琴演示: http ://sqlfiddle.com/#!4/5b295/40





clob