더북(TheBook)

④ 테이블 컬럼 타입으로 VARRAY 사용하기

사용자 정의 타입으로 VARRAY를 만들어 테이블의 컬럼 타입으로 사용해 보자. 전 세계 대륙에 있는 국가명을 담을 테이블을 만들어 볼 텐데, 한 대륙에는 여러 국가가 있으므로 국가 이름 컬럼을 VARRAY 타입으로 생성할 것이다. 먼저 사용자 정의 타입을 만들어 보자.

입력

    -- 국가 이름을 가지고 있는 VARRAY 타입 생성.
    CREATE OR REPLACE TYPE country_var IS VARRAY(7) OF VARCHAR2(30);

    -- 대륙별 국가 리스트를 담을 테이블 생성
    CREATE TABLE ch11_continent (
             continent   VARCHAR2(50),   -- 대륙명
             country_nm  country_var     -- 국가명을 넣을 VARRAY 타입 컬럼
                );

결과

    TYPE COUNTRY_VAR이(가) 컴파일되었습니다.
    table CH11_CONTINENT이(가) 생성되었습니다.

이제 대륙별 국가 명칭을 입력해 보자.

입력

    DECLARE

    BEGIN
      -- 생성자를 사용해 국가명을 입력한다.
      INSERT INTO ch11_continent
      VALUES('아시아', country_var('한국','중국','일본'));

      INSERT INTO ch11_continent
      VALUES('북아메리카', country_var('미국','캐나다','멕시코'));

      INSERT INTO ch11_continent
      VALUES('유럽', country_var('영국','프랑스','독일', '스위스'));

      COMMIT;

    END;

결과

    익명 블록이 완료되었습니다.

ch11_continent 테이블에 유럽에 있는 4개의 국가를 입력했다. 이제 country_var 타입 변수를 생성해 유럽의 다른 국가를 집어 넣은 뒤, 위에서 입력한 국가를 통째로 변경해 보자.

입력

    DECLARE
      -- 새로운 국가 세팅
      new_country country_var := country_var('이태리', '스페인', '네델란드', '체코', '포르투칼');

      country_list country_var;
    BEGIN
      -- 새로운 국가로 update
      UPDATE ch11_continent
         SET country_nm = new_country
       WHERE continent = '유럽';

      COMMIT;

      -- UPDATE 됐는지 확인을 위해 국가명 컬럼을 VARRAY 변수에 받아 옴
      SELECT country_nm
        INTO country_list
        FROM ch11_continent
       WHERE continent = '유럽';

      -- 루프를 돌며 국가를 출력
      FOR i IN country_list.FIRST .. country_list.LAST
      LOOP
        DBMS_OUTPUT.PUT_LINE('유럽국가명 = ' || country_list(i));
      END LOOP;
    END;

결과

    유럽국가명 = 이탈리아
    유럽국가명 = 스페인
    유럽국가명 = 네델란드
    유럽국가명 = 체코
    유럽국가명 = 포르투칼

기존에 유럽에는 영국, 프랑스 등 4개국이 있었는데, 새로운 국가를 new_country란 VARRAY 변수에 할당한 뒤 UPDATE문을 통해 ch11_continent 테이블의 국가명(country_nm) 컬럼을 갱신했다. 국가명 컬럼 자체가 컬렉션 타입이므로 유럽의 경우 애초에는 4개 국가가 있었지만 UPDATE문을 수행한 뒤에는 신규 5개 국가명으로 갱신되었다.

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