728x90
반응형
- 일반 컬렉션자료형은 돌일한 자료형으로만 데이터를 가질 수 있기 때문에 자료형이 다른 타입의 중첩테이블 형식을 만드려면 레코드유형으로 자료형을 갖는 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;
728x90
반응형
'[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 |