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 접근법은 내 문제를 해결하지만 나는 루프로 달리고 싶지 않습니다.오라클에서 이를 처리할 수 있는 솔루션이 있습니까?
나는 해결책을 확인하지만 루프가 없으면 작동하지 않습니다.
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
그러나 함수는 특정 문자를 벗어나는 부작용이 있습니다(예: 에서)."
로."
위의 쿼리는 이들을 다시 변환합니다(예:"
로."
) 사용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
'programing' 카테고리의 다른 글
도커 컨테이너 내 오라클 데이터베이스에서 sqlplus를 사용하는 방법은 무엇입니까? (0) | 2023.07.21 |
---|---|
NaN과 None의 차이점은 무엇입니까? (0) | 2023.07.21 |
MySQL CLI 현재 db-name 항상 표시 (0) | 2023.07.21 |
파이썬에서 파일을 읽으려고 할 때 예외를 처리하는 좋은 방법은 무엇입니까? (0) | 2023.07.21 |
Apple M1에서 Oracle 12c 도커 설정 (0) | 2023.07.21 |