如何在Oracle中为大于32k(例如60,000个字符)的CLOB生成JSON?

Him*_*rma 12 sql oracle json plsql clob

1)我必须从oracle select query中创建json,它有三种方法我可以遵循.

SELECT JSON_ARRAY(json_object('id'         VALUE employee_id, 
                   'data_clob'    VALUE data_clob
                     )) from tablename;
Run Code Online (Sandbox Code Playgroud)

我也试过这种方法

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;
/
Run Code Online (Sandbox Code Playgroud)

提及在这个答案中也是如此,但不适用于这样的大事. 在oracle 12c中将sql查询的结果作为JSON返回

3)另一种方法是我们可以在select查询之后连接字符串.

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 || ']}'; 
Run Code Online (Sandbox Code Playgroud)

3方法解决了我的问题,但我不想运行循环.oracle中是否有任何解决方案可以解决这个问题.

我检查解决方案,但没有for循环不起作用.

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

url已经提供了一些解决方案,我试过这个但是没有工作.同样的问题即将来临.

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

你能告诉我怎么做吗?

Ste*_*ers 8

在回答这个问题时:

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;
Run Code Online (Sandbox Code Playgroud)

但是,正如您在评论中指出的那样,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;
Run Code Online (Sandbox Code Playgroud)

XMLAGG处理CLOB秒,但所述EXTRACT功能具有:(来自例如逸出某些字符的副作用"&quot;).上述查询将这些回(例如,从&quot;"使用)dbms_xmlgen.convert功能-看到这个答案对于进一步的细节.

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