2017-11-03 16 views
10

1) 내가 택할 수있는 세 가지 접근 방식이있는 oracle select 쿼리에서 json을 만들어야합니다. PL/JSON * :CLOB가> 32k (예 : 60,000 자) 인 JSON을 Oracle에서 생성하는 방법은 무엇입니까?

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

또한 나는이 방법

2) 당신이 패치를 할 수없는 경우/해당 버전으로 작업 루이스 커닝햄과 조나스 Krogsboell에 의해 쓰여진 훌륭한 패키지가 함께 노력했다 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) 다른 접근 방식은 선택 쿼리 후 문자열을 연결할 수 있습니다.

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을 몇 가지 솔루션을 제공 가지고, 나는이 시도했지만 작동하지 .Same 문제가오고있다.

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

당신이 그것을 할 수있는 방법을 말해 줄 수 있을까? 이 질문에 대한 대답에서

+0

이 경우 데이터베이스의 버전은 무엇을? Oracle 12c (12.1.0.2)에는 기본 json 데이터 유형이 있으므로 문제를 해결할 수 있습니다 (https://docs.oracle.com/database/121/ADXDB/json.htm). EXTENDED로 설정할 수있는 DB 매개 변수 MAX_STRING_SIZE도 있습니다 (32KB의 VARCHAR2 변수 제공). Oracle Database에서 JSON 데이터는 일반적인 SQL 데이터 유형 인 VARCHAR2, CLOB 및 BLOB를 사용하여 저장됩니다 (다음을 확인하십시오. https://docs.oracle.com/database/122/ADJSN/json-in- oracle-database.htm # ADXDB6371). – g00dy

+0

매개 변수 MAX_STRING_SIZE가 STANDARD로 설정되어 있고 사용자의 경우 CLOB (4GB)를 VARCHAR2 (4000b)로 변환하려고한다는 오류가 있습니다. 60k와 같은 것이 필요한 경우에는 VARCHAR2를 사용할 수 없으며 CLOB 만 사용할 수 있습니다. 즉, 전체 데이터를 하나의 단일 변수로 사용하려는 경우입니다. – g00dy

답변

7

:

3 방법은 내 문제를 해결하지만 난 루프에 출마하고 싶지 않아요. 이 문제를 처리 할 수있는 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; 

XMLAGGCLOB S를 처리하지만 EXTRACT 함수 ("에서 &quot;에 예) 특정 문자 탈출의 부작용을 갖는다. 위의 검색어는이 (예 :&quot;에서 "까지) dbms_xmlgen.convert 함수를 사용하십시오. 자세한 내용은 this answer을 참조하십시오.

SQL 바이올린 데모 :http://sqlfiddle.com/#!4/5b295/40

+0

아니요 해결책이 아닙니다. oracle에서이 쿼리를 확인하십시오 error.ORA-22835 : 버퍼가 너무 작아서 CLOB에서 CHAR로 또는 BLOB에서 RAW로 변환 (실제 : 57416, 최대 : 4000) –

+0

새 응답을 편집했습니다 - 새 방법이 작동하는지 여부를 알려주십시오 ... –

+0

아니요이 또한 작동하지 않습니다. 같은 문제입니다. –

0

대신 (4000) VARCHAR2의 CLOB 돌아 오라클을 알 수 있습니다 :

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