source

Oracle 19c에서 large json을 clob에 반환할 때 ORA-40478

factcode 2023. 9. 21. 21:33
반응형

Oracle 19c에서 large json을 clob에 반환할 때 ORA-40478

오라클 19c에서 테이블을 만들었습니다.

create table SAMPLE_TABLE (
id NUMBER not null,
display_name  NVARCHAR2(4000), )

스크립트를 실행할 때:

declare    
   i integer;   
   p_tmp_clob clob;
 begin   
   select JSON_ARRAYAGG(JSON_OBJECT(t.* )) into p_tmp_clob from SAMPLE_TABLE t;
end; 

저는 다음과 같은 ORA-40478 예외를 받고 있습니다.ORA-40478: 출력값이 너무 큼(최대: 4000)

varchar가 아닌 CLOB를 반환하도록 함수를 지정해야 합니다.

JSON_ARRAYAGG에도 필요할 수 있습니다. (아니면 거기에만 있을 수도 있고 - 지금은 테스트할 수 없습니다.)

declare    
   i integer;   
   p_tmp_clob clob;
 begin   
   select JSON_ARRAYAGG(JSON_OBJECT(t.* RETURNING CLOB) RETURNING CLOB) 
     into p_tmp_clob 
   from SAMPLE_TABLE t;
end; 

위의 @a_horse_with_no_name님의 정답에 대한 댓글 답변에서 제 제안을 보완하기 위해:

결국, 당신은 모든 것이 필요로 합니다.

  • 한 묶음의COALESCE
  • json 배열의 clob compat가 가능한 fallback으로
  • 그리고.RETURNING CLOB각각json_agg*기능(안전을 위해: 보다 큰 하나의 포장 내용에만 필요합니다.varchar2(4000)여하튼json_agg*함수 포장(즉, 내부 객체와 외부 배열 모두)
  • 빈 결과 세트를 돌려줄 수 있는 각각의 것에 대해.

예:

SELECT
  coalesce(
    json_arrayagg(
      json_object(
        'something' value 'Something',
        'staticEmptyArrayString' value to_clob('[]'),
        'staticEmptyArrayReally' value to_clob('[]') format json,
        'reallyEmptyArrayNull' value (SELECT to_clob('') FROM dual),
        'reallyEmptyArray' value COALESCE((SELECT to_clob('') FROM dual), to_clob('[]')) format json,
        'reallyEmptyArrayToo' value COALESCE((SELECT to_clob('') FROM dual), to_clob('[]')) format json,
        'reallyEmptyArrayAlso' value COALESCE((SELECT to_clob('') FROM dual), to_clob('[]'))
        format json
        returning clob
      )
      returning clob
    ),
    to_clob('[]')
  ) AS json_out
  FROM dual;

베츠:

[
  {
    "something": "Something",
    "staticEmptyArrayString": "[]",
    "staticEmptyArrayReally": [],
    "reallyEmptyArrayNull": null,
    "reallyEmptyArray": [],
    "reallyEmptyArrayToo": [],
    "reallyEmptyArrayAlso": []
  }
]

이 함수에서 반환되는 문자열은 데이터 형식 VARCHAR2입니다.이 절에서는 VARCHAR2 데이터 유형의 크기를 지정할 수 있습니다.바이트(BYTE)를 사용하여 크기를 바이트 수로 지정하거나 CHAR를 사용하여 문자 수로 지정합니다.기본값은 BYTE입니다.이 절을 생략하거나 이 절을 지정하지만 크기 값을 생략하는 경우 JSON_OBject는 VARCHAR2(4000) 형식의 문자열을 반환합니다.

언급URL : https://stackoverflow.com/questions/58340777/ora-40478-when-returning-large-json-into-clob-in-oracle-19c

반응형