반응형
- 일반 컬렉션자료형은 돌일한 자료형으로만 데이터를 가질 수 있기 때문에
자료형이 다른 타입의 중첩테이블 형식을 만드려면 레코드유형으로 자료형을 갖는 OBJECT자료형으로 먼저 만들어주어야 한다.
TYPE생성시에는 제약조건을 넣을 수 없다.
반드시 마지막에 / 기호를 넣어주어야 한다. 안 넣을 경우 에러
유형 변경 시 반드시 하위 유형이 제거된 후에 변경해야 함
 
[상위]
OBJECT자료형을 갖는 사용자 자료형 만들기, 자료형명 : DEPT_TYPE (리턴타입)
CREATE OR REPLACE
TYPE DEPT_TYPE AS OBJECT (
    DEPTNO NUMBER(2),
    DNAME VARCHAR2(14),
    LOC VARCHAR2(13)
);
--레퍼런스 타입형으로 자료형입력불가, 기본형으로만
ex) DEPTNO DEPT.DEPTNO%ROW  (x)
[하위]
TABLE TYPE객체
- 함수에서 반환가능한 테이블 타입으로 오브젝트 자료형 재정의

CREATE OR REPLACE
TYPE DEPT_TABLE 
AS TABLE OF DEPT_TYPE;
 
DROP TYPE DEPT_TYPE ;  
   
AA
CREATE OR REPLACE TYPE DEPT_TYPE AS OBJECT (
    DEPTNO NUMBER(2),
    DNAME VARCHAR2(14),
    LOC VARCHAR2(13)
);​
CREATE OR REPLACE TYPE DEPT_TABLE AS TABLE OF DEPT_TYPE;
---함수선언
CREATE OR REPLACE FUNCTION GET_DEPT_FN(P_DEPT_NO IN NUMBER)
RETURN DEPT_TABLE
IS V_RSLT DEPT_TABLE;
BEGIN
    --BULK COLLECT INTO SELECT절에 있는 컬럼을 COLLECT(ROWTYPE의 배열형태
    --테이블 유형의 자료형) 유형으로 담아주는 기능을 한다.
    SELECT DEPT_TYPE(DEPTNO, DNAME, LOC) BULK COLLECT INTO V_RSLT FROM DEPT
    WHERE DEPTNO >=P_DEPT_NO;
    
    RETURN V_RSLT;
END GET_DEPT_FN;
--익명함수에서 호출
SET SERVEROUT ON

DECLARE
    VDEPT DEPT_TYPE;
    CURSOR C2 IS SELECT * FROM TABLE (GET_DEPT_FN(20));
BEGIN
    FOR VDEPT IN C2 LOOP
    -- EXIT WHEN C2%NOTFOUND; --FOR~IN으로 범위지정 되있기에 기술 안 해도 됨
    DBMS_OUTPUT.PUT_LINE(VDEPT.DEPTNO||','||VDEPT.DNAME||','||VDEPT.LOC);
    END LOOP;
END;

 

ㅁㅁ
CREATE OR REPLACE TYPE ED_TYPE AS OBJECT (
    DEPTNO NUMBER(2),
    DNAME VARCHAR2(14),
    LOC VARCHAR2(13),
    EMPNO NUMBER(4),
    ENAME VARCHAR2(10)
);​
CREATE OR REPLACE TYPE ED_TABLE AS TABLE OF ED_TYPE;​
CREATE OR REPLACE FUNCTION GET_ED_FN(P_DEPT_NO IN NUMBER) --IN 디폴트값으로 생략가능
RETURN ED_TABLE
IS V_RSLT ED_TABLE; --DECLARE(생략가능)선언부와 유사/ IS는 필히 기술해야함 
BEGIN
    --BULK COLLECT INTO SELECT절에 있는 컬럼을 COLLECT(ROWTYPE의 배열형태
    --테이블 유형의 자료형) 유형으로 담아주는 기능을 한다.
    SELECT ED_TYPE(A.DEPTNO, A.DNAME, A.LOC, B.EMPNO, B.ENAME)
    BULK COLLECT INTO V_RSLT  --BULK 여러줄 표구조로.
    FROM DEPT A, EMP B 
    WHERE A.DEPTNO = B.DEPTNO AND A.DEPTNO =P_DEPT_NO;
    
    RETURN V_RSLT;
END GET_ED_FN;
SELECT * FROM TABLE(GET_ED_FN(10)) WHERE EMPNO = 7782;​
DECLARE 
    CURSOR C_ED IS SELECT * FROM TABLE (GET_ED_FN(10));
BEGIN
    FOR C_RCD IN C_ED LOOP
        DBMS_OUTPUT.PUT_LINE(C_RCD.EMPNO||','||C_RCD.ENAME||','||C_RCD.DEPTNO);
    END LOOP;
END;​

 

반응형

'[ORACLE]' 카테고리의 다른 글

[ORACLE] RETURN  (0) 2024.01.29
[ORACLE] PROCEDURE  (0) 2024.01.26
[ORACLE] FUNCTION  (0) 2024.01.26
[ORACLE] PL/SQL - NDS  (1) 2024.01.25
[ORACLE] PL/SQL - CURSOR  (0) 2024.01.25

+ Recent posts