개요
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 처리가 정상적으로 완료되었습니다.
관련 링크