더북(TheBook)

② VARRY

VARRAYVariable-Size Array 는 가변 길이 배열로서 연관 배열과는 달리 그 크기에 제한이 있다. 즉 선언할 때 크기(요소 개수)를 지정하면 이보다 큰 수로 요소를 만들 수 없다. VARRAY도 “변수명(인덱스)” 형태로 해당 요소 값에 접근할 수 있는데, 연관 배열은 인덱스로 문자형이나 PLS_INTEGER 값을 사용할 수 있지만 VARRAY의 인덱스는 숫자만 가능하다. 더 정확히 말하면 사용자가 별도로 인덱스 타입을 지정하는 것이 아니라 자동으로 순번이 매겨지며 최솟값은 1이다. 그럼 VARRAY의 선언 구문을 살펴 보자.

    TYPE VARRAY명 IS VARRAY(최대 크기) OF 요소값_타입;

연관 배열과 비교해 구문이 약간 다른데, 명칭과 최대 크기, 배열을 이루는 요소의 데이터 타입을 지정한다. 예를 들어, 최대 크기를 10이라고 지정하면 해당 VARRAY는 10개의 요소로 구성되며 각 요소 값은 ‘VARRAY_변수명(1)’ 부터 ‘VARRAY_변수명(10)’형태로 값을 할당하거나 읽어올 수 있다.

주의할 점은 VARRAY는 생성자를 사용해 초기화하기 전까지는 각 요소에 값을 할당하거나 읽어 올 수 없다. 만약 초기화 없이 값을 할당하거나 참조할 때는 오류가 발생한다. 생성자는 “VARRAY명(값1, 값2, …)” 형태로 사용하는데, 선언했던 크기보다 같거나 작게 값을 할당한다. 만약 전체 크기가 5인데 4개의 요소만 초기화했을 경우, 다섯 번째 요소는 참조할 수 없다. 하지만 NULL 값으로라도 초기화했다면 해당 요소는 참조가 가능하다. 그럼 VARRAY를 사용한 간단한 예제를 살펴 보자.

입력

    DECLARE
      -- 5개의 문자형 값(크기는 5)으로 이루어진 VARRAY 선언
      TYPE va_type IS VARRAY(5) OF VARCHAR2(20);

      -- VARRY 변수 선언
      vva_test va_type;

      vn_cnt NUMBER := 0;
    BEGIN
      -- 생성자를 사용해 값 할당 (총 5개지만 최초 3개만 값 할당)
      vva_test := va_type('FIRST', 'SECOND', 'THIRD', '', '');

      LOOP
        vn_cnt := vn_cnt + 1;
        -- 크기가 5이므로 5회 루프를 돌면서 각 요소 값 출력
         IF vn_cnt > 5 THEN
          EXIT;
        END IF;

      -- VARRY 요소 값 출력
        DBMS_OUTPUT.PUT_LINE(vva_test(vn_cnt));

      END LOOP;

      -- 값 변경
      vva_test(2) := 'TEST';
      vva_test(4) := 'FOURTH';

      -- 다시 루프를 돌려 값 출력
      vn_cnt := 0;
      LOOP
        vn_cnt := vn_cnt + 1;
        -- 크기가 5이므로 루프를 5회 돌면서 각 요소 값 출력
        IF vn_cnt > 5 THEN
          EXIT;
        END IF;

        -- VARRY 요소 값 출력
        DBMS_OUTPUT.PUT_LINE(vva_test(vn_cnt));

      END LOOP;
    END;

결과

    FIRST
    SECOND
    THIRD

    FIRST
    TEST
    THIRD
    FOURTH

소스를 보면 알겠지만 크기가 5인 VARRAY를 선언한 뒤 처음에는 생성자를 사용해 3개의 요소에만 값을 할당했다. 이 경우 4, 5번째 요소의 값은 NULL이 된다. 초기화한 뒤에는 2번째 요소는 수정, 4번째 요소에 값을 다시 할당한 뒤 출력했다. 이처럼 VARRAY는 각 요소에 값을 채워 사용할 수 있는데, 참조 시 인덱스 값은 최대 크기를 넘어설 수 없으며, 요소 중간중간의 값이 비어 있을 수도 있다(요소 중간의 값이 비어 있다고 해서 그 요소가 존재하지 않는 것은 아니다). 연관 배열은 전화번호부처럼 키(인덱스) 값을 통해 요소 값에 접근했지만 VARRAY는 인덱스가 순번 형태이므로 연속적인 값을 저장해야 할 때 많이 사용된다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.