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

问题描述 投票:12回答:2

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

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;
/

提及在这个答案中也是如此,但不适用于这样的大事。 Return results of a sql query as JSON in oracle 12c

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 || ']}'; 

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)

你能告诉我怎么做吗?

sql json oracle plsql clob
2个回答
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;

但是,正如您在评论中指出的那样,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处理CLOBs,但EXTRACT函数具有逃避某些字符(例如从"&quot;)的副作用。上面的查询使用&quot;函数将这些转换回来(例如从"转换为dbms_xmlgen.convert) - 有关详细信息,请参阅this answer

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


0
投票

默认情况下,新的json_ *函数返回varchar2(4000)。您可以在return子句中更改此设置。

如果启用了扩展数据类型,则可以将其更改为varchar2(32767)。但只有* agg函数支持clob。

来自here

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还完全支持JSON *函数中的clobs

© www.soinside.com 2019 - 2024. All rights reserved.