programing

32k(예: 60,000자) 이상의 CLOB에 대해 Oracle에서 JSON을 생성하는 방법은 무엇입니까?

bestprogram 2023. 7. 21. 21:47

32k(예: 60,000자) 이상의 CLOB에 대해 Oracle에서 JSON을 생성하는 방법은 무엇입니까?

는 오라클에서 json을 선택 쿼리로 만들어야 하는데, 이 쿼리는 내가 따를 수 있는 세 가지 접근 방식이 있습니다.

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

또한 저는 이 접근법으로 시도했습니다.

해당 버전으로 패치/작업할 수 없다면 Lewis Cunningham과 Jonas Krogsboell이 작성한 훌륭한 패키지가 있습니다: PL/JSON * http://pljson.sourceforge.net/

훌륭한 패키지입니다(여러 데이터베이스 설치에서 사용해 왔습니다).

포함된 예는 양호하며 대부분의 시나리오를 다룹니다.

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

이 대답에도 언급하지만 그런 큰 클럽에서는 작동하지 않습니다.Oracle 12c에서 SQL 쿼리의 결과를 JSON으로 반환합니다.

다른 접근 방식은 선택 쿼리 후에 문자열을 연결할 수 있습니다.

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 접근법은 내 문제를 해결하지만 나는 루프로 달리고 싶지 않습니다.오라클에서 이를 처리할 수 있는 솔루션이 있습니까?

나는 해결책을 확인하지만 루프가 없으면 작동하지 않습니다.

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)

어떻게 할 수 있는지 말씀해 주시겠습니까?

12.2 버전부터는 다음을 수행할 수 있습니다.

select 
  json_object(
     'body' value v_clob 
     returning clob
  )
from dual;

원답:

이 질문에 대한 답변:

3 접근법은 내 문제를 해결하지만 나는 루프로 달리고 싶지 않습니다.오라클에서 이를 처리할 수 있는 솔루션이 있습니까?

Oracle 함수를 사용하여 루프 없이 문자열을 연결할 수 있습니다.

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손잡이CLOB그러나 함수는 특정 문자를 벗어나는 부작용이 있습니다(예: 에서)."로.&quot;위의 쿼리는 이들을 다시 변환합니다(예:&quot;로.") 사용dbms_xmlgen.convert함수 - 자세한 내용은 이 답변을 참조하십시오.

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

기본적으로 새 json_* 함수는 varchar2(4000)를 반환합니다.반환 조항에서 이 항목을 변경할 수 있습니다.

확장 데이터 유형을 사용하도록 설정한 경우 확장 데이터 유형을 varchar2(32767)로 변경할 수 있습니다.하지만 *agg 함수만 clob을 지원합니다.

여기서부터

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* 기능의 클로브를 완벽하게 지원합니다.

12.2 json_*에서는 클로브를 미세하게 처리합니다.사용절 반환 clob

create table t( c clob, constraint t_chk check (c is json));
declare
    v_clob clob;
begin
    for i in 1..10000 loop
        v_clob := v_clob || 'asdasdadasdasdasdasdasdasdasd';
    end loop;

    insert into t(c) 
    select 
        json_object
        (
           'body' value v_clob returning clob
         )
    from
        dual;
end;   

언급URL : https://stackoverflow.com/questions/47092831/how-to-generate-json-in-oracle-for-a-clob-that-is-32k-e-g-60-000-characters