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