연관 배열 사용

연관 배열은 모음 유형입니다.

참조:

모음에 대한 자세한 내용은 다음을 참조하십시오.

모음 정보

모음은 같은 유형의 요소를 지정된 순서로 저장하는 PL/SQL 조합 변수로, 1차원 배열과 유사합니다. 모음의 내부 구성 요소를 요소라고 합니다. 각 요소에는 모음에서 요소의 위치를 식별하는 고유한 아래 첨자가 있습니다.

모음 요소에 액세스하려면 아래 첨자 표기법 (collection_name(element_subscript))을 사용합니다.

모음 요소를 스칼라 변수처럼 처리할 수 있습니다. 또한 전체 모음을 서브 프로그램 매개변수로 전달할 수도 있습니다(전송 또는 수신 서브 프로그램이 독립형 서브 프로그램이 아닌 경우).

모음 방식은 모음에 대한 정보를 반환하거나 모음에 대해 작동하는 내장 PL/SQL 하위 프로그램입니다. 모음 방식을 호출하려면 collection_name.method_name의 점 표기법을 사용합니다. 예를 들어, collection_name.COUNT는 모음에 있는 요소 수를 반환하고,

PL/SQL에는 다음 세 가지 유형의 모음이 있습니다.

이 문서에서는 연관 배열만 설명합니다.

참조:

연관 배열 정보

연관 배열은 제한되지 않은 키-값 쌍 집합입니다. 각 키는 고유하며 해당 값을 보유하는 요소의 아래 첨자로 사용됩니다. 따라서 배열에서 요소의 위치를 몰라도 배열을 순회하지 않고 요소에 액세스할 수 있습니다.

키의 데이터 유형은 PLS_INTEGER 또는 VARCHAR2(길이)일 수 있습니다.

키의 데이터 유형이 PLS_INTEGER이며, 연관 배열이 정수로 인덱스화된되고 조밀(즉, 요소 간에 간격이 없음)이면 첫번째와 마지막 요소 사이의 모든 요소가 정의되고 값(NULL일 수 있음)을 가집니다.

키 유형이 VARCHAR2(길이)이면 연관 배열은 문자열로 색인화되고 희박합니다. 즉, 요소 간에 간격이 있을 수 있습니다.

조밀한 연관 배열을 순회할 때는 요소 간의 간격에 대해 신경 쓸 필요가 없으며 희박한 연관 배열을 순회할 때는 그 간격에 대해 알아야 한다.

연관 배열 요소에 값을 지정하려면 지정 연산자를 사용합니다.

array_name(key) := value

키가 배열에 없으면 지정 명령문은 키-값 쌍을 배열에 추가합니다. 그렇지 않으면 명령문에서는 array_name(key)의 값을 값으로 변경합니다.

연관 배열은 데이터를 임시로 저장하는 데 사용할 수 있습니다. 테이블과 달리 디스크 공간이나 네트워크 작업을 사용하지 않습니다. 그러나 연관 배열은 임시 저장용이므로 DML 문을 사용하여 조작할 수 없습니다.

패키지에서 연관 배열을 선언하고 Package Body의 변수에 값을 지정하면 연관 배열은 데이터베이스 세션 수명 기간 동안 유지 됩니다. 그렇지 않으면 연관 배열을 선언한 하위 프로그램의 수명 주기 동안 유지됩니다.

참조: 연관 배열에 대한 자세한 내용은 Oracle AI Database PL/SQL Language Reference를 참조하십시오.

연관 배열 선언

연관 배열을 선언하려면 연관 배열 유형을 선언한 다음 해당 유형의 변수를 선언합니다.

가장 간단한 구문은 다음과 같습니다.

TYPE array_type IS TABLE OF element_type INDEX BY key_type;

array_name  array_type;

연관 배열을 선언하는 효율적인 방법은 다음 프로시저를 통해 다음 커서를 사용하는 것입니다. 이 프로시저에서는 필요한 각 명령문을 가장 간단한 형식으로 사용하지만 전체 구문에 대한 참조를 제공합니다.

커서를 사용하여 연관 배열을 선언하려면 다음과 같이 하십시오.

  1. 선언 부분에서 다음을 수행합니다.

    1. 커서를 선언합니다.

      CURSOR cursor_name IS query;

      선언된 전체 커서 선언 구문은 Oracle AI Database PL/SQL Language Reference를 참조하십시오.

    2. 연관 배열 유형을 선언합니다.

      TYPE array_type IS TABLE OF cursor_name%ROWTYPE
        INDEX BY { PLS_INTEGER | VARCHAR2 length }

      전체 연관 배열 유형 선언 구문은 Oracle AI Database PL/SQL Language Reference를 참조하십시오.

    3. 해당 유형의 연관 배열 변수를 선언합니다.

      array_name  array_type;

      전체 변수 선언 구문은 Oracle AI 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;
/

참조:

연관 배열 채우기

밀집 연관 배열을 채우는 가장 효율적인 방법은 대개 SELECT 문에 BULK COLLECT INTO 절을 사용하는 것입니다.

주: 밀집 연관 배열이 너무 커서 SELECT 문이 너무 커서 결과 집합을 너무 커서 메모리에 맞지 않는 경우 SELECT 문을 사용하지 마십시오. 대신 커서로 배열을 채우고 FETCH 문을 BULK COLLECT INTO 및 LIMIT 절로 채우십시오. BULK COLLECT INTO 절에 FETCH 문을 사용하는 방법에 대한 자세한 내용은 Oracle AI 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 AI 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의 코드를 실행하려면 다음을 수행합니다.

  1. 예제 5-9에 있는 선언 부분 끝에 변수 선언을 삽입합니다.

    i jobs.job_id%TYPE;
  2. 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 AI Database PL/SQL Language Reference를 참고하세요. NEXT에 대한 자세한 내용은 Oracle AI Database PL/SQL Language Reference를 참고하세요.