본문 바로가기
Database/oracle

[oracle] 오라클 varray, nestedtable, 연관배열

by 평범한kiki 2023. 4. 17.

** 오라클 varray, nestedtable, 연관배열 ******

각 형태는 변수선언 -> 타입선언후에 변수선언을 통해 사용가능하다


1. 가변길이 배열(variable-size array)
    -TYPE   TY_VARRAY IS VARRAY(3) OF VARCHAR(10);
    -선언시 배열의 크기를 명시할것
2. 중첩테이블(Nested Table)
    - TYPE   TY_NESTED_TABLE IS TABLE OF VARCHAR2(10) 
   - 크기에 제한 없음, 숫자형인덱스만 사용가능
3. 연관배열(Associative array(index-by table)
    -TYPE   TY_ASSOCI_ARR_VAR IS TABLE OF VARCHAR2(30) INDEX  BY VARCHAR2(20)  
   - 키와 쌍으로 구성된 컬렉션, hashmap 개념

** 활용 1]  중복제거

DECLARE
  /*타입선언*/
  TYPE   TY_VARRAY IS VARRAY(3) OF VARCHAR(10);  --가변길이 배열
  --중첩테이블
  TYPE   TY_NESTED_TABLE IS TABLE OF VARCHAR2(10);
  TYPE   TY_NESTED_NUM_TABLE IS TABLE OF NUMBER;  
  --연관배열
  TYPE   TY_ASSOCI_ARR_VAR IS TABLE OF VARCHAR2(30) INDEX  BY VARCHAR2(20);
  TYPE   TY_ASSOCI_ARR_NUM IS TABLE OF NUMBER INDEX  BY PLS_INTEGER;
  TYPE   TY_ASSOCI_ARR_MIX IS TABLE OF VARCHAR2(30) INDEX  BY PLS_INTEGER;

  /*변수선언: 타입선언후에 변수선언을 통해 사용가능하다*/
  VARRAY1  TY_VARRAY;
  NESTED1 TY_NESTED_TABLE;
  ASSOCI_VAR  TY_ASSOCI_ARR_VAR;
  ASSOCI_NUM  TY_ASSOCI_ARR_NUM;
  ASSOCI_MIX  TY_ASSOCI_ARR_MIX;

  V_STR VARCHAR2(100):= '';

BEGIN
  /*변수할당*/
  VARRAY1 := TY_VARRAY('T1', 'T2'); 
  NESTED1 := TY_NESTED_TABLE('한글','영어','일어' , '한글','영어','일어');
  ASSOCI_NUM(0) := 2022;
  ASSOCI_NUM(1) := 2023; 
  ASSOCI_MIX(0):= '문자';
  ASSOCI_VAR('D') := 'kakao';

  --print
  dbms_output.put_line(VARRAY1(1)); --varray는 1부터 시작
  dbms_output.put_line(NESTED1(1));

  --중복제거
  FOR i IN NESTED1.FIRST..NESTED1.LAST
  LOOP
    dbms_output.put_line(INSTR(V_STR, NESTED1(i)));
    IF NVL(INSTR(V_STR, NESTED1(i)), 0) < 1 THEN
       V_STR := V_STR ||NESTED1(i)||','; 
    END IF;
  END LOOP;
  
  V_STR := SUBSTR(V_STR, 1 , LENGTH(V_STR)-1);
  dbms_output.put_line('V_STR :: '||V_STR);

EXCEPTION WHEN OTHER THEN
  dbms_output.put_line('V_STR :: '||SQLCODE||'-'||SQLERRM);
END;



--활용 2] 배열활용해서 map 만들기

DECLARE
  /*타입선언*/  
  --연관배열
  TYPE   TY_ASSOCI_ARR_VAR IS TABLE OF VARCHAR2(30) INDEX  BY VARCHAR2(20);
  /*변수선언*/
  ASSOCI_VAR  TY_ASSOCI_ARR_VAR;
  
  //테스트 데이터
  I_DATA VARCHAR2(2000):= 'NAME:test,ADD:seoul,PHONE:010888555';
  V_STR VARCHAR2(2000):= I_DATA||',';
  //사용할 변수선언
  V_KEY NUMBER;
  V_VAL NUMBER;
BEGIN
  /*변수할당*/
    LOOP
      EXIT WHEN V_STR IS NULL;
      V_KEY:=INSTR(V_STR, ':' );
      V_VAL:=INSTR(V_STR, ',' );
      ASSOCI_VAR(SUBSTR(V_STR, 1, V_KEY-1)) := SUBSTR(V_STR, V_KEY+1, V_VAL-V_KEY-1);
      V_STR :=  SUBSTR(V_STR, V_VAL+1);  --값다음부터 끝까지 자름
     dbms_output.put_line(V_STR);
    END LOOP;

    BEGIN
        IF  ASSOCI_VAR('NAME') IS NOT NULL THEN 
           dbms_output.put_line(ASSOCI_VAR('NAME')); 
        END IF;
    EXCEPTION WHEN OTHER THEN 
       ASSOCI_VAR('NAME') := 'TEST';
      dbms_output.put_line(ASSOCI_VAR('NAME'));
    END;

EXCEPTION WHEN OTHER THEN
  dbms_output.put_line('V_STR :: '||SQLCODE||'-'||SQLERRM);
END;