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



plsql (1)

在回答这个问题时:

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 " )的副作用。上面的查询使用dbms_xmlgen.convert函数将这些字符转换回来(例如从" to " ) - 看到这个答案了解更多详情。

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

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)

你能告诉我怎么办?





clob