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