Qualified Expression 기능 개선

2023. 5. 28.·Oracle/PLSQL

개요

Oracle 21c에서 Qualified Expression 기능이 대폭 개선되었습니다.

 

PL/SQL Language Reference는 Qualified Expression를 아래와 같이 구분합니다.

qualified_expression
    empty_qualified_expression
    simple_qualified_expression
    aggregate_qualified_expression
        positional_choice_list
            expr
            sequence_iterator_choice
        explicit_choice_list
            named_choice_list
            indexed_choice_list
            basic_iterator_choice
            index_iterator_choice
        others_choice

 

이 글은 Aggregate Qualified Expression을 Choice List와 Iterator Choice로 구분합니다.

aggregate_qualified_expression
    choice_list
        positional_choice_list
        named_choice_list
        indexed_choice_list
        others_choice
    iterator_choice
        basic_iterator_choice
        sequence_iterator_choice
        index_iterator_choice

 

Choice List

레코드 타입은 버전에 따라 아래의 Qualified Expression을 사용할 수 있습니다.

-- 1: record type
DECLARE
    TYPE trd IS RECORD (c1 VARCHAR2(1), c2 VARCHAR2(1), c3 VARCHAR2(1));
    v1 trd;
BEGIN
    v1 := trd ('A', 'B', 'C');                   -- 18c: positional choice list
    v1 := trd (c1 => 'A', c2 => 'B', c3 => 'C'); -- 18c: named choice list
    v1 := trd (c1 => 'A', OTHERS => 'C');        -- 21c: named choice list + others choice
END;
/

 

컬렉션 타입은 버전에 따라 아래의 Qualified Expression을 사용할 수 있습니다.

-- 2: collection type
DECLARE
    TYPE taa IS TABLE OF VARCHAR2(1) INDEX BY PLS_INTEGER;
    TYPE tva IS VARRAY(3) OF VARCHAR2(1);
    TYPE tnt IS TABLE OF VARCHAR2(1);

    v1 taa;
    v2 tva;
    v3 tnt;
BEGIN
    v1 := taa (1 => 'A', 2 => 'B', 3 => 'C'); -- 18c: indexed choice list
    v1 := taa ('A', 'B', 'C');                -- 21c: positional choice list
    v2 := tva (1 => 'A', 2 => 'B', 3 => 'C'); -- 21c: indexed choice list
    v2 := tva (1 => 'A', OTHERS => 'C');      -- 21c: indexed choice list + others choice (only Varray)
    v3 := tnt (1 => 'A', 2 => 'B', 3 => 'C'); -- 21c: indexed choice list
END;
/

 

Iterator Choice

Oracle 21c부터 세 가지 Iterator Choice 구문으로 컬렉션에 값을 할당할 수 있습니다.

FOR iterator => expr            -- basic iterator choice
FOR iterator SEQUENCE => expr   -- sequence iterator choice
FOR iterator INDEX expr => expr -- index iterator choice

 

아래 예제는 Basic Iterator Choice로 연관 배열에 값을 할당합니다. 인덱스는 i, 값은 i * 2 표현식입니다.

-- 3: basic iterator choice
DECLARE
    TYPE taa IS TABLE OF NUMBER INDEX BY PLS_INTEGER;
    v1 taa;
BEGIN
    v1 := taa (FOR i IN 2 .. 4 => i * 2);

    FOR i, v IN PAIRS OF v1 LOOP
        DBMS_OUTPUT.PUT_LINE (i || ',' || v);
    END LOOP;
END;
/
2,4
3,6
4,8

PL/SQL 처리가 정상적으로 완료되었습니다.

 

참고로 Basic Iterator Choice로 VARRAY와 중첩 테이블에 값을 할당하면 아래의 에러가 발생합니다.

PLS-00868: 반복 제어의 iterand 유형이 모음 인덱스 유형과 호환되지 않습니다.
           기본 이터레이터 연관 대신 SEQUENCE 또는 INDEX 이터레이터 연관을 사용하십시오.

 

아래 예제는 Sequence Iterator Choice로 VARRAY에 값을 할당합니다. 인덱스는 순번, 값은 i * 2 표현식입니다.

-- 4: sequence iterator choice
DECLARE
    TYPE tva IS VARRAY(10) OF NUMBER;
    v1 tva;
BEGIN
    v1 := tva (FOR i IN 2 .. 4 SEQUENCE => i * 2);

    FOR i, v IN PAIRS OF v1 LOOP
        DBMS_OUTPUT.PUT_LINE (i || ',' || v);
    END LOOP;
END;
/
1,4
2,6
3,8

PL/SQL 처리가 정상적으로 완료되었습니다.

 

아래 예제는 Index Iterator Choice로 중첩 테이블에 값을 할당합니다. 인덱스는 i + 1 표현식, 값은 i * 2 표현식입니다. 참고로 Index Iterator Choice로 VARRAY와 중첩 테이블에 값을 할당하면 인덱스가 1부터 시작됩니다.

-- 5: index iterator choice
DECLARE
    TYPE tnt IS TABLE OF NUMBER;
    v1 tnt;
BEGIN
    v1 := tnt (FOR i IN 2 .. 4 INDEX i + 1 => i * 2);

    FOR i, v IN PAIRS OF v1 LOOP
        DBMS_OUTPUT.PUT_LINE (i || ',' || v);
    END LOOP;
END;
/
1,
2,
3,4
4,6
5,8

PL/SQL 처리가 정상적으로 완료되었습니다.

 

관련 링크

  • PL/SQL Language Reference - Qualified Expressions Overview
  • PL/SQL Language Reference - Qualified Expression
  • ORACLE-BASE - Qualified Expressions Enhancements in Oracle Database 21c
저작자표시 비영리 변경금지 (새창열림)
'Oracle/PLSQL' 카테고리의 다른 글
  • Unpivot Pipelined Function
  • 컬렉션 할당 기능 개선
  • FOR LOOP 문 기능 개선
  • UPDATE 문의 RETURNING INTO 절 개선
정희락
정희락
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
정희락
Qualified Expression 기능 개선
상단으로

티스토리툴바