연관 배열 사용
연관 배열은 모음 유형입니다.
모음 정보
모음은 같은 유형의 요소를 지정된 순서로 저장하는 PL/SQL 조합 변수로, 1차원 배열과 유사합니다. 모음의 내부 구성 요소를 요소라고 합니다. 각 요소에는 모음에서 요소의 위치를 식별하는 고유한 아래 첨자가 있습니다.
모음 요소에 액세스하려면 아래 첨자 표기법 (collection_name(element_subscript))을 사용합니다.
모음 요소를 스칼라 변수처럼 처리할 수 있습니다. 또한 전체 모음을 서브 프로그램 매개변수로 전달할 수도 있습니다(전송 또는 수신 서브 프로그램이 독립형 서브 프로그램이 아닌 경우).
모음 방식은 모음에 대한 정보를 반환하거나 모음에 대해 작동하는 내장 PL/SQL 하위 프로그램입니다. 모음 방식을 호출하려면 collection_name.method_name의 점 표기법을 사용합니다. 예를 들어, collection_name.COUNT는 모음에 있는 요소 수를 반환하고,
PL/SQL에는 다음 세 가지 유형의 모음이 있습니다.
-
연관 배열(기존에는 "PL/SQL 테이블" 또는 "인덱스 기준 테이블"이라고 함)
-
중첩 테이블
-
가변 배열(varray)
이 문서에서는 연관 배열만 설명합니다.
참조:
-
PL/SQL 모음 유형에 대한 자세한 내용은 Oracle Database PL/SQL Language Reference를 참조하십시오
-
Oracle Database PL/SQL Language Reference - 모음 방식에 대한 자세한 내용
연관 배열 정보
연관 배열은 제한되지 않은 키-값 쌍 집합입니다. 각 키는 고유하며 해당 값을 보유하는 요소의 아래 첨자로 사용됩니다. 따라서 배열에서 요소의 위치를 몰라도 배열을 순회하지 않고 요소에 액세스할 수 있습니다.
키의 데이터 유형은 PLS_INTEGER 또는 VARCHAR2(길이)일 수 있습니다.
키의 데이터 유형이 PLS_INTEGER이며, 연관 배열이 정수로 인덱스화된되고 조밀(즉, 요소 간에 간격이 없음)이면 첫번째와 마지막 요소 사이의 모든 요소가 정의되고 값(NULL일 수 있음)을 가집니다.
키 유형이 VARCHAR2(길이)이면 연관 배열은 문자열로 색인화되고 희박합니다. 즉, 요소 간에 간격이 있을 수 있습니다.
조밀한 연관 배열을 순회할 때는 요소 간의 간격에 대해 신경 쓸 필요가 없으며 희박한 연관 배열을 순회할 때는 그 간격에 대해 알아야 한다.
연관 배열 요소에 값을 지정하려면 지정 연산자를 사용합니다.
array_name(key) := value
키가 배열에 없으면 지정 명령문은 키-값 쌍을 배열에 추가합니다. 그렇지 않으면 명령문에서는 array_name(key)의 값을 값으로 변경합니다.
연관 배열은 데이터를 임시로 저장하는 데 사용할 수 있습니다. 테이블과 달리 디스크 공간이나 네트워크 작업을 사용하지 않습니다. 그러나 연관 배열은 임시 저장용이므로 DML 문을 사용하여 조작할 수 없습니다.
패키지에서 연관 배열을 선언하고 Package Body의 변수에 값을 지정하면 연관 배열은 데이터베이스 세션 수명 기간 동안 유지 됩니다. 그렇지 않으면 연관 배열을 선언한 하위 프로그램의 수명 주기 동안 유지됩니다.
참조: Oracle Database PL/SQL Language Reference에서 연관 배열에 대한 자세한 내용을 참조하십시오.
연관 배열 선언
연관 배열을 선언하려면 연관 배열 유형을 선언한 다음 해당 유형의 변수를 선언합니다.
다음 코드는 가장 간단한 구문을 보여줍니다.
TYPE array_type IS TABLE OF element_type INDEX BY key_type;
array_name array_type;
연관 배열을 선언하는 효율적인 방법은 다음 프로시저를 통해 다음 커서를 사용하는 것입니다. 이 프로시저에서는 필요한 각 명령문을 가장 간단한 형식으로 사용하지만 전체 구문에 대한 참조를 제공합니다.
커서를 사용하여 연관 배열을 선언하려면 다음과 같이 하십시오.
-
선언 부분에서 다음을 수행합니다.
-
커서를 선언합니다.
CURSOR cursor_name IS query;전체 선언된 커서 선언 구문은 Oracle Database PL/SQL Language Reference를 참조하십시오.
-
연관 배열 유형을 선언합니다.
TYPE array_type IS TABLE OF cursor_name%ROWTYPE INDEX BY { PLS_INTEGER | VARCHAR2 length }전체 연관 배열 유형 선언 구문은 Oracle Database PL/SQL Language Reference를 참조하십시오.
-
해당 유형의 연관 배열 변수를 선언합니다.
array_name array_type;전체 변수 선언 구문은 Oracle Database PL/SQL Language Reference를 참조하십시오.
-
예 5-9에서는 앞의 프로시저를 통해 두 개의 연관 배열 employees_jobs와 jobs_를 선언한 후 커서를 사용하지 않고 세번째 연관 배열인 job_titles을 선언합니다. 처음 두 배열은 정수로 인덱스화되고 세번째 배열은 문자열로 인덱스화됩니다.
주: employees_jobs_cursor 선언의 ORDER BY 절은 연관 배열 employee_jobs의 요소 저장 순서를 결정합니다.
예제 5-9 연관 배열 선언
DECLARE
-- Declare cursor:
CURSOR employees_jobs_cursor IS
SELECT FIRST_NAME, LAST_NAME, JOB_ID
FROM EMPLOYEES
ORDER BY JOB_ID, LAST_NAME, FIRST_NAME;
-- Declare associative array type:
TYPE employees_jobs_type IS TABLE OF employees_jobs_cursor%ROWTYPE
INDEX BY PLS_INTEGER;
-- Declare associative array:
employees_jobs employees_jobs_type;
-- Use same procedure to declare another associative array:
CURSOR jobs_cursor IS
SELECT JOB_ID, JOB_TITLE
FROM JOBS;
TYPE jobs_type IS TABLE OF jobs_cursor%ROWTYPE
INDEX BY PLS_INTEGER;
jobs_ jobs_type;
-- Declare associative array without using cursor:
TYPE job_titles_type IS TABLE OF JOBS.JOB_TITLE%TYPE
INDEX BY JOBS.JOB_ID%TYPE; -- jobs.job_id%type is varchar2(10)
job_titles job_titles_type;
BEGIN
NULL;
END;
/
참조:
-
"커서 정보"
-
연관 배열 선언 구문의 경우 Oracle Database PL/SQL Language Reference
연관 배열 채우기
밀집 연관 배열을 채우는 가장 효율적인 방법은 대개 SELECT 문에 BULK COLLECT INTO 절을 사용하는 것입니다.
주: 밀집 연관 배열이 너무 커서 SELECT 문이 너무 커서 결과 집합을 너무 커서 메모리에 맞지 않는 경우 SELECT 문을 사용하지 마십시오. 대신 커서로 배열을 채우고 FETCH 문을 BULK COLLECT INTO 및 LIMIT 절로 채우십시오. BULK COLLECT INTO 절에 FETCH 문을 사용하는 방법에 대한 자세한 내용은 Oracle Database PL/SQL Language Reference를 참조하십시오.
SELECT 문을 사용하여 희소 연관 배열을 채울 수 없습니다(예: "연관 배열 선언"의 job_titles). 대신 루프 문 안에 지정 문을 사용해야 합니다. 루프 문에 대한 자세한 내용은 "프로그램 흐름 제어"를 참조하십시오. 예제 5-10에서는 SELECT 문을 사용하여 정수로 인덱스화된 연관 배열 employees_jobs 및 jobs_를 채웁니다. 그런 다음 FOR LOOP 문 안에 지정 문을 사용하여 문자열로 인덱스화된 연관 배열 job_titles을 채웁니다.
예제 5-10 연관 배열 채우기
-- Declarative part from Example 5-9 goes here.
BEGIN
-- Populate associative arrays indexed by integer:
SELECT FIRST_NAME, LAST_NAME, JOB_ID BULK COLLECT INTO employees_jobs
FROM EMPLOYEES ORDER BY JOB_ID, LAST_NAME, FIRST_NAME;
SELECT JOB_ID, JOB_TITLE BULK COLLECT INTO jobs_ FROM JOBS;
-- Populate associative array indexed by string:
FOR i IN 1..jobs_.COUNT() LOOP
job_titles(jobs_(i).job_id) := jobs_(i).job_title;
END LOOP;
END;
/
참조: "커서 정보"
조밀한 연관 배열 이동
정수로 인덱스화되는 조밀한 연관 배열에는 요소 간에 간격이 없습니다. 첫번째 요소과 마지막 요소 사이의 모든 요소가 정의되고 값이 포함됩니다(NULL일 수 있음).
Example 5-11과 같이 FOR LOOP 문을 사용하여 밀집 배열을 순회할 수 있습니다.
연관 배열 채우기의 실행 부분에서 employees_jobs 배열을 채우는 코드 뒤에 삽입할 경우 예 5-11의 FOR LOOP 문에서는 employees_jobs 배열의 요소를 저장된 순서대로 인쇄합니다. 저장 순서는 employees_jobs을 선언하는 데 사용된 employees_jobs_cursor 선언의 ORDER BY 절에서 결정되었습니다(예제 5-9 참조).
FOR LOOP 문 employees_jobs.COUNT의 상한은 배열에 있는 요소 수를 반환하는 수집 메소드를 호출합니다. COUNT에 대한 자세한 내용은 Oracle Database PL/SQL Language Reference를 참고하세요.
예제 5-11 조밀한 연관 배열 이동
-- Code that populates employees_jobs must precede this code:
FOR i IN 1..employees_jobs.COUNT LOOP
DBMS_OUTPUT.PUT_LINE(
RPAD(employees_jobs(i).first_name, 23) ||
RPAD(employees_jobs(i).last_name, 28) || employees_jobs(i).job_id);
END LOOP;
결과:
William Gietz AC_ACCOUNT
Shelley Higgins AC_MGR
Jennifer Whalen AD_ASST
Steven King AD_PRES
Lex De Haan AD_VP
Neena Kochhar AD_VP
John Chen FI_ACCOUNT
...
Jose Manuel Urman FI_ACCOUNT
Nancy Greenberg FI_MGR
Susan Mavris HR_REP
David Austin IT_PROG
...
Valli Pataballa IT_PROG
Michael Hartstein MK_MAN
Pat Fay MK_REP
Hermann Baer PR_REP
Shelli Baida PU_CLERK
...
Sigal Tobias PU_CLERK
Den Raphaely PU_MAN
Gerald Cambrault SA_MAN
...
Eleni Zlotkey SA_MAN
Ellen Abel SA_REP
...
Clara Vishney SA_REP
Sarah Bell SH_CLERK
...
Peter Vargas ST_CLERK
Adam Fripp ST_MAN
...
Matthew Weiss ST_MAN
희소한 연관 배열 이동
희소 연관 배열(문자열로 인덱스화)에는 요소 간에 간격이 있을 수 있습니다.
Example 5-12와 같이 WHILE LOOP 문을 사용하여 순회할 수 있습니다.
job_titles 배열의 요소를 인쇄하는 Example 5-12의 코드를 실행하려면 다음 단계를 완료하십시오.
-
예제 5-9에 있는 선언 부분 끝에 변수 선언을 삽입합니다.
i jobs.job_id%TYPE; -
In the executable part of Example 5-10, after the code that populates the job_titles array, insert the code from Example 5-12.
예제 5-12 희소 연관 배열 이동
/* Declare this variable in declarative part:
i jobs.job_id%TYPE;
Add this code to the executable part,
after code that populates job_titles:
*/
i := job_titles.FIRST;
WHILE i IS NOT NULL LOOP
DBMS_OUTPUT.PUT_LINE(RPAD(i, 12) || job_titles(i));
i := job_titles.NEXT(i);
END LOOP;
결과:
AC_ACCOUNT Public Accountant
AC_MGR Accounting Manager
AD_ASST Administration Assistant
AD_PRES President
AD_VP Administration Vice President
FI_ACCOUNT Accountant
FI_MGR Finance Manager
HR_REP Human Resources Representative
IT_PROG Programmer
MK_MAN Marketing Manager
MK_REP Marketing Representative
PR_REP Public Relations Representative
PU_CLERK Purchasing Clerk
PU_MAN Purchasing Manager
SA_MAN Sales Manager
SA_REP Sales Representative
SH_CLERK Shipping Clerk
ST_CLERK Stock Clerk
ST_MAN Stock Manager
예제 5-12에는 두 개의 수집 메소드 호출인 job_titles.FIRST 및 job_titles.NEXT(i)가 포함되어 있습니다. job_titles.FIRST는 job_titles의 첫번째 요소를 반환하고, job_titles.NEXT(i)는 i에 연속하는 아래 첨자를 반환합니다. FIRST에 대한 자세한 내용은 Oracle Database PL/SQL Language Reference를 참고하세요. NEXT에 대한 자세한 내용은 Oracle Database PL/SQL Language Reference를 참고하세요.