JSON_TRANSFORM 함수 기능 개선

2024. 4. 17.·Oracle/JSON

오라클 23ai에서 JSON_TRANSFORM 함수의 기능이 대폭 개선되었습니다. 이 글에서 여러 개선 기능 중 산술 연산(arithmetic operation)에 대해 살펴보겠습니다.

 

테스트 버전은 아래와 같습니다.

-- 1
SELECT version_full FROM product_component_version;
 
VERSION_FULL
------------
23.3.0.23.09
 
1 row selected.

 

테스트를 위해 아래와 같이 테이블을 생성하겠습니다.

-- 2
DROP TABLE t1 PURGE;
CREATE TABLE t1 (c1 JSON);
 
INSERT INTO t1 VALUES ('{
    "instId":1,
    "statList":[
        {"statId":1,"valueList":[{"type":"MIN","value":1},{"type":"MAX","value":2}]},
        {"statId":2,"valueList":[{"type":"MIN","value":3},{"type":"MAX","value":4}]}
    ]
}');
 
COMMIT;

 

아래 쿼리는 InstId를 2로 변경하고, valueList 배열에서 type이 MAX인 value를 산술 연산(PATH '@.value * 2')을 사용해 2를 곱한 값으로 변경합니다.

-- 3
SELECT JSON_TRANSFORM (
           c1
         , SET '$.instId' = 2
         , NESTED PATH '$.statList[*].valueList[*]?(@.type == "MAX")' (
               SET '@.value' = PATH '@.value * 2')
           RETURNING CLOB) AS c1
  FROM t1;

C1
------------------------------------------------------------------------------------
{
    "instId":2,
    "statList":[
        {"statId":1,"valueList":[{"type":"MIN","value":1},{"type":"MAX","value":4}]},
        {"statId":2,"valueList":[{"type":"MIN","value":3},{"type":"MAX","value":8}]}
    ]
}

1 row selected.

 

23ai 이하 버전은 아래와 같이 다소 복잡한 함수를 사용해야 기존 값을 변경할 수 있습니다.

-- 4
CREATE OR REPLACE FUNCTION f1 (i_data IN JSON)
    RETURN JSON
IS
    v_data      JSON_OBJECT_T := JSON_OBJECT_T (i_data);
    v_statList  JSON_ARRAY_T  := v_data.GET_ARRAY ('statList');
    v_stat      JSON_OBJECT_T;
    v_valueList JSON_ARRAY_T;
    v_value     JSON_OBJECT_T;
BEGIN
    v_data.PUT ('instId', 2);

    FOR i IN 0 .. v_statList.GET_SIZE () - 1 LOOP
        v_stat := TREAT (v_statList.GET (i) AS JSON_OBJECT_T);
        v_valueList := TREAT (v_stat.GET_ARRAY ('valueList') AS JSON_ARRAY_T);

        FOR j IN 0 .. v_valueList.GET_SIZE () - 1 LOOP
            v_value := TREAT (v_valueList.GET (j) AS JSON_OBJECT_T);
            
            IF v_value.GET_STRING ('type') = 'MAX' THEN
                v_value.PUT ('value', v_value.GET_NUMBER ('value') * 2);
            END IF;
        END LOOP;
    END LOOP;

    RETURN v_data.TO_JSON ();
END;
/

 

아래는 함수를 사용한 결과입니다. JSON_TRANSFORM 함수와 달리 변경한 값의 순서가 달라질 수 있습니다.

-- 5
SELECT JSON_SERIALIZE (f1 (c1)) AS c1
  FROM t1;

C1
------------------------------------------------------------------------------------
{
    "statList":[
        {"statId":1,"valueList":[{"type":"MIN","value":1},{"type":"MAX","value":4}]},
        {"statId":2,"valueList":[{"type":"MIN","value":3},{"type":"MAX","value":8}]}
    ],
    "instId":2
}

1 row selected.

 

관련 링크

  • ORACLE-BASE - JSON_TRANSFORM Enhancements in Oracle Database 23ai
저작자표시 비영리 변경금지 (새창열림)
'Oracle/JSON' 카테고리의 다른 글
  • JSON Relational Duality #2 - 1:M 조인 Duality 뷰
  • JSON Relational Duality #1 - 단순 Duality 뷰
  • JSON PASSING 절 개선
  • CSV to JSON Array
정희락
정희락
2007년부터 Oracle Database 성능 최적화에 관심을 가져왔습니다. 현재 한국오라클 Engineered Systems Solution Engineering 팀에서 Solution Engineer로 근무하고 있습니다. 이 블로그는 개인적인 연구 목적으로 운영되며 Oracle 사의 공식적인 입장을 대변하지 않습니다.
  • 정희락
    TunA
    정희락
  • 전체
    오늘
    어제
    • 분류 전체보기 (206)
      • Oracle (177)
        • SQL (36)
        • PLSQL (10)
        • Performance (75)
        • Administration (37)
        • Installation (3)
        • Utilities (1)
        • JSON (8)
        • Vector (7)
      • Exadata (16)
      • SQL*Plus (2)
      • Linux (5)
      • Resources (6)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 도서

    • 불친절한 SQL 프로그래밍
    • 불친절한 PL/SQL 프로그래밍
  • 링크

    • Connor McDonald
    • Frits Hoogland
    • Jonathan Lewis
    • Julian Dontcheff
    • Julian Dyke
    • Kun Sun
    • Maria Colgan
    • Martin Bach
    • Mike Dietrich
    • Tanel Poder
  • 공지사항

  • 인기 글

  • 태그

    12c
    19c
    21c
    23ai
    case study
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
정희락
JSON_TRANSFORM 함수 기능 개선
상단으로

티스토리툴바