오라클 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.
관련 링크