** 오라클 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;
'Database > oracle' 카테고리의 다른 글
[oracle] 오라클 table Function , Pipelined Table Function (0) | 2023.04.17 |
---|---|
[oralce] 프로젝트 운영시 쓰는 SQL 기본운영사항 (0) | 2023.04.17 |
[oracle] 오라클 스케줄 작업 (0) | 2023.04.17 |
[oracle] PL_SQL 기본틀, 반복 FOR ..IN LOOP 기본 (0) | 2023.04.17 |
[oracle] 적금 월복리 (0) | 2023.04.17 |