JSON PASSING 절 개선

2024. 4. 11.·Oracle/JSON

오라클 23ai에서 다수의 바인드 변수를 사용할 수 있게  JSON PASSING 절의 기능이 개선되었습니다. 이번 글에서 관련 내용을 살펴보겠습니다.

 

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

-- 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;

 

아래 쿼리는 JSON PASSING 절에 2개의 바인드 변수를 사용하며 결과가 정상적으로 반환됩니다.

-- 3: 23.3
SELECT JSON_VALUE (c1
                 , '$.statList[*]?(@.statId == $v1).valueList[*]?(@.type == $v2).value'
                   PASSING 2 AS "v1", 'MAX' AS "v2" RETURNING NUMBER) AS value
  FROM t1;

VALUE
-----
    4

1 row selected.

 

동일한 쿼리를 21.3 버전에서 수행하면 결과가 반환되지 않습니다. 21.3 버전은 문서의 문법과 달리 1개의 바인드 변수만 지원하는 것으로 보입니다.

-- 4-1: 21.3
SELECT JSON_VALUE (c1
                 , '$.statList[*]?(@.statId == $v1).valueList[*]?(@.type == $v2).value'
                   PASSING 2 AS "v1", 'MAX' AS "v2" RETURNING NUMBER) AS value
  FROM t1;
  
VALUE
-----


1 row selected.

-- 4-2: 21.3
SELECT JSON_VALUE (c1
                 , '$.statList[*]?(@.statId == $v1).valueList[*]?(@.type == "MAX").value'
                   PASSING 2 AS "v1" RETURNING NUMBER) AS value
  FROM t1;

VALUE
-----
    4

1 row selected.

 

아래와 같이 JSON_QUERY 함수를 중첩해서 사용하면  21.3 버전에서도 2개 이상의 바인드 변수를 사용할 수 있습니다.

-- 5: 21.3
SELECT JSON_VALUE (JSON_QUERY (c1, '$.statList[*]?(@.statId == $v1).valueList' PASSING 2 AS "v1")
                 , '$[*]?(@.type == $v2).value'
                   PASSING 'MAX' AS "v2") AS value
  FROM t1;

VALUE
-----
    4

1 row selected.
저작자표시 비영리 변경금지 (새창열림)
'Oracle/JSON' 카테고리의 다른 글
  • JSON Relational Duality #1 - 단순 Duality 뷰
  • JSON_TRANSFORM 함수 기능 개선
  • CSV to JSON Array
  • JSON_EACH 함수
정희락
정희락
2007년부터 Oracle Database 성능 최적화에 주력해 왔으며, 현재 한국오라클 Engineered Systems Solution Engineering 팀에서 Solution Engineer로 근무하고 있습니다. 이 블로그는 개인적인 연구 목적으로 운영되며, Oracle 사의 공식 입장을 대변하지 않습니다.
  • 정희락
    TunA
    정희락
  • 전체
    오늘
    어제
    • 분류 전체보기 (194)
      • Oracle (166)
        • SQL (32)
        • PLSQL (10)
        • Performance (72)
        • Administration (36)
        • Installation (3)
        • Utilities (1)
        • JSON (8)
        • Vector (4)
      • Exadata (15)
      • SQL*Plus (2)
      • Linux (5)
      • Resources (6)
  • 블로그 메뉴

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

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

    12c
    19c
    21c
    23ai
    case study
  • 공지사항

  • 최근 글

  • 최근 댓글

  • 인기 글

  • 링크

    • Connor McDonald
    • Frits Hoogland
    • Jonathan Lewis
    • Julian Dontcheff
    • Julian Dyke
    • Kun Sun
    • Maria Colgan
    • Martin Bach
    • Mike Dietrich
    • Tanel Poder
  • hELLO· Designed By정상우.v4.10.0
정희락
JSON PASSING 절 개선
상단으로

티스토리툴바