본문 바로가기

Database

[ SQL ] 사용자정의타입

사용자정의타입 생성

 

CRATE TYPE 타입명 IS VARRAY(크기) OF 데이터 타입;

 

 

 

예제 1 (VARRAY)

 

CREATE TYPE TEST_VARRAY IS VARRAY(3) OF NUMBER;

길이가 3이고 데이터 유형이 숫자인 배열생성

 

create or replace NONEDITIONABLE PROCEDURE PROC_TYPE_TEST_1 AS 

    V_ARY           TEST_VARRAY;
    V_NUM           NUMBER;

BEGIN
  
  V_ARY := TEST_VARRAY(0,0,0);
    
    V_ARY(1) := 4;
    V_ARY(2) := 11;
    V_ARY(3) := 55;
    
    V_NUM := V_ARY(1) + V_ARY(2) + V_ARY(3);
    
    DBMS_OUTPUT.PUT_LINE(V_NUM);
    
END PROC_TYPE_TEST_1;

전제 배열의 합을 구하는 프로시져, 4 + 11 + 55 = 70 출력

 

예제 2 (COLLECTION)

 

CREATE TYPE TEST_TABLE IS TABLE OF VARCHAR2(20);

데이터 타입 VARCHAR2 테이블 생성, 갯수 제한없이 사용 가능

 

CREATE OR REPLACE PROCEDURE PROC_TYPE_TEST_2 AS 

    V_TABLE         TEST_TABLE;
    V_NAME          VARCHAR2(100);

BEGIN
  
    V_TABLE := TEST_TABLE('가나다', '마바사', '아자차');
    V_NAME := V_TABLE(1) || V_TABLE(2) || V_TABLE(3);
    
    DBMS_OUTPUT.PUT_LINE(V_NAME);

END PROC_TYPE_TEST_2;

테이블 내 데이터 붙이는 프로시저, '가나다마바사아자차' 출력

 

 

CREATE TYPE TEST_TBL IS TABLE OF NUMBER;

데이터 타입 NUMBER 테이블 생성, 갯수 제한없이 사용 가능

 

DECLARE

    V_TABEL     TEST_TBL;
    V_NUM       NUMBER(5);

BEGIN

    V_TABEL := TEST_TBL(3,4,5,6,7,8);
    
    V_NUM := V_TABEL(1) + V_TABEL(2) + V_TABEL(3) + V_TABEL(4) + V_TABEL(5) + V_TABEL(6);
    
    DBMS_OUTPUT.PUT_LINE(V_NUM);

END
;

테이블 내 데이터 덧샘 프로시저, 33 출력

 

 

예제 3 (OBJECT)

 

CREATE TYPE TEST_OBJ AS OBJECT
(
    C_ID        CHAR(6),
    C_POINT     NUMBER(10)
);

객체 생성 

 

CREATE OR REPLACE PROCEDURE PROC_TYPE_TEST_3 AS 

    V_OBJ           TEST_OBJ;

BEGIN
    
    V_OBJ := TEST_OBJ('O0001', 10000);
    
    DBMS_OUTPUT.PUT_LINE(V_OBJ.O_ID || '+' || V_OBJ.O_POINT);
    
END PROC_TYPE_TEST_3;

객체 내 데이터 붙이는 프로시저, O0001 +10000 출력

 

V_OBJ TEST_OBJ;​

패키지 HEAD 내에서 유형 선언 시 패키지 내에서 JS 의 전역변수와 같이 사용 가능

TYPE TEST_TBL IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;

패키지 HEAD 내 유형 선언 시 패키지 내에서 또 한 번 선언하지 않고도 바로 사용 가능



예제 4

 

CREATE TABLE CUSTOMER_TBL
(
    C_ID        CHAR(6),
    C_NAME      VARCHAR(30),
    C_BIRTH     DATE
);​

 

PROCEDURE TEST
  AS
  
    RTYPE  CUSTOMER_TBL%ROWTYPE; -- TBL 의 로우한줄한줄
    V_C_ID CUSTOMER_TBL.C_ID%TYPE; -- TBL 의 컬럼 한개
    
  BEGIN
  
    SELECT C_ID, C_NAME, C_BIRTH 
    INTO RTYPE.C_ID, RTYPE.C_NAME, RTYPE.C_BIRTH
    FROM CUSTOMER_TBL
    ;
  
  END TEST;​

 

↓ 상단 쿼리 중요 부분

 

RTYPE  CUSTOMER_TBL%ROWTYPE; -- TBL 의 로우한줄한줄
V_C_ID CUSTOMER_TBL.C_ID%TYPE; -- TBL 의 컬럼 한개

 

변수를 프로시저 내에서 컬럼한개한개를 사용하고 싶거나 로우 한줄한줄 전체를 사용하고 싶을 때 상단의 쿼리와 같이 사용할 수 있다.

 

'Database' 카테고리의 다른 글

[ JAVA ] 추상화(abstract) - 공통된 특성  (0) 2021.05.27
[ SQL ] 숫자 타입 별 작업 속도 차이  (0) 2021.05.14
[ SQL ] SCHEDULER (스케줄러)  (0) 2021.05.13
[ SQL ] 반복문  (0) 2021.05.12
[ SQL ] ORACLE INDEX  (0) 2021.05.12